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