From 40d9a2b6d234e85d79d599df7dd8ae97e62fad0b Mon Sep 17 00:00:00 2001 From: Nikolay Sivov Date: Mon, 26 Jan 2015 13:39:18 +0300 Subject: [PATCH] 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 58273fee12d..5a2ce2c9d3d 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 8fa5a54dfd8..7b3fb1f0d78 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);