diff --git a/dlls/dwrite/layout.c b/dlls/dwrite/layout.c index 150e34bea91..96d4959257c 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 3ac716e55a4..4dd0ab1afcf 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); }