Module: wine Branch: master Commit: b1094bc7d7c9c22118b8fd07ffad85b79bec0dc7 URL: http://source.winehq.org/git/wine.git/?a=commit;h=b1094bc7d7c9c22118b8fd07ff...
Author: Nikolay Sivov nsivov@codeweavers.com Date: Fri Jan 8 12:55:37 2016 +0300
dwrite: Store locale name in lower case for text format.
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/dwrite/layout.c | 8 +++++++- dlls/dwrite/tests/layout.c | 29 ++++++++++++++++++++++++++++- 2 files changed, 35 insertions(+), 2 deletions(-)
diff --git a/dlls/dwrite/layout.c b/dlls/dwrite/layout.c index ef8d8bf..d4b3557 100644 --- a/dlls/dwrite/layout.c +++ b/dlls/dwrite/layout.c @@ -1,7 +1,7 @@ /* * Text format and layout * - * Copyright 2012, 2014-2015 Nikolay Sivov for CodeWeavers + * Copyright 2012, 2014-2016 Nikolay Sivov for CodeWeavers * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -3923,7 +3923,11 @@ static HRESULT layout_format_from_textformat(struct dwrite_textlayout *layout, I layout->format.locale = heap_strdupW(textformat->format.locale); layout->format.family_name = heap_strdupW(textformat->format.family_name); if (!layout->format.locale || !layout->format.family_name) + { + heap_free(layout->format.locale); + heap_free(layout->format.family_name); return E_OUTOFMEMORY; + }
if (layout->format.trimmingsign) IDWriteInlineObject_AddRef(layout->format.trimmingsign); @@ -4662,6 +4666,8 @@ HRESULT create_textformat(const WCHAR *family_name, IDWriteFontCollection *colle This->format.family_len = strlenW(family_name); This->format.locale = heap_strdupW(locale); This->format.locale_len = strlenW(locale); + /* force locale name to lower case, layout will inherit this modified value */ + strlwrW(This->format.locale); This->format.weight = weight; This->format.style = style; This->format.fontsize = size; diff --git a/dlls/dwrite/tests/layout.c b/dlls/dwrite/tests/layout.c index 888edb9..bb5963f 100644 --- a/dlls/dwrite/tests/layout.c +++ b/dlls/dwrite/tests/layout.c @@ -1999,7 +1999,7 @@ static void test_SetLocaleName(void) static const WCHAR eNuSW[] = {'e','N','-','u','S',0}; static const WCHAR strW[] = {'a','b','c','d',0}; WCHAR buffW[LOCALE_NAME_MAX_LENGTH+sizeof(strW)/sizeof(WCHAR)]; - IDWriteTextFormat *format; + IDWriteTextFormat *format, *format2; IDWriteTextLayout *layout; DWRITE_TEXT_RANGE range; IDWriteFactory *factory; @@ -2007,6 +2007,33 @@ static void test_SetLocaleName(void)
factory = create_factory();
+ /* create format with mixed case locale name, get it back */ + 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 = IDWriteTextFormat_GetLocaleName(format, buffW, sizeof(buffW)/sizeof(buffW[0])); + ok(hr == S_OK, "got 0x%08x\n", hr); + ok(!lstrcmpW(buffW, enusW), "got %s\n", wine_dbgstr_w(buffW)); + + hr = IDWriteFactory_CreateTextLayout(factory, strW, 4, format, 1000.0, 1000.0, &layout); + ok(hr == S_OK, "got 0x%08x\n", hr); + + hr = IDWriteTextLayout_QueryInterface(layout, &IID_IDWriteTextFormat, (void**)&format2); + ok(hr == S_OK, "got 0x%08x\n", hr); + + hr = IDWriteTextFormat_GetLocaleName(format2, buffW, sizeof(buffW)/sizeof(buffW[0])); + ok(hr == S_OK, "got 0x%08x\n", hr); + ok(!lstrcmpW(buffW, enusW), "got %s\n", wine_dbgstr_w(buffW)); + + hr = IDWriteTextLayout_GetLocaleName(layout, 0, buffW, sizeof(buffW)/sizeof(buffW[0]), NULL); + ok(hr == S_OK, "got 0x%08x\n", hr); + ok(!lstrcmpW(buffW, enusW), "got %s\n", wine_dbgstr_w(buffW)); + + IDWriteTextFormat_Release(format2); + IDWriteTextLayout_Release(layout); + IDWriteTextFormat_Release(format); + 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);