Nikolay Sivov : dwrite: Fix splitted range length, initial test for GetMetrics().

Alexandre Julliard julliard at wine.codeweavers.com
Mon Jun 15 08:49:08 CDT 2015


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

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Mon Jun 15 00:36:43 2015 +0300

dwrite: Fix splitted range length, initial test for GetMetrics().

---

 dlls/dwrite/layout.c         |  2 +-
 dlls/dwrite/tests/analyzer.c |  4 +--
 dlls/dwrite/tests/layout.c   | 75 ++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 78 insertions(+), 3 deletions(-)

diff --git a/dlls/dwrite/layout.c b/dlls/dwrite/layout.c
index 903e53d..bdd8ad6 100644
--- a/dlls/dwrite/layout.c
+++ b/dlls/dwrite/layout.c
@@ -3084,7 +3084,7 @@ static HRESULT WINAPI dwritetextlayout_sink_SetBidiLevel(IDWriteTextAnalysisSink
 
         /* reduce existing run */
         cur->run.bidiLevel = resolvedLevel;
-        cur->descr.stringLength -= length;
+        cur->descr.stringLength = length;
 
         list_add_after(&cur_run->entry, &run->entry);
         break;
diff --git a/dlls/dwrite/tests/analyzer.c b/dlls/dwrite/tests/analyzer.c
index 4e2e7ca..c514bec 100644
--- a/dlls/dwrite/tests/analyzer.c
+++ b/dlls/dwrite/tests/analyzer.c
@@ -523,8 +523,8 @@ static struct sa_test sa_tests[] = {
     },
     {
       /* Arabic */
-      {0x064a,0x064f,0x0633,0x0627,0x0648,0x0650,0x064a,0}, 1,
-          { { 0, 7, DWRITE_SCRIPT_SHAPES_DEFAULT }}
+      {0x064a,0x064f,0x0633,0x0627,0x0648,0x0650,0x064a,0x0661,0}, 1,
+          { { 0, 8, DWRITE_SCRIPT_SHAPES_DEFAULT }}
     },
     {
       /* Arabic */
diff --git a/dlls/dwrite/tests/layout.c b/dlls/dwrite/tests/layout.c
index 4093633..2b19961 100644
--- a/dlls/dwrite/tests/layout.c
+++ b/dlls/dwrite/tests/layout.c
@@ -1380,6 +1380,7 @@ static void test_typography(void)
 
 static void test_GetClusterMetrics(void)
 {
+    static const WCHAR str3W[] = {0x2066,')',')',0x661,'(',0x627,')',0};
     static const WCHAR str2W[] = {0x202a,0x202c,'a',0};
     static const WCHAR strW[] = {'a','b','c','d',0};
     DWRITE_INLINE_OBJECT_METRICS inline_metrics;
@@ -1399,6 +1400,13 @@ static void test_GetClusterMetrics(void)
         DWRITE_FONT_STRETCH_NORMAL, 10.0, enusW, &format);
     ok(hr == S_OK, "got 0x%08x\n", hr);
 
+    hr = IDWriteFactory_CreateTextLayout(factory, str3W, 7, format, 1000.0, 1000.0, &layout);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+    hr = IDWriteTextLayout_GetClusterMetrics(layout, NULL, 0, &count);
+    ok(hr == E_NOT_SUFFICIENT_BUFFER, "got 0x%08x\n", hr);
+    ok(count == 7, "got %u\n", count);
+    IDWriteTextLayout_Release(layout);
+
     hr = IDWriteFactory_CreateTextLayout(factory, strW, 4, format, 1000.0, 1000.0, &layout);
     ok(hr == S_OK, "got 0x%08x\n", hr);
 
@@ -1873,6 +1881,7 @@ static void test_DetermineMinWidth(void)
 
     IDWriteTextLayout_Release(layout);
     IDWriteTextFormat_Release(format);
+    IDWriteFactory_Release(factory);
 }
 
 static void test_SetFontSize(void)
@@ -1964,6 +1973,7 @@ static void test_SetFontSize(void)
 
     IDWriteTextLayout_Release(layout);
     IDWriteTextFormat_Release(format);
+    IDWriteFactory_Release(factory);
 }
 
 static void test_SetFontFamilyName(void)
@@ -2044,6 +2054,7 @@ static void test_SetFontFamilyName(void)
 
     IDWriteTextLayout_Release(layout);
     IDWriteTextFormat_Release(format);
+    IDWriteFactory_Release(factory);
 }
 
 static void test_SetFontStyle(void)
@@ -2131,6 +2142,7 @@ static void test_SetFontStyle(void)
 
     IDWriteTextLayout_Release(layout);
     IDWriteTextFormat_Release(format);
+    IDWriteFactory_Release(factory);
 }
 
 static void test_SetFontStretch(void)
@@ -2225,6 +2237,7 @@ static void test_SetFontStretch(void)
 
     IDWriteTextLayout_Release(layout);
     IDWriteTextFormat_Release(format);
+    IDWriteFactory_Release(factory);
 }
 
 static void test_SetStrikethrough(void)
@@ -2286,6 +2299,67 @@ static void test_SetStrikethrough(void)
 
     IDWriteTextLayout_Release(layout);
     IDWriteTextFormat_Release(format);
+    IDWriteFactory_Release(factory);
+}
+
+static void test_GetMetrics(void)
+{
+    static const WCHAR str2W[] = {0x2066,')',')',0x661,'(',0x627,')',0};
+    static const WCHAR strW[] = {'a','b','c','d',0};
+    DWRITE_TEXT_METRICS metrics;
+    IDWriteTextFormat *format;
+    IDWriteTextLayout *layout;
+    IDWriteFactory *factory;
+    HRESULT hr;
+
+    factory = create_factory();
+
+    hr = IDWriteFactory_CreateTextFormat(factory, tahomaW, NULL, DWRITE_FONT_WEIGHT_NORMAL, DWRITE_FONT_STYLE_NORMAL,
+        DWRITE_FONT_STRETCH_NORMAL, 10.0, enusW, &format);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+
+    hr = IDWriteFactory_CreateTextLayout(factory, strW, 4, format, 500.0, 1000.0, &layout);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+
+    memset(&metrics, 0xcc, sizeof(metrics));
+    hr = IDWriteTextLayout_GetMetrics(layout, &metrics);
+todo_wine {
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+    ok(metrics.left == 0.0, "got %.2f\n", metrics.left);
+    ok(metrics.top == 0.0, "got %.2f\n", metrics.top);
+    ok(metrics.width > 0.0, "got %.2f\n", metrics.width);
+    ok(metrics.widthIncludingTrailingWhitespace > 0.0, "got %.2f\n", metrics.widthIncludingTrailingWhitespace);
+    ok(metrics.height > 0.0, "got %.2f\n", metrics.height);
+    ok(metrics.layoutWidth == 500.0, "got %.2f\n", metrics.layoutWidth);
+    ok(metrics.layoutHeight == 1000.0, "got %.2f\n", metrics.layoutHeight);
+    ok(metrics.maxBidiReorderingDepth == 1, "got %u\n", metrics.maxBidiReorderingDepth);
+    ok(metrics.lineCount == 1, "got %u\n", metrics.lineCount);
+}
+    IDWriteTextLayout_Release(layout);
+
+    /* a string with more complex bidi sequence */
+    hr = IDWriteFactory_CreateTextLayout(factory, str2W, 7, format, 500.0, 1000.0, &layout);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+
+    memset(&metrics, 0xcc, sizeof(metrics));
+    metrics.maxBidiReorderingDepth = 0;
+    hr = IDWriteTextLayout_GetMetrics(layout, &metrics);
+todo_wine {
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+    ok(metrics.left == 0.0, "got %.2f\n", metrics.left);
+    ok(metrics.top == 0.0, "got %.2f\n", metrics.top);
+    ok(metrics.width > 0.0, "got %.2f\n", metrics.width);
+    ok(metrics.widthIncludingTrailingWhitespace > 0.0, "got %.2f\n", metrics.widthIncludingTrailingWhitespace);
+    ok(metrics.height > 0.0, "got %.2f\n", metrics.height);
+    ok(metrics.layoutWidth == 500.0, "got %.2f\n", metrics.layoutWidth);
+    ok(metrics.layoutHeight == 1000.0, "got %.2f\n", metrics.layoutHeight);
+    ok(metrics.maxBidiReorderingDepth > 1, "got %u\n", metrics.maxBidiReorderingDepth);
+    ok(metrics.lineCount == 1, "got %u\n", metrics.lineCount);
+}
+    IDWriteTextLayout_Release(layout);
+
+    IDWriteTextFormat_Release(format);
+    IDWriteFactory_Release(factory);
 }
 
 START_TEST(layout)
@@ -2324,6 +2398,7 @@ START_TEST(layout)
     test_SetFontStyle();
     test_SetFontStretch();
     test_SetStrikethrough();
+    test_GetMetrics();
 
     IDWriteFactory_Release(factory);
 }




More information about the wine-cvs mailing list