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