From bdbab217c999a8a60b3dff3207b680f556a04fbb Mon Sep 17 00:00:00 2001 From: Clinton Stimpson Date: Fri, 15 Dec 2006 19:28:17 -0700 Subject: [PATCH] usp10: Implement ScriptStringXtoCP. --- dlls/usp10/tests/usp10.c | 4 ++-- dlls/usp10/usp10.c | 49 +++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 48 insertions(+), 5 deletions(-) diff --git a/dlls/usp10/tests/usp10.c b/dlls/usp10/tests/usp10.c index b522b88dd79..5aa9631b899 100644 --- a/dlls/usp10/tests/usp10.c +++ b/dlls/usp10/tests/usp10.c @@ -829,7 +829,7 @@ static void test_ScriptStringXtoCP_CPtoX(HDC hdc) hr = ScriptStringXtoCP(ssa, X, &Ch, &iTrailing); ok(hr == S_OK, "ScriptStringXtoCP should return S_OK not %08x\n", hr); todo_wine ok(Cp == Ch, "ScriptStringXtoCP should return Ch = %d not %d for X = %d\n", Cp, Ch, X); - todo_wine ok(iTrailing == TRUE, "ScriptStringXtoCP should return iTrailing = 1 not %d for X = %d\n", + ok(iTrailing == TRUE, "ScriptStringXtoCP should return iTrailing = 1 not %d for X = %d\n", iTrailing, X); /* @@ -861,7 +861,7 @@ static void test_ScriptStringXtoCP_CPtoX(HDC hdc) hr = ScriptStringXtoCP(ssa, X, &Ch, &iTrailing); ok(hr == S_OK, "ScriptStringXtoCP should return S_OK not %08x\n", hr); todo_wine ok(Cp - 1 == Ch, "ScriptStringXtoCP should return Ch = %d not %d for X = %d\n", Cp - 1, Ch, X); - todo_wine ok(iTrailing == TRUE, "ScriptStringXtoCP should return iTrailing = 1 not %d for X = %d\n", + ok(iTrailing == TRUE, "ScriptStringXtoCP should return iTrailing = 1 not %d for X = %d\n", iTrailing, X); /* diff --git a/dlls/usp10/usp10.c b/dlls/usp10/usp10.c index feedc5b89cb..14f6fe902d3 100644 --- a/dlls/usp10/usp10.c +++ b/dlls/usp10/usp10.c @@ -585,12 +585,55 @@ HRESULT WINAPI ScriptStringCPtoX(SCRIPT_STRING_ANALYSIS ssa, int icp, BOOL fTrai */ HRESULT WINAPI ScriptStringXtoCP(SCRIPT_STRING_ANALYSIS ssa, int iX, int* piCh, int* piTrailing) { - FIXME("(%p), %d, (%p), (%p): stub\n", ssa, iX, piCh, piTrailing); - *piCh = 0; /* Set a reasonable value */ - *piTrailing = 0; + 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); + + if(!ssa || !piCh || !piTrailing) + { + return 1; + } + + /* out of range */ + if(iX < 0) + { + *piCh = -1; + *piTrailing = TRUE; + return S_OK; + } + + for(i=0; inumItems; i++) + { + for(j=0; jglyphs[i].numGlyphs; j++) + { + width = analysis->glyphs[i].piAdvance[j]; + if(iX < (runningX + width)) + { + *piCh = runningCp; + if((iX - runningX) > width/2) + *piTrailing = TRUE; + else + *piTrailing = FALSE; + return S_OK; + } + runningX += width; + runningCp++; + } + } + + /* out of range */ + *piCh = analysis->pItem[analysis->numItems].iCharPos; + *piTrailing = FALSE; + return S_OK; } + /*********************************************************************** * ScriptStringFree (USP10.@) * -- 2.11.4.GIT