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