Nikolay Sivov : dwrite: Use [0, ~0u) as initial range for strikethrough settings.

Alexandre Julliard julliard at wine.codeweavers.com
Tue Jun 9 08:25:53 CDT 2015


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

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Mon Jun  8 20:55:51 2015 +0300

dwrite: Use [0,~0u) as initial range for strikethrough settings.

---

 dlls/dwrite/layout.c       |  9 +----
 dlls/dwrite/tests/layout.c | 87 ++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 88 insertions(+), 8 deletions(-)

diff --git a/dlls/dwrite/layout.c b/dlls/dwrite/layout.c
index 150e34b..96d4959 100644
--- a/dlls/dwrite/layout.c
+++ b/dlls/dwrite/layout.c
@@ -2175,9 +2175,6 @@ static HRESULT WINAPI dwritetextlayout_GetStrikethrough(IDWriteTextLayout2 *ifac
 
     TRACE("(%p)->(%u %p %p)\n", This, position, strikethrough, r);
 
-    if (position >= This->len)
-        return S_OK;
-
     range = (struct layout_range_bool*)get_layout_range_header_by_pos(&This->strike_ranges, position);
     *strikethrough = range->value;
 
@@ -3252,7 +3249,7 @@ static HRESULT layout_format_from_textformat(struct dwrite_textlayout *layout, I
 static HRESULT init_textlayout(const WCHAR *str, UINT32 len, IDWriteTextFormat *format, FLOAT maxwidth, FLOAT maxheight, struct dwrite_textlayout *layout)
 {
     struct layout_range_header *range, *strike;
-    DWRITE_TEXT_RANGE r;
+    DWRITE_TEXT_RANGE r = { 0, ~0u };
     HRESULT hr;
 
     layout->IDWriteTextLayout2_iface.lpVtbl = &dwritetextlayoutvtbl;
@@ -3296,11 +3293,7 @@ static HRESULT init_textlayout(const WCHAR *str, UINT32 len, IDWriteTextFormat *
     if (FAILED(hr))
         goto fail;
 
-    r.startPosition = 0;
-    r.length = ~0u;
     range = alloc_layout_range(layout, &r, LAYOUT_RANGE_REGULAR);
-    r.startPosition = 0;
-    r.length = len;
     strike = alloc_layout_range(layout, &r, LAYOUT_RANGE_STRIKETHROUGH);
     if (!range || !strike) {
         free_layout_range(range);
diff --git a/dlls/dwrite/tests/layout.c b/dlls/dwrite/tests/layout.c
index 3ac716e..4dd0ab1 100644
--- a/dlls/dwrite/tests/layout.c
+++ b/dlls/dwrite/tests/layout.c
@@ -1174,6 +1174,10 @@ static const struct drawcall_entry draw_seq5[] = {
     { DRAW_LAST_KIND }
 };
 
+static const struct drawcall_entry draw_seq6[] = {
+    { DRAW_LAST_KIND }
+};
+
 static void test_Draw(void)
 {
     static const WCHAR strW[] = {'s','t','r','i','n','g',0};
@@ -1274,6 +1278,16 @@ static void test_Draw(void)
     ok_sequence(sequences, RENDERER_ID, draw_seq5, "draw test 5", FALSE);
     IDWriteTextLayout_Release(layout);
 
+    /* empty string */
+    hr = IDWriteFactory_CreateTextLayout(factory, strW, 0, format, 500.0, 100.0, &layout);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+
+    flush_sequence(sequences, RENDERER_ID);
+    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_seq6, "draw test 6", FALSE);
+    IDWriteTextLayout_Release(layout);
+
     IDWriteTextFormat_Release(format);
     IDWriteFactory_Release(factory);
 }
@@ -1532,6 +1546,17 @@ todo_wine
 
     IDWriteTextLayout_Release(layout);
 
+    /* zero length string */
+    hr = IDWriteFactory_CreateTextLayout(factory, strW, 0, format, 1000.0, 1000.0, &layout);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+
+    count = 1;
+    memset(metrics, 0, sizeof(metrics));
+    hr = IDWriteTextLayout_GetClusterMetrics(layout, metrics, 3, &count);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+    ok(count == 0, "got %u\n", count);
+    IDWriteTextLayout_Release(layout);
+
     IDWriteInlineObject_Release(trimm);
     IDWriteTextFormat_Release(format);
     IDWriteFactory_Release(factory);
@@ -2141,6 +2166,67 @@ static void test_SetFontStretch(void)
     IDWriteTextFormat_Release(format);
 }
 
+static void test_SetStrikethrough(void)
+{
+    static const WCHAR strW[] = {'a','b','c','d',0};
+    IDWriteTextFormat *format;
+    IDWriteTextLayout *layout;
+    IDWriteFactory *factory;
+    DWRITE_TEXT_RANGE r;
+    BOOL value;
+    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, 1000.0, 1000.0, &layout);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+
+    r.startPosition = 1;
+    r.length = 0;
+    value = TRUE;
+    hr = IDWriteTextLayout_GetStrikethrough(layout, 0, &value, &r);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+    ok(r.startPosition == 0 && r.length == ~0u, "got %u, %u\n", r.startPosition, r.length);
+    ok(value == FALSE, "got %d\n", value);
+
+    r.startPosition = 1;
+    r.length = 1;
+    hr = IDWriteTextLayout_SetStrikethrough(layout, TRUE, r);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+
+    value = FALSE;
+    hr = IDWriteTextLayout_GetStrikethrough(layout, 1, &value, &r);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+    ok(value == TRUE, "got %d\n", value);
+    ok(r.startPosition == 1 && r.length == 1, "got %u, %u\n", r.startPosition, r.length);
+
+    value = TRUE;
+    r.startPosition = r.length = 0;
+    hr = IDWriteTextLayout_GetStrikethrough(layout, 20, &value, &r);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+    ok(r.startPosition == 2 && r.length == ~0u-2, "got %u, %u\n", r.startPosition, r.length);
+    ok(value == FALSE, "got %d\n", value);
+
+    r.startPosition = 100;
+    r.length = 4;
+    hr = IDWriteTextLayout_SetStrikethrough(layout, TRUE, r);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+
+    value = FALSE;
+    r.startPosition = r.length = 0;
+    hr = IDWriteTextLayout_GetStrikethrough(layout, 100, &value, &r);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+    ok(r.startPosition == 100 && r.length == 4, "got %u, %u\n", r.startPosition, r.length);
+    ok(value == TRUE, "got %d\n", value);
+
+    IDWriteTextLayout_Release(layout);
+    IDWriteTextFormat_Release(format);
+}
+
 START_TEST(layout)
 {
     static const WCHAR ctrlstrW[] = {0x202a,0};
@@ -2176,6 +2262,7 @@ START_TEST(layout)
     test_SetFontFamilyName();
     test_SetFontStyle();
     test_SetFontStretch();
+    test_SetStrikethrough();
 
     IDWriteFactory_Release(factory);
 }




More information about the wine-cvs mailing list