dwrite: Force reported English family/face names to resolved values

Nikolay Sivov nsivov at codeweavers.com
Tue Sep 1 04:09:24 CDT 2015


---
-------------- next part --------------
From 79bda789b559a8f6d94b4fae8c60aca52a514e25 Mon Sep 17 00:00:00 2001
From: Nikolay Sivov <nsivov at codeweavers.com>
Date: Tue, 1 Sep 2015 12:02:57 +0300
Subject: [PATCH] dwrite: Force reported English family/face names to resolved
 values

---
 dlls/dwrite/dwrite_private.h |  1 +
 dlls/dwrite/font.c           | 32 ++++++++++++++++++++++----------
 dlls/dwrite/main.c           | 17 ++++++++++++++++-
 3 files changed, 39 insertions(+), 11 deletions(-)

diff --git a/dlls/dwrite/dwrite_private.h b/dlls/dwrite/dwrite_private.h
index a7b8c46..70aadcc 100644
--- a/dlls/dwrite/dwrite_private.h
+++ b/dlls/dwrite/dwrite_private.h
@@ -122,6 +122,7 @@ extern void    release_gdiinterop(IDWriteGdiInterop*) DECLSPEC_HIDDEN;
 extern HRESULT create_localizedstrings(IDWriteLocalizedStrings**) DECLSPEC_HIDDEN;
 extern HRESULT add_localizedstring(IDWriteLocalizedStrings*,const WCHAR*,const WCHAR*) DECLSPEC_HIDDEN;
 extern HRESULT clone_localizedstring(IDWriteLocalizedStrings *iface, IDWriteLocalizedStrings **strings) DECLSPEC_HIDDEN;
+extern void    set_en_localizedstring(IDWriteLocalizedStrings*,const WCHAR*) DECLSPEC_HIDDEN;
 extern HRESULT get_system_fontcollection(IDWriteFactory2*,IDWriteFontCollection**) DECLSPEC_HIDDEN;
 extern HRESULT get_eudc_fontcollection(IDWriteFactory2*,IDWriteFontCollection**) DECLSPEC_HIDDEN;
 extern HRESULT get_textanalyzer(IDWriteTextAnalyzer**) DECLSPEC_HIDDEN;
diff --git a/dlls/dwrite/font.c b/dlls/dwrite/font.c
index 63ad277..928222d 100644
--- a/dlls/dwrite/font.c
+++ b/dlls/dwrite/font.c
@@ -1985,7 +1985,8 @@ static int trim_spaces(WCHAR *in, WCHAR *ret)
 struct name_token {
     struct list entry;
     const WCHAR *ptr;
-    INT len;
+    INT len;     /* token length */
+    INT fulllen; /* full length including following separators */
 };
 
 static inline BOOL is_name_separator_char(WCHAR ch)
@@ -2406,7 +2407,7 @@ static inline void font_name_token_to_str(const struct name_token *name, WCHAR *
     strW[name->len] = 0;
 }
 
-static void font_apply_differentiation_rules(struct dwrite_font_data *font, WCHAR *familyW, WCHAR *faceW)
+static BOOL font_apply_differentiation_rules(struct dwrite_font_data *font, WCHAR *familyW, WCHAR *faceW)
 {
     static const WCHAR bookW[] = {'B','o','o','k',0};
     static const WCHAR normalW[] = {'N','o','r','m','a','l',0};
@@ -2473,15 +2474,19 @@ static void font_apply_differentiation_rules(struct dwrite_font_data *font, WCHA
         struct name_token *token = heap_alloc(sizeof(*token));
         token->ptr = ptr;
         token->len = 0;
+        token->fulllen = 0;
 
         while (*ptr && !is_name_separator_char(*ptr)) {
             token->len++;
+            token->fulllen++;
             ptr++;
         }
 
         /* skip separators */
-        while (is_name_separator_char(*ptr))
+        while (is_name_separator_char(*ptr)) {
+            token->fulllen++;
             ptr++;
+        }
 
         list_add_head(&tokens, &token->entry);
     }
@@ -2526,19 +2531,22 @@ static void font_apply_differentiation_rules(struct dwrite_font_data *font, WCHA
 
     /* get final combined string from what's left in token list, list is released */
     ptrW = finalW;
-    *ptrW = 0;
     LIST_FOR_EACH_ENTRY_SAFE_REV(token, token2, &tokens, struct name_token, entry) {
-        if (*finalW)
-            *(ptrW++) = ' ';
-        memcpy(ptrW, token->ptr, token->len * sizeof(WCHAR));
-        ptrW += token->len;
+        int len;
+
         list_remove(&token->entry);
+
+        /* don't include last separator */
+        len = list_empty(&tokens) ? token->len : token->fulllen;
+        memcpy(ptrW, token->ptr, len * sizeof(WCHAR));
+        ptrW += len;
+
         heap_free(token);
     }
     *ptrW = 0;
 
     if (!strcmpW(familyW, finalW))
-        return;
+        return FALSE;
 
     /* construct face name */
     strcpyW(familyW, finalW);
@@ -2620,6 +2628,7 @@ static void font_apply_differentiation_rules(struct dwrite_font_data *font, WCHA
     }
 
     TRACE("resolved family %s, face %s\n", debugstr_w(familyW), debugstr_w(faceW));
+    return TRUE;
 }
 
 static HRESULT init_font_data(IDWriteFactory2 *factory, IDWriteFontFile *file, DWRITE_FONT_FACE_TYPE face_type, UINT32 face_index,
@@ -2670,7 +2679,10 @@ static HRESULT init_font_data(IDWriteFactory2 *factory, IDWriteFontFile *file, D
 
     fontstrings_get_en_string(*family_name, familyW, sizeof(familyW)/sizeof(WCHAR));
     fontstrings_get_en_string(data->names, faceW, sizeof(faceW)/sizeof(WCHAR));
-    font_apply_differentiation_rules(data, familyW, faceW);
+    if (font_apply_differentiation_rules(data, familyW, faceW)) {
+        set_en_localizedstring(*family_name, familyW);
+        set_en_localizedstring(data->names, faceW);
+    }
 
     init_font_prop_vec(data->weight, data->stretch, data->style, &data->propvec);
 
diff --git a/dlls/dwrite/main.c b/dlls/dwrite/main.c
index 01a4012..ce4299c 100644
--- a/dlls/dwrite/main.c
+++ b/dlls/dwrite/main.c
@@ -438,7 +438,7 @@ HRESULT add_localizedstring(IDWriteLocalizedStrings *iface, const WCHAR *locale,
 }
 
 HRESULT clone_localizedstring(IDWriteLocalizedStrings *iface, IDWriteLocalizedStrings **ret)
- {
+{
     struct localizedstrings *strings, *strings_clone;
     int i;
 
@@ -471,6 +471,21 @@ HRESULT clone_localizedstring(IDWriteLocalizedStrings *iface, IDWriteLocalizedSt
     return S_OK;
 }
 
+void set_en_localizedstring(IDWriteLocalizedStrings *iface, const WCHAR *string)
+{
+    static const WCHAR enusW[] = {'e','n','-','U','S',0};
+    struct localizedstrings *This = impl_from_IDWriteLocalizedStrings(iface);
+    UINT32 i;
+
+    for (i = 0; i < This->count; i++) {
+        if (!strcmpiW(This->data[i].locale, enusW)) {
+            heap_free(This->data[i].string);
+            This->data[i].string = heap_strdupW(string);
+            break;
+        }
+    }
+}
+
 struct collectionloader
 {
     struct list entry;
-- 
2.1.4



More information about the wine-patches mailing list