Aric Stewart : usp10: Handle the fNeedsCaretInfo flag in XtoCP and CPtoX.

Alexandre Julliard julliard at winehq.org
Mon Oct 17 13:08:55 CDT 2011


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

Author: Aric Stewart <aric at codeweavers.com>
Date:   Mon Oct 17 07:41:16 2011 -0500

usp10: Handle the fNeedsCaretInfo flag in XtoCP and CPtoX.

---

 dlls/usp10/usp10.c |   54 ++++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 50 insertions(+), 4 deletions(-)

diff --git a/dlls/usp10/usp10.c b/dlls/usp10/usp10.c
index 65d42e4..3f323b2 100644
--- a/dlls/usp10/usp10.c
+++ b/dlls/usp10/usp10.c
@@ -1697,12 +1697,30 @@ HRESULT WINAPI ScriptCPtoX(int iCP,
                 iPosX += special_size;
             }
             else
-                iPosX += piAdvance[clust] / (float)clust_size;
+            {
+                if (scriptInformation[psa->eScript].props.fNeedsCaretInfo)
+                {
+                    clust_size --;
+                    if (clust_size == 0)
+                        iPosX += piAdvance[clust];
+                }
+                else
+                    iPosX += piAdvance[clust] / (float)clust_size;
+            }
         }
         else if (iSpecial != -1)
             iPosX += special_size;
         else /* (iCluster != -1) */
-            iPosX += piAdvance[pwLogClust[iCluster]] / (float)clust_size;
+        {
+            if (scriptInformation[psa->eScript].props.fNeedsCaretInfo)
+            {
+                clust_size --;
+                if (clust_size == 0)
+                    iPosX += piAdvance[pwLogClust[iCluster]];
+            }
+            else
+                iPosX += piAdvance[pwLogClust[iCluster]] / (float)clust_size;
+        }
     }
 
     if (iMaxPos > 0)
@@ -1737,6 +1755,7 @@ HRESULT WINAPI ScriptXtoCP(int iX,
     int iSpecial = -1;
     int iCluster = -1;
     int clust_size = 1;
+    int cjump = 0;
     float special_size = 0.0;
     int direction = 1;
 
@@ -1795,6 +1814,7 @@ HRESULT WINAPI ScriptXtoCP(int iX,
 
             clust_size = 1;
             iCluster = -1;
+            cjump = 0;
 
             for (check = item+direction; check < cChars && check >= 0; check+=direction)
             {
@@ -1816,12 +1836,30 @@ HRESULT WINAPI ScriptXtoCP(int iX,
                 iPosX += special_size;
             }
             else
-                iPosX += piAdvance[clust] / (float)clust_size;
+            {
+                if (scriptInformation[psa->eScript].props.fNeedsCaretInfo)
+                {
+                    if (!cjump)
+                        iPosX += piAdvance[clust];
+                    cjump++;
+                }
+                else
+                    iPosX += piAdvance[clust] / (float)clust_size;
+            }
         }
         else if (iSpecial != -1)
             iPosX += special_size;
         else /* (iCluster != -1) */
-            iPosX += piAdvance[pwLogClust[iCluster]] / (float)clust_size;
+        {
+            if (scriptInformation[psa->eScript].props.fNeedsCaretInfo)
+            {
+                if (!cjump)
+                    iPosX += piAdvance[pwLogClust[iCluster]];
+                cjump++;
+            }
+            else
+                iPosX += piAdvance[pwLogClust[iCluster]] / (float)clust_size;
+        }
     }
 
     if (direction > 0)
@@ -1829,7 +1867,11 @@ HRESULT WINAPI ScriptXtoCP(int iX,
         if (iPosX > iX)
             item--;
         if (item < cChars && ((iPosX - iLastPosX) / 2.0) + iX >= iPosX)
+        {
+            if (scriptInformation[psa->eScript].props.fNeedsCaretInfo && clust_size > 1)
+                item+=(clust_size-1);
             *piTrailing = 1;
+        }
         else
             *piTrailing = 0;
     }
@@ -1843,7 +1885,11 @@ HRESULT WINAPI ScriptXtoCP(int iX,
         if (iLastPosX == iX)
             *piTrailing = 0;
         else if (item < 0 || ((iLastPosX - iPosX) / 2.0) + iX <= iLastPosX)
+        {
+            if (scriptInformation[psa->eScript].props.fNeedsCaretInfo && clust_size > 1)
+                item-=(clust_size-1);
             *piTrailing = 1;
+        }
         else
             *piTrailing = 0;
     }




More information about the wine-cvs mailing list