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