From 617f668f49ddd6293799c29f8614fee4af60991d Mon Sep 17 00:00:00 2001 From: Nikolay Sivov Date: Tue, 14 Oct 2014 10:03:28 +0400 Subject: [PATCH] dwrite: Block negative max height/width for layout. --- dlls/dwrite/layout.c | 8 +++++++ dlls/dwrite/tests/layout.c | 43 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+) diff --git a/dlls/dwrite/layout.c b/dlls/dwrite/layout.c index c48a7c18f0b..0afd4665a6c 100644 --- a/dlls/dwrite/layout.c +++ b/dlls/dwrite/layout.c @@ -772,6 +772,10 @@ static HRESULT WINAPI dwritetextlayout_SetMaxWidth(IDWriteTextLayout2 *iface, FL { struct dwrite_textlayout *This = impl_from_IDWriteTextLayout2(iface); TRACE("(%p)->(%.1f)\n", This, maxWidth); + + if (maxWidth < 0.0) + return E_INVALIDARG; + This->maxwidth = maxWidth; return S_OK; } @@ -780,6 +784,10 @@ static HRESULT WINAPI dwritetextlayout_SetMaxHeight(IDWriteTextLayout2 *iface, F { struct dwrite_textlayout *This = impl_from_IDWriteTextLayout2(iface); TRACE("(%p)->(%.1f)\n", This, maxHeight); + + if (maxHeight < 0.0) + return E_INVALIDARG; + This->maxheight = maxHeight; return S_OK; } diff --git a/dlls/dwrite/tests/layout.c b/dlls/dwrite/tests/layout.c index bff9d15861d..0975ee8f9e9 100644 --- a/dlls/dwrite/tests/layout.c +++ b/dlls/dwrite/tests/layout.c @@ -550,6 +550,7 @@ static void test_fontweight(void) IDWriteTextLayout *layout; DWRITE_FONT_WEIGHT weight; DWRITE_TEXT_RANGE range; + FLOAT size; HRESULT hr; hr = IDWriteFactory_CreateTextFormat(factory, tahomaW, NULL, DWRITE_FONT_WEIGHT_BOLD, DWRITE_FONT_STYLE_NORMAL, @@ -581,6 +582,48 @@ static void test_fontweight(void) ok(weight == DWRITE_FONT_WEIGHT_NORMAL, "got %d\n", weight); ok(range.length == 6, "got %d\n", range.length); + size = IDWriteTextLayout_GetMaxWidth(layout); + ok(size == 100.0, "got %.2f\n", size); + + hr = IDWriteTextLayout_SetMaxWidth(layout, 0.0); + ok(hr == S_OK, "got 0x%08x\n", hr); + + size = IDWriteTextLayout_GetMaxWidth(layout); + ok(size == 0.0, "got %.2f\n", size); + + hr = IDWriteTextLayout_SetMaxWidth(layout, -1.0); + ok(hr == E_INVALIDARG, "got 0x%08x\n", hr); + + size = IDWriteTextLayout_GetMaxWidth(layout); + ok(size == 0.0, "got %.2f\n", size); + + hr = IDWriteTextLayout_SetMaxWidth(layout, 100.0); + ok(hr == S_OK, "got 0x%08x\n", hr); + + size = IDWriteTextLayout_GetMaxWidth(layout); + ok(size == 100.0, "got %.2f\n", size); + + size = IDWriteTextLayout_GetMaxHeight(layout); + ok(size == 100.0, "got %.2f\n", size); + + hr = IDWriteTextLayout_SetMaxHeight(layout, 0.0); + ok(hr == S_OK, "got 0x%08x\n", hr); + + size = IDWriteTextLayout_GetMaxHeight(layout); + ok(size == 0.0, "got %.2f\n", size); + + hr = IDWriteTextLayout_SetMaxHeight(layout, -1.0); + ok(hr == E_INVALIDARG, "got 0x%08x\n", hr); + + size = IDWriteTextLayout_GetMaxHeight(layout); + ok(size == 0.0, "got %.2f\n", size); + + hr = IDWriteTextLayout_SetMaxHeight(layout, 100.0); + ok(hr == S_OK, "got 0x%08x\n", hr); + + size = IDWriteTextLayout_GetMaxHeight(layout); + ok(size == 100.0, "got %.2f\n", size); + IDWriteTextLayout_Release(layout); IDWriteTextFormat_Release(fmt2); IDWriteTextFormat_Release(format);