Jeff Latimer : usp10:
Add functionality for ScriptXtoCP and ScriptCPtoX calls.
Alexandre Julliard
julliard at wine.codeweavers.com
Fri Jul 21 04:14:32 CDT 2006
Module: wine
Branch: refs/heads/master
Commit: 8d139c8b960249e9513492b7ca16d9311b4ef1de
URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=8d139c8b960249e9513492b7ca16d9311b4ef1de
Author: Jeff Latimer <lats at yless4u.com.au>
Date: Thu Jul 20 22:16:50 2006 +1000
usp10: Add functionality for ScriptXtoCP and ScriptCPtoX calls.
---
dlls/usp10/tests/usp10.c | 91 ++++++++++++++++++++++++++++++++++++++++++++++
dlls/usp10/usp10.c | 49 ++++++++++++++++++++++---
2 files changed, 134 insertions(+), 6 deletions(-)
diff --git a/dlls/usp10/tests/usp10.c b/dlls/usp10/tests/usp10.c
index cbaf44a..2a3d9c4 100644
--- a/dlls/usp10/tests/usp10.c
+++ b/dlls/usp10/tests/usp10.c
@@ -487,6 +487,96 @@ void test_ScriptTextOut(void)
DestroyWindow(hwnd);
}
+static void test_ScriptXtoX(void)
+/****************************************************************************************
+ * This routine tests the ScriptXtoCP and ScriptCPtoX functions using static variables *
+ ****************************************************************************************/
+{
+ int iX, iCP;
+ int cChars;
+ int cGlyphs;
+ WORD pwLogClust[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+ SCRIPT_VISATTR psva[10];
+ int piAdvance[10] = {200, 190, 210, 180, 170, 204, 189, 195, 212, 203};
+ SCRIPT_ANALYSIS psa;
+ int piCP, piX;
+ int piTrailing;
+ BOOL fTrailing;
+ HRESULT hr;
+
+ iX = -1;
+ cChars = 10;
+ cGlyphs = 10;
+ hr = ScriptXtoCP(iX, cChars, cGlyphs, pwLogClust, psva, piAdvance, &psa, &piCP, &piTrailing);
+ ok(hr == S_OK, "ScriptXtoCP should return S_OK not %d\n", (unsigned int) hr);
+ ok(piCP == -1, "Negative iX should return piCP=-1 not %d\n", piCP);
+ ok(piTrailing == TRUE, "Negative iX should return piTrailing=TRUE not %d", piTrailing);
+ iX = 1954;
+ cChars = 10;
+ cGlyphs = 10;
+ hr = ScriptXtoCP(iX, cChars, cGlyphs, pwLogClust, psva, piAdvance, &psa, &piCP, &piTrailing);
+ ok(hr == S_OK, "ScriptXtoCP should return S_OK not %d\n", (unsigned int) hr);
+ ok(piCP == 10, "Excessive iX should return piCP=10 not %d\n", piCP);
+ ok(piTrailing == FALSE, "Excessive iX should return piTrailing=FALSE not %d\n", piTrailing);
+ iX = 779;
+ cChars = 10;
+ cGlyphs = 10;
+ hr = ScriptXtoCP(iX, cChars, cGlyphs, pwLogClust, psva, piAdvance, &psa, &piCP, &piTrailing);
+ ok(hr == S_OK, "ScriptXtoCP should return S_OK not %d\n", (unsigned int) hr);
+ ok(piCP == 3, "iX=%d should return piCP=3 not %d\n", iX, piCP);
+ ok(piTrailing == 1, "iX=%d should return piTrailing=1 not %d\n", iX, piTrailing);
+ iX = 780;
+ cChars = 10;
+ cGlyphs = 10;
+ hr = ScriptXtoCP(iX, cChars, cGlyphs, pwLogClust, psva, piAdvance, &psa, &piCP, &piTrailing);
+ ok(hr == S_OK, "ScriptXtoCP should return S_OK not %d\n", (unsigned int) hr);
+ ok(piCP == 3, "iX=%d should return piCP=3 not %d\n", iX, piCP);
+ ok(piTrailing == 1, "iX=%d should return piTrailing=1 not %d\n", iX, piTrailing);
+ iX = 868;
+ cChars = 10;
+ cGlyphs = 10;
+ hr = ScriptXtoCP(iX, cChars, cGlyphs, pwLogClust, psva, piAdvance, &psa, &piCP, &piTrailing);
+ ok(hr == S_OK, "ScriptXtoCP should return S_OK not %d\n", (unsigned int) hr);
+ ok(piCP == 4, "iX=%d should return piCP=4 not %d\n", iX, piCP);
+
+ iCP=5;
+ fTrailing = FALSE;
+ cChars = 10;
+ cGlyphs = 10;
+ hr = ScriptCPtoX(iCP, fTrailing, cChars, cGlyphs, pwLogClust, psva, piAdvance, &psa, &piX);
+ ok(hr == S_OK, "ScriptCPtoX should return S_OK not %d\n", (unsigned int) hr);
+ ok(piX == 976, "iCP=%d should return piX=976 not %d\n", iCP, piX);
+ iCP=5;
+ fTrailing = TRUE;
+ cChars = 10;
+ cGlyphs = 10;
+ hr = ScriptCPtoX(iCP, fTrailing, cChars, cGlyphs, pwLogClust, psva, piAdvance, &psa, &piX);
+ ok(hr == S_OK, "ScriptCPtoX should return S_OK not %d\n", (unsigned int) hr);
+ ok(piX == 1171, "iCP=%d should return piX=1171 not %d\n", iCP, piX);
+ iCP=6;
+ fTrailing = FALSE;
+ cChars = 10;
+ cGlyphs = 10;
+ hr = ScriptCPtoX(iCP, fTrailing, cChars, cGlyphs, pwLogClust, psva, piAdvance, &psa, &piX);
+ ok(hr == S_OK, "ScriptCPtoX should return S_OK not %d\n", (unsigned int) hr);
+ ok(piX == 1171, "iCP=%d should return piX=1171 not %d\n", iCP, piX);
+ iCP=11;
+ fTrailing = FALSE;
+ cChars = 10;
+ cGlyphs = 10;
+ hr = ScriptCPtoX(iCP, fTrailing, cChars, cGlyphs, pwLogClust, psva, piAdvance, &psa, &piX);
+ ok(hr == S_OK, "ScriptCPtoX should return S_OK not %d\n", (unsigned int) hr);
+ ok(piX == 1953, "iCP=%d should return piX=1953 not %d\n", iCP, piX);
+ iCP=11;
+ fTrailing = TRUE;
+ cChars = 10;
+ cGlyphs = 10;
+ hr = ScriptCPtoX(iCP, fTrailing, cChars, cGlyphs, pwLogClust, psva, piAdvance, &psa, &piX);
+ ok(hr == S_OK, "ScriptCPtoX should return S_OK not %d\n", (unsigned int) hr);
+ ok(piX == 1953, "iCP=%d should return piX=1953 not %d\n", iCP, piX);
+
+}
+
static void test_ScriptString(void)
{
HRESULT hr;
@@ -569,5 +659,6 @@ START_TEST(usp10)
test_ScriptGetCMap(pwOutGlyphs);
test_ScriptGetFontProperties();
test_ScriptTextOut();
+ test_ScriptXtoX();
test_ScriptString();
}
diff --git a/dlls/usp10/usp10.c b/dlls/usp10/usp10.c
index aa39449..9e02007 100644
--- a/dlls/usp10/usp10.c
+++ b/dlls/usp10/usp10.c
@@ -362,11 +362,20 @@ HRESULT WINAPI ScriptCPtoX(int iCP,
const SCRIPT_ANALYSIS *psa,
int *piX)
{
- FIXME("(%d,%d,%d,%d,%p,%p,%p,%p,%p): stub\n",
+ int item;
+ int iPosX;
+ float fMaxPosX = 0;
+ TRACE("(%d,%d,%d,%d,%p,%p,%p,%p,%p)\n",
iCP, fTrailing, cChars, cGlyphs, pwLogClust, psva, piAdvance,
psa, piX);
-
- *piX = 1; /* Return something in range */
+ for (item=0; item < cGlyphs; item++) /* total piAdvance */
+ fMaxPosX += piAdvance[item];
+ iPosX = (fMaxPosX/cGlyphs)*(iCP+fTrailing);
+ if (iPosX > fMaxPosX)
+ iPosX = fMaxPosX;
+ *piX = iPosX; /* Return something in range */
+
+ TRACE("*piX=%d\n", *piX);
return S_OK;
}
@@ -384,12 +393,40 @@ HRESULT WINAPI ScriptXtoCP(int iX,
int *piCP,
int *piTrailing)
{
- FIXME("(%d,%d,%d,%p,%p,%p,%p,%p,%p): stub\n",
+ int item;
+ int iPosX = 1;
+ float fMaxPosX = 1;
+ float fAvePosX;
+ TRACE("(%d,%d,%d,%p,%p,%p,%p,%p,%p)\n",
iX, cChars, cGlyphs, pwLogClust, psva, piAdvance,
psa, piCP, piTrailing);
+ if (iX < 0) /* iX is before start of run */
+ {
+ *piCP = -1;
+ *piTrailing = TRUE;
+ return S_OK;
+ }
- *piCP = 1; /* Return something in range */
- *piTrailing = 0;
+ for (item=0; item < cGlyphs; item++) /* total piAdvance */
+ fMaxPosX += piAdvance[item];
+
+ if (iX >= fMaxPosX) /* iX too large */
+ {
+ *piCP = cChars;
+ *piTrailing = FALSE;
+ return S_OK;
+ }
+
+ fAvePosX = fMaxPosX / cGlyphs;
+ for (item = 0; item < cGlyphs && iPosX < iX; item++)
+ iPosX = fAvePosX * (item +1);
+ if (iPosX - iX > fAvePosX/2)
+ *piTrailing = 0;
+ else
+ *piTrailing = 1; /* yep we are over half way */
+
+ *piCP = item -1; /* Return character position */
+ TRACE("*piCP=%d iPposX=%d\n", *piCP, iPosX);
return S_OK;
}
More information about the wine-cvs
mailing list