Nikolay Sivov : dwrite: Make sure we don't have duplicates in locale/ value pairs for font names.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Jan 26 15:59:19 CST 2015


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

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Mon Jan 26 13:39:18 2015 +0300

dwrite: Make sure we don't have duplicates in locale/value pairs for font names.

---

 dlls/dwrite/main.c     | 20 +++++++++++++++++++-
 dlls/dwrite/opentype.c | 14 ++++++++++++++
 2 files changed, 33 insertions(+), 1 deletion(-)

diff --git a/dlls/dwrite/main.c b/dlls/dwrite/main.c
index 58273fe..5a2ce2c 100644
--- a/dlls/dwrite/main.c
+++ b/dlls/dwrite/main.c
@@ -383,14 +383,32 @@ HRESULT create_localizedstrings(IDWriteLocalizedStrings **strings)
 HRESULT add_localizedstring(IDWriteLocalizedStrings *iface, const WCHAR *locale, const WCHAR *string)
 {
     struct localizedstrings *This = impl_from_IDWriteLocalizedStrings(iface);
+    UINT32 i;
+
+    /* make sure there's no duplicates */
+    for (i = 0; i < This->count; i++)
+        if (!strcmpW(This->data[i].locale, locale))
+            return S_OK;
 
     if (This->count == This->alloc) {
+        void *ptr;
+
+        ptr = heap_realloc(This->data, 2*This->alloc*sizeof(struct localizedpair));
+        if (!ptr)
+            return E_OUTOFMEMORY;
+
         This->alloc *= 2;
-        This->data = heap_realloc(This->data, This->alloc*sizeof(struct localizedpair));
+        This->data = ptr;
     }
 
     This->data[This->count].locale = heap_strdupW(locale);
     This->data[This->count].string = heap_strdupW(string);
+    if (!This->data[This->count].locale || !This->data[This->count].string) {
+        heap_free(This->data[This->count].locale);
+        heap_free(This->data[This->count].string);
+        return E_OUTOFMEMORY;
+    }
+
     This->count++;
 
     return S_OK;
diff --git a/dlls/dwrite/opentype.c b/dlls/dwrite/opentype.c
index 8fa5a54..7b3fb1f 100644
--- a/dlls/dwrite/opentype.c
+++ b/dlls/dwrite/opentype.c
@@ -1194,6 +1194,14 @@ HRESULT opentype_get_font_strings_from_id(const void *table_data, DWRITE_INFORMA
     if (FAILED(hr)) return hr;
 
     header = table_data;
+
+    switch (header->format) {
+    case 0:
+        break;
+    default:
+        FIXME("unsupported NAME format %d\n", header->format);
+    }
+
     storage_area = (LPBYTE)table_data + GET_BE_WORD(header->stringOffset);
     count = GET_BE_WORD(header->count);
 
@@ -1219,6 +1227,12 @@ HRESULT opentype_get_font_strings_from_id(const void *table_data, DWRITE_INFORMA
             continue;
         }
 
+        /* Skip such entries for now, as it's not clear which locale is implied when
+           unicode platform is used. Also fonts tend to duplicate those strings as
+           WIN platform entries. */
+        if (platform == OPENTYPE_PLATFORM_UNICODE)
+            continue;
+
         lang_id = GET_BE_WORD(record->languageID);
         length = GET_BE_WORD(record->length);
         offset = GET_BE_WORD(record->offset);




More information about the wine-cvs mailing list