Module: wine Branch: master Commit: 40d9a2b6d234e85d79d599df7dd8ae97e62fad0b URL: http://source.winehq.org/git/wine.git/?a=commit;h=40d9a2b6d234e85d79d599df7d...
Author: Nikolay Sivov nsivov@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);