[PATCH 6/7] dwrite: Locale layout ranged attribute is case-insensitive
Nikolay Sivov
nsivov at codeweavers.com
Fri Dec 25 06:58:01 CST 2015
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
dlls/dwrite/layout.c | 6 +++---
dlls/dwrite/tests/layout.c | 28 +++++++++++++++++++++++++++-
2 files changed, 30 insertions(+), 4 deletions(-)
diff --git a/dlls/dwrite/layout.c b/dlls/dwrite/layout.c
index 30fade6..62beea4 100644
--- a/dlls/dwrite/layout.c
+++ b/dlls/dwrite/layout.c
@@ -1600,7 +1600,7 @@ static BOOL is_same_layout_attrvalue(struct layout_range_header const *h, enum l
case LAYOUT_RANGE_ATTR_FONTCOLL:
return range->collection == value->u.collection;
case LAYOUT_RANGE_ATTR_LOCALE:
- return strcmpW(range->locale, value->u.locale) == 0;
+ return strcmpiW(range->locale, value->u.locale) == 0;
case LAYOUT_RANGE_ATTR_FONTFAMILY:
return strcmpW(range->fontfamily, value->u.fontfamily) == 0;
case LAYOUT_RANGE_ATTR_SPACING:
@@ -1632,7 +1632,7 @@ static inline BOOL is_same_layout_attributes(struct layout_range_header const *h
left->underline == right->underline &&
left->pair_kerning == right->pair_kerning &&
left->collection == right->collection &&
- !strcmpW(left->locale, right->locale) &&
+ !strcmpiW(left->locale, right->locale) &&
!strcmpW(left->fontfamily, right->fontfamily);
}
case LAYOUT_RANGE_STRIKETHROUGH:
@@ -1973,7 +1973,7 @@ static BOOL set_layout_range_attrval(struct layout_range_header *h, enum layout_
changed = set_layout_range_iface_attr((IUnknown**)&dest->collection, (IUnknown*)value->u.collection);
break;
case LAYOUT_RANGE_ATTR_LOCALE:
- changed = strcmpW(dest->locale, value->u.locale) != 0;
+ changed = strcmpiW(dest->locale, value->u.locale) != 0;
if (changed)
strcpyW(dest->locale, value->u.locale);
break;
diff --git a/dlls/dwrite/tests/layout.c b/dlls/dwrite/tests/layout.c
index 6bcc538..da7dfe9 100644
--- a/dlls/dwrite/tests/layout.c
+++ b/dlls/dwrite/tests/layout.c
@@ -1982,6 +1982,7 @@ todo_wine {
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;
@@ -2018,9 +2019,11 @@ if (0) /* crashes on native */
hr = IDWriteTextLayout_GetLocaleName(layout, 0, NULL, 1, NULL);
buffW[0] = 0;
- hr = IDWriteTextLayout_GetLocaleName(layout, 0, buffW, sizeof(buffW)/sizeof(WCHAR), NULL);
+ range.length = 0;
+ hr = IDWriteTextLayout_GetLocaleName(layout, 0, buffW, sizeof(buffW)/sizeof(WCHAR), &range);
ok(hr == S_OK, "got 0x%08x\n", hr);
ok(!lstrcmpW(buffW, strW), "got %s\n", wine_dbgstr_w(buffW));
+ ok(range.startPosition == 0 && range.length == 1, "got %u,%u\n", range.startPosition, range.length);
/* get with a shorter buffer */
buffW[0] = 0xa;
@@ -2043,6 +2046,29 @@ if (0) /* crashes on native */
ok(hr == S_OK, "got 0x%08x\n", hr);
ok(!lstrcmpW(buffW, strW), "got %s\n", wine_dbgstr_w(buffW));
+ /* set initial locale name for whole text, except with a different casing */
+ range.startPosition = 0;
+ range.length = 4;
+ hr = IDWriteTextLayout_SetLocaleName(layout, eNuSW, range);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+
+ buffW[0] = 0;
+ range.length = 0;
+ hr = IDWriteTextLayout_GetLocaleName(layout, 0, buffW, sizeof(buffW)/sizeof(WCHAR), &range);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+todo_wine {
+ ok(!lstrcmpW(buffW, enusW), "got %s\n", wine_dbgstr_w(buffW));
+ ok(range.startPosition == 0 && range.length == ~0u, "got %u,%u\n", range.startPosition, range.length);
+}
+ /* check what's returned for positions after the text */
+ buffW[0] = 0;
+ range.length = 0;
+ hr = IDWriteTextLayout_GetLocaleName(layout, 100, buffW, sizeof(buffW)/sizeof(WCHAR), &range);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+ ok(!lstrcmpW(buffW, enusW), "got %s\n", wine_dbgstr_w(buffW));
+todo_wine
+ ok(range.startPosition == 0 && range.length == ~0u, "got %u,%u\n", range.startPosition, range.length);
+
IDWriteTextLayout_Release(layout);
IDWriteTextFormat_Release(format);
IDWriteFactory_Release(factory);
--
2.6.4
More information about the wine-patches
mailing list