Nikolay Sivov : dwrite/tests: Test actual strings being reported to a renderer.

Alexandre Julliard julliard at wine.codeweavers.com
Fri Jun 5 06:46:11 CDT 2015


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

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Thu Jun  4 12:32:38 2015 +0300

dwrite/tests: Test actual strings being reported to a renderer.

---

 dlls/dwrite/tests/layout.c | 66 ++++++++++++++++++++++++++++++++++++++--------
 1 file changed, 55 insertions(+), 11 deletions(-)

diff --git a/dlls/dwrite/tests/layout.c b/dlls/dwrite/tests/layout.c
index 77fa85c..472e01f 100644
--- a/dlls/dwrite/tests/layout.c
+++ b/dlls/dwrite/tests/layout.c
@@ -231,6 +231,7 @@ static const char *get_draw_kind_name(enum drawcall_kind kind)
 
 struct drawcall_entry {
     enum drawcall_kind kind;
+    WCHAR string[10]; /* only meaningful for DrawGlyphRun() */
 };
 
 struct drawcall_sequence
@@ -326,6 +327,18 @@ static void ok_sequence_(struct drawcall_sequence **seq, int sequence_index,
                 ok_(file, line) (0, "%s: call %s was expected, but got call %s instead\n",
                     context, get_draw_kind_name(expected->kind), get_draw_kind_name(actual->kind));
         }
+        else if (expected->kind == DRAW_GLYPHRUN) {
+            int cmp = lstrcmpW(expected->string, actual->string);
+            if (cmp != 0 && todo) {
+                failcount++;
+            todo_wine
+                ok_(file, line) (0, "%s: glyphrun string %s was expected, but got %s instead\n",
+                    context, wine_dbgstr_w(expected->string), wine_dbgstr_w(actual->string));
+            }
+            else
+                ok_(file, line) (cmp == 0, "%s: glyphrun string %s was expected, but got %s instead\n",
+                    context, wine_dbgstr_w(expected->string), wine_dbgstr_w(actual->string));
+        }
         expected++;
         actual++;
     }
@@ -421,6 +434,14 @@ static HRESULT WINAPI testrenderer_DrawGlyphRun(IDWriteTextRenderer *iface,
     struct drawcall_entry entry;
     DWRITE_SCRIPT_ANALYSIS sa;
 
+    ok(descr->stringLength < sizeof(entry.string)/sizeof(WCHAR), "string is too long\n");
+    if (descr->stringLength && descr->stringLength < sizeof(entry.string)/sizeof(WCHAR)) {
+        memcpy(entry.string, descr->string, descr->stringLength*sizeof(WCHAR));
+        entry.string[descr->stringLength] = 0;
+    }
+    else
+        entry.string[0] = 0;
+
     /* see what's reported for control codes runs */
     get_script_analysis(descr->string, descr->stringLength, &sa);
     if (sa.script == g_control_sa.script) {
@@ -1102,10 +1123,10 @@ static void test_SetInlineObject(void)
 /* drawing calls sequence doesn't depend on run order, instead all runs are
    drawn first, inline objects next and then underline/strikes */
 static const struct drawcall_entry draw_seq[] = {
-    { DRAW_GLYPHRUN },
-    { DRAW_GLYPHRUN },
-    { DRAW_GLYPHRUN },
-    { DRAW_GLYPHRUN },
+    { DRAW_GLYPHRUN, {'s',0}     },
+    { DRAW_GLYPHRUN, {'r','i',0} },
+    { DRAW_GLYPHRUN, {'n',0}     },
+    { DRAW_GLYPHRUN, {'g',0}     },
     { DRAW_INLINE },
     { DRAW_UNDERLINE },
     { DRAW_STRIKETHROUGH },
@@ -1113,18 +1134,25 @@ static const struct drawcall_entry draw_seq[] = {
 };
 
 static const struct drawcall_entry draw_seq2[] = {
-    { DRAW_GLYPHRUN },
-    { DRAW_GLYPHRUN },
-    { DRAW_GLYPHRUN },
-    { DRAW_GLYPHRUN },
-    { DRAW_GLYPHRUN },
-    { DRAW_GLYPHRUN },
+    { DRAW_GLYPHRUN, {'s',0} },
+    { DRAW_GLYPHRUN, {'t',0} },
+    { DRAW_GLYPHRUN, {'r',0} },
+    { DRAW_GLYPHRUN, {'i',0} },
+    { DRAW_GLYPHRUN, {'n',0} },
+    { DRAW_GLYPHRUN, {'g',0} },
     { DRAW_LAST_KIND }
 };
 
 static const struct drawcall_entry draw_seq3[] = {
     { DRAW_GLYPHRUN },
-    { DRAW_GLYPHRUN },
+    { DRAW_GLYPHRUN, {'a','b',0} },
+    { DRAW_LAST_KIND }
+};
+
+static const struct drawcall_entry draw_seq4[] = {
+    { DRAW_GLYPHRUN, {'s','t','r',0} },
+    { DRAW_GLYPHRUN, {'i','n','g',0} },
+    { DRAW_STRIKETHROUGH },
     { DRAW_LAST_KIND }
 };
 
@@ -1197,6 +1225,22 @@ static void test_Draw(void)
     ok_sequence(sequences, RENDERER_ID, draw_seq3, "draw test 3", TRUE);
     IDWriteTextLayout_Release(layout);
 
+    /* strikethrough splits ranges from renderer point of view, but doesn't break
+       shaping */
+    hr = IDWriteFactory_CreateTextLayout(factory, strW, 6, format, 500.0, 100.0, &layout);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+    flush_sequence(sequences, RENDERER_ID);
+
+    range.startPosition = 0;
+    range.length = 3;
+    hr = IDWriteTextLayout_SetStrikethrough(layout, TRUE, range);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+
+    hr = IDWriteTextLayout_Draw(layout, NULL, &testrenderer, 0.0, 0.0);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+    ok_sequence(sequences, RENDERER_ID, draw_seq4, "draw test 4", TRUE);
+    IDWriteTextLayout_Release(layout);
+
     IDWriteTextFormat_Release(format);
     IDWriteFactory_Release(factory);
 }




More information about the wine-cvs mailing list