dwrite: Make sure we don't have duplicates in locale/value pairs for font names.
This commit is contained in:
parent
6b0623fb2f
commit
40d9a2b6d2
|
@ -383,14 +383,32 @@ HRESULT create_localizedstrings(IDWriteLocalizedStrings **strings)
|
||||||
HRESULT add_localizedstring(IDWriteLocalizedStrings *iface, const WCHAR *locale, const WCHAR *string)
|
HRESULT add_localizedstring(IDWriteLocalizedStrings *iface, const WCHAR *locale, const WCHAR *string)
|
||||||
{
|
{
|
||||||
struct localizedstrings *This = impl_from_IDWriteLocalizedStrings(iface);
|
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) {
|
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->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].locale = heap_strdupW(locale);
|
||||||
This->data[This->count].string = heap_strdupW(string);
|
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++;
|
This->count++;
|
||||||
|
|
||||||
return S_OK;
|
return S_OK;
|
||||||
|
|
|
@ -1194,6 +1194,14 @@ HRESULT opentype_get_font_strings_from_id(const void *table_data, DWRITE_INFORMA
|
||||||
if (FAILED(hr)) return hr;
|
if (FAILED(hr)) return hr;
|
||||||
|
|
||||||
header = table_data;
|
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);
|
storage_area = (LPBYTE)table_data + GET_BE_WORD(header->stringOffset);
|
||||||
count = GET_BE_WORD(header->count);
|
count = GET_BE_WORD(header->count);
|
||||||
|
|
||||||
|
@ -1219,6 +1227,12 @@ HRESULT opentype_get_font_strings_from_id(const void *table_data, DWRITE_INFORMA
|
||||||
continue;
|
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);
|
lang_id = GET_BE_WORD(record->languageID);
|
||||||
length = GET_BE_WORD(record->length);
|
length = GET_BE_WORD(record->length);
|
||||||
offset = GET_BE_WORD(record->offset);
|
offset = GET_BE_WORD(record->offset);
|
||||||
|
|
Loading…
Reference in New Issue