Module: wine Branch: master Commit: 8f4fab2483a7ff8bb680bdaa60bd5f50c57e525c URL: http://source.winehq.org/git/wine.git/?a=commit;h=8f4fab2483a7ff8bb680bdaa60...
Author: Aric Stewart aric@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; }