Aric Stewart : usp10: Rewrite ScriptStringCPtoX to make use of ScriptCPtoX.
Alexandre Julliard
julliard at winehq.org
Mon Mar 28 14:21:57 CDT 2011
Module: wine
Branch: master
Commit: d7ea24d56d692c94179d6796020306be1423dc17
URL: http://source.winehq.org/git/wine.git/?a=commit;h=d7ea24d56d692c94179d6796020306be1423dc17
Author: Aric Stewart <aric at codeweavers.com>
Date: Fri Mar 18 12:22:31 2011 -0500
usp10: Rewrite ScriptStringCPtoX to make use of ScriptCPtoX.
---
dlls/usp10/usp10.c | 50 ++++++++++++++++++++++++++++++--------------------
1 files changed, 30 insertions(+), 20 deletions(-)
diff --git a/dlls/usp10/usp10.c b/dlls/usp10/usp10.c
index 9f1300d..89b7856 100644
--- a/dlls/usp10/usp10.c
+++ b/dlls/usp10/usp10.c
@@ -202,6 +202,7 @@ typedef struct {
SCRIPT_VISATTR* psva;
GOFFSET* pGoffset;
ABC* abc;
+ int iMaxPosX;
} StringGlyphs;
typedef struct {
@@ -824,6 +825,7 @@ HRESULT WINAPI ScriptStringAnalyse(HDC hdc, const void *pString, int cString,
analysis->glyphs[i].psva = psva;
analysis->glyphs[i].pGoffset = pGoffset;
analysis->glyphs[i].abc = abc;
+ analysis->glyphs[i].iMaxPosX= -1;
}
*pssa = analysis;
@@ -932,11 +934,9 @@ HRESULT WINAPI ScriptStringOut(SCRIPT_STRING_ANALYSIS ssa,
*/
HRESULT WINAPI ScriptStringCPtoX(SCRIPT_STRING_ANALYSIS ssa, int icp, BOOL fTrailing, int* pX)
{
- int i, j;
+ int i;
int runningX = 0;
- int runningCp = 0;
StringAnalysis* analysis = ssa;
- BOOL itemTrailing;
TRACE("(%p), %d, %d, (%p)\n", ssa, icp, fTrailing, pX);
@@ -951,25 +951,35 @@ HRESULT WINAPI ScriptStringCPtoX(SCRIPT_STRING_ANALYSIS ssa, int icp, BOOL fTrai
for(i=0; i<analysis->numItems; i++)
{
- if (analysis->pItem[i].a.fRTL)
- itemTrailing = !fTrailing;
- else
- itemTrailing = fTrailing;
- for(j=0; j<analysis->glyphs[i].numGlyphs; j++)
+ int CP = analysis->pItem[i+1].iCharPos - analysis->pItem[i].iCharPos;
+ int offset;
+ /* initialize max extents for uninitialized runs */
+ if (analysis->glyphs[i].iMaxPosX == -1)
{
- if(runningCp == icp && itemTrailing == FALSE)
- {
- *pX = runningX;
- return S_OK;
- }
- runningX += analysis->glyphs[i].piAdvance[j];
- if(runningCp == icp && itemTrailing == TRUE)
- {
- *pX = runningX;
- return S_OK;
- }
- 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 (icp >= CP)
+ {
+ runningX += analysis->glyphs[i].iMaxPosX;
+ icp -= CP;
+ continue;
}
+
+ ScriptCPtoX(icp, fTrailing, CP, analysis->glyphs[i].numGlyphs, analysis->glyphs[i].pwLogClust,
+ analysis->glyphs[i].psva, analysis->glyphs[i].piAdvance,
+ &analysis->pItem[i].a, &offset);
+ runningX += offset;
+
+ *pX = runningX;
+ return S_OK;
}
/* icp out of range */
More information about the wine-cvs
mailing list