Hans Leidekker : usp10: Add a stub implementation and a test for ScriptLayout.

Alexandre Julliard julliard at wine.codeweavers.com
Fri Sep 29 09:45:55 CDT 2006


Module: wine
Branch: master
Commit: 578260745a25ecbcbd8c40ce5a27796881ab3743
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=578260745a25ecbcbd8c40ce5a27796881ab3743

Author: Hans Leidekker <hans at it.vu.nl>
Date:   Thu Sep 28 17:00:19 2006 +0200

usp10: Add a stub implementation and a test for ScriptLayout.

---

 dlls/usp10/tests/usp10.c |   47 ++++++++++++++++++++++++++++++++++++++++++++++
 dlls/usp10/usp10.c       |   47 ++++++++++++++++++++++++++++++++++++++++++++++
 dlls/usp10/usp10.spec    |    2 +-
 3 files changed, 95 insertions(+), 1 deletions(-)

diff --git a/dlls/usp10/tests/usp10.c b/dlls/usp10/tests/usp10.c
index 45a65f2..3fef69a 100644
--- a/dlls/usp10/tests/usp10.c
+++ b/dlls/usp10/tests/usp10.c
@@ -727,6 +727,52 @@ void test_ScriptGetGlyphABCWidth(HDC hdc
     ok(hr == S_OK, "expected S_OK, got 0x%08lx\n", hr);
 }
 
+void test_ScriptLayout(void)
+{
+    HRESULT hr;
+    static const BYTE levels[][5] =
+    {
+        { 0, 0, 0, 0, 0 },
+        { 1, 1, 1, 1, 1 },
+        { 2, 2, 2, 2, 2 },
+        { 3, 3, 3, 3, 3 },
+    };
+    static const int expect[][5] =
+    {
+        { 0, 1, 2, 3, 4 },
+        { 4, 3, 2, 1, 0 },
+        { 0, 1, 2, 3, 4 },
+        { 4, 3, 2, 1, 0 }
+    };
+    int i, j, vistolog[sizeof(levels[0])], logtovis[sizeof(levels[0])];
+
+    hr = ScriptLayout(sizeof(levels[0]), NULL, vistolog, logtovis);
+    ok(hr == E_INVALIDARG, "expected E_INVALIDARG, got 0x%08lx\n", hr);
+
+    hr = ScriptLayout(sizeof(levels[0]), levels[0], NULL, NULL);
+    ok(hr == E_INVALIDARG, "expected E_INVALIDARG, got 0x%08lx\n", hr);
+
+    for (i = 0; i < sizeof(levels)/sizeof(levels[0]); i++)
+    {
+        hr = ScriptLayout(sizeof(levels[0]), levels[i], vistolog, logtovis);
+        ok(hr == S_OK, "expected S_OK, got 0x%08lx\n", hr);
+
+        for (j = 0; j < sizeof(levels[i]); j++)
+        {
+            ok(expect[i][j] == vistolog[j],
+               "failure: levels[%d][%d] = %d, vistolog[%d] = %d\n",
+               i, j, levels[i][j], j, vistolog[j] );
+        }
+
+        for (j = 0; j < sizeof(levels[i]); j++)
+        {
+            ok(expect[i][j] == logtovis[j],
+               "failure: levels[%d][%d] = %d, logtovis[%d] = %d\n",
+               i, j, levels[i][j], j, logtovis[j] );
+        }
+    }
+}
+
 static const struct
 {
     LGRPID group;
@@ -1010,6 +1056,7 @@ START_TEST(usp10)
     test_ScriptTextOut();
     test_ScriptXtoX();
     test_ScriptString();
+    test_ScriptLayout();
 
     test_digit_substitution();
 }
diff --git a/dlls/usp10/usp10.c b/dlls/usp10/usp10.c
index e258345..7fca547 100644
--- a/dlls/usp10/usp10.c
+++ b/dlls/usp10/usp10.c
@@ -1124,3 +1124,50 @@ HRESULT WINAPI ScriptGetGlyphABCWidth(HD
 
     return S_OK;
 }
+
+/***********************************************************************
+ *      ScriptLayout (USP10.@)
+ *
+ * Map embedding levels to visual and/or logical order.
+ *
+ * PARAMS
+ *  runs     [I] Size of level array.
+ *  level    [I] Array of embedding levels.
+ *  vistolog [O] Map of embedding levels from visual to logical order.
+ *  logtovis [O] Map of embedding levels from logical to visual order.
+ *
+ * RETURNS
+ *  Success: S_OK
+ *  Failure: Non-zero HRESULT value.
+ *
+ * BUGS
+ *  This stub works correctly for any sequence of a single
+ *  embedding level but not for sequences of different
+ *  embedding levels, i.e. mixtures of RTL and LTR scripts.
+ */
+HRESULT WINAPI ScriptLayout(int runs, const BYTE *level, int *vistolog, int *logtovis)
+{
+    int i, j = runs - 1, k = 0;
+
+    FIXME("(%d, %p, %p, %p): stub\n", runs, level, vistolog, logtovis);
+
+    if (!level || (!vistolog && !logtovis))
+        return E_INVALIDARG;
+
+    for (i = 0; i < runs; i++)
+    {
+        if (level[i] % 2)
+        {
+            if (vistolog) *vistolog++ = j;
+            if (logtovis) *logtovis++ = j;
+            j--;
+        }
+        else
+        {
+            if (vistolog) *vistolog++ = k;
+            if (logtovis) *logtovis++ = k;
+            k++;
+        }
+    }
+    return S_OK;
+}
diff --git a/dlls/usp10/usp10.spec b/dlls/usp10/usp10.spec
index 0c9ab51..95a6c77 100644
--- a/dlls/usp10/usp10.spec
+++ b/dlls/usp10/usp10.spec
@@ -13,7 +13,7 @@
 @ stdcall ScriptIsComplex(wstr long long)
 @ stdcall ScriptItemize(wstr long long ptr ptr ptr ptr)
 @ stub ScriptJustify
-@ stub ScriptLayout
+@ stdcall ScriptLayout(long ptr ptr ptr)
 @ stdcall ScriptPlace(ptr ptr ptr long ptr ptr ptr ptr ptr)
 @ stdcall ScriptRecordDigitSubstitution(ptr ptr)
 @ stdcall ScriptShape(ptr ptr ptr long long ptr ptr ptr ptr ptr)




More information about the wine-cvs mailing list