Aric Stewart : usp10: Rewrite ScriptStringXtoCP to make use of ScriptXtoCP.

Alexandre Julliard julliard at winehq.org
Mon Mar 28 14:21:57 CDT 2011


Module: wine
Branch: master
Commit: f026616c2295ec05d35c9ae245b6b8fcc9a3e3ea
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=f026616c2295ec05d35c9ae245b6b8fcc9a3e3ea

Author: Aric Stewart <aric at codeweavers.com>
Date:   Fri Mar 18 12:22:42 2011 -0500

usp10: Rewrite ScriptStringXtoCP to make use of ScriptXtoCP.

---

 dlls/usp10/usp10.c |   46 ++++++++++++++++++++++++++--------------------
 1 files changed, 26 insertions(+), 20 deletions(-)

diff --git a/dlls/usp10/usp10.c b/dlls/usp10/usp10.c
index 89b7856..e177f33 100644
--- a/dlls/usp10/usp10.c
+++ b/dlls/usp10/usp10.c
@@ -991,14 +991,11 @@ HRESULT WINAPI ScriptStringCPtoX(SCRIPT_STRING_ANALYSIS ssa, int icp, BOOL fTrai
  *      ScriptStringXtoCP (USP10.@)
  *
  */
-HRESULT WINAPI ScriptStringXtoCP(SCRIPT_STRING_ANALYSIS ssa, int iX, int* piCh, int* piTrailing) 
+HRESULT WINAPI ScriptStringXtoCP(SCRIPT_STRING_ANALYSIS ssa, int iX, int* piCh, int* piTrailing)
 {
     StringAnalysis* analysis = ssa;
     int i;
-    int j;
-    int runningX = 0;
     int runningCp = 0;
-    int width;
 
     TRACE("(%p), %d, (%p), (%p)\n", ssa, iX, piCh, piTrailing);
 
@@ -1022,24 +1019,33 @@ HRESULT WINAPI ScriptStringXtoCP(SCRIPT_STRING_ANALYSIS ssa, int iX, int* piCh,
 
     for(i=0; i<analysis->numItems; i++)
     {
-        for(j=0; j<analysis->glyphs[i].numGlyphs; j++)
+        int CP = analysis->pItem[i+1].iCharPos - analysis->pItem[i].iCharPos;
+        /* initialize max extents for uninitialized runs */
+        if (analysis->glyphs[i].iMaxPosX == -1)
         {
-            width = analysis->glyphs[i].piAdvance[j];
-            if(iX < (runningX + width))
-            {
-                *piCh = runningCp;
-                if((iX - runningX) > width/2)
-                    *piTrailing = TRUE;
-                else
-                    *piTrailing = FALSE;
-
-                if (analysis->pItem[i].a.fRTL)
-                    *piTrailing = !*piTrailing;
-                return S_OK;
-            }
-            runningX += width;
-            runningCp++;
+            if (analysis->pItem[i].a.fRTL)
+                ScriptCPtoX(0, FALSE, CP, analysis->glyphs[i].numGlyphs, analysis->glyphs[i].pwLogClust,
+                            analysis->glyphs[i].psva, analysis->glyphs[i].piAdvance,
+                            &analysis->pItem[i].a, &analysis->glyphs[i].iMaxPosX);
+            else
+                ScriptCPtoX(CP, TRUE, CP, analysis->glyphs[i].numGlyphs, analysis->glyphs[i].pwLogClust,
+                            analysis->glyphs[i].psva, analysis->glyphs[i].piAdvance,
+                            &analysis->pItem[i].a, &analysis->glyphs[i].iMaxPosX);
         }
+
+        if (iX > analysis->glyphs[i].iMaxPosX)
+        {
+            iX -= analysis->glyphs[i].iMaxPosX;
+            runningCp += CP;
+            continue;
+        }
+
+        ScriptXtoCP(iX, CP, analysis->glyphs[i].numGlyphs, analysis->glyphs[i].pwLogClust,
+                    analysis->glyphs[i].psva, analysis->glyphs[i].piAdvance,
+                    &analysis->pItem[i].a, piCh, piTrailing);
+        *piCh += runningCp;
+
+        return S_OK;
     }
 
     /* out of range */




More information about the wine-cvs mailing list