Nikolay Sivov : dwrite: Locale layout ranged attribute is case-insensitive.

Alexandre Julliard julliard at wine.codeweavers.com
Fri Dec 25 11:19:22 CST 2015


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

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Fri Dec 25 15:58:01 2015 +0300

dwrite: Locale layout ranged attribute is case-insensitive.

Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 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);




More information about the wine-cvs mailing list