Signed-off-by: Henri Verbeet hverbeet@codeweavers.com --- dlls/usp10/opentype.c | 79 +++++++++++++++++++++++---------------------------- 1 file changed, 35 insertions(+), 44 deletions(-)
diff --git a/dlls/usp10/opentype.c b/dlls/usp10/opentype.c index 49a88a6991d..299c301758c 100644 --- a/dlls/usp10/opentype.c +++ b/dlls/usp10/opentype.c @@ -2675,6 +2675,23 @@ HRESULT OpenType_GetFontScriptTags(ScriptCache *psc, OPENTYPE_TAG searchingFor, return rc; }
+static LoadedLanguage *usp10_script_add_language(LoadedScript *script, OPENTYPE_TAG tag) +{ + LoadedLanguage *language; + + if (!usp10_array_reserve((void **)&script->languages, &script->languages_size, + script->language_count + 1, sizeof(*script->languages))) + { + ERR("Failed to grow languages array.\n"); + return NULL; + } + + language = &script->languages[script->language_count++]; + language->tag = tag; + + return language; +} + static LoadedLanguage *usp10_script_get_language(LoadedScript *script, OPENTYPE_TAG tag) { size_t i; @@ -2727,62 +2744,36 @@ static void GSUB_initialize_language_cache(LoadedScript *script)
static void GPOS_expand_language_cache(LoadedScript *script) { - int count; - const OT_Script *table = script->table[USP10_SCRIPT_TABLE_GPOS]; + SIZE_T initial_count, count, i; LoadedLanguage *language; + const OT_Script *table; + OPENTYPE_TAG tag; DWORD offset;
- if (!table) + if (!(table = script->table[USP10_SCRIPT_TABLE_GPOS])) return;
- offset = GET_BE_WORD(table->DefaultLangSys); - if (offset) - script->default_language.gpos_table = (const BYTE*)table + offset; - - count = GET_BE_WORD(table->LangSysCount); - - TRACE("Deflang %p, LangCount %i\n",script->default_language.gpos_table, count); + if ((offset = GET_BE_WORD(table->DefaultLangSys))) + script->default_language.gpos_table = (const BYTE *)table + offset;
- if (!count) + if (!(count = GET_BE_WORD(table->LangSysCount))) return;
- if (!script->language_count) - { - int i; - script->language_count = count; - - script->languages = heap_alloc_zero(script->language_count * sizeof(*script->languages)); + TRACE("Deflang %p, LangCount %lu.\n", script->default_language.gpos_table, count);
- for (i = 0; i < script->language_count; i++) - { - int offset = GET_BE_WORD(table->LangSysRecord[i].LangSys); - script->languages[i].tag = MS_MAKE_TAG(table->LangSysRecord[i].LangSysTag[0], table->LangSysRecord[i].LangSysTag[1], table->LangSysRecord[i].LangSysTag[2], table->LangSysRecord[i].LangSysTag[3]); - script->languages[i].gpos_table = ((const BYTE*)table + offset); - } - } - else if (count) + initial_count = script->language_count; + for (i = 0; i < count; ++i) { - int i; - for (i = 0; i < count; i++) - { - int offset = GET_BE_WORD(table->LangSysRecord[i].LangSys); - OPENTYPE_TAG tag = MS_MAKE_TAG(table->LangSysRecord[i].LangSysTag[0], table->LangSysRecord[i].LangSysTag[1], table->LangSysRecord[i].LangSysTag[2], table->LangSysRecord[i].LangSysTag[3]); + tag = MS_MAKE_TAG(table->LangSysRecord[i].LangSysTag[0], + table->LangSysRecord[i].LangSysTag[1], + table->LangSysRecord[i].LangSysTag[2], + table->LangSysRecord[i].LangSysTag[3]);
- if (!(language = usp10_script_get_language(script, tag))) - { - if (!usp10_array_reserve((void **)&script->languages, &script->languages_size, - script->language_count + 1, sizeof(*script->languages))) - { - ERR("Failed grow languages array.\n"); - return; - } + if (!(initial_count && (language = usp10_script_get_language(script, tag))) + && !(language = usp10_script_add_language(script, tag))) + return;
- language = &script->languages[script->language_count]; - ++script->language_count; - language->tag = tag; - } - language->gpos_table = (const BYTE *)table + offset; - } + language->gpos_table = (const BYTE *)table + GET_BE_WORD(table->LangSysRecord[i].LangSys); } }
Signed-off-by: Aric Stewart aric@codeweavers.com
On 3/20/18 6:41 AM, Henri Verbeet wrote:
Signed-off-by: Henri Verbeet hverbeet@codeweavers.com
dlls/usp10/opentype.c | 79 +++++++++++++++++++++++---------------------------- 1 file changed, 35 insertions(+), 44 deletions(-)
diff --git a/dlls/usp10/opentype.c b/dlls/usp10/opentype.c index 49a88a6991d..299c301758c 100644 --- a/dlls/usp10/opentype.c +++ b/dlls/usp10/opentype.c @@ -2675,6 +2675,23 @@ HRESULT OpenType_GetFontScriptTags(ScriptCache *psc, OPENTYPE_TAG searchingFor, return rc; }
+static LoadedLanguage *usp10_script_add_language(LoadedScript *script, OPENTYPE_TAG tag) +{
- LoadedLanguage *language;
- if (!usp10_array_reserve((void **)&script->languages, &script->languages_size,
script->language_count + 1, sizeof(*script->languages)))
- {
ERR("Failed to grow languages array.\n");
return NULL;
- }
- language = &script->languages[script->language_count++];
- language->tag = tag;
- return language;
+}
- static LoadedLanguage *usp10_script_get_language(LoadedScript *script, OPENTYPE_TAG tag) { size_t i;
@@ -2727,62 +2744,36 @@ static void GSUB_initialize_language_cache(LoadedScript *script)
static void GPOS_expand_language_cache(LoadedScript *script) {
- int count;
- const OT_Script *table = script->table[USP10_SCRIPT_TABLE_GPOS];
- SIZE_T initial_count, count, i; LoadedLanguage *language;
- const OT_Script *table;
- OPENTYPE_TAG tag; DWORD offset;
- if (!table)
- if (!(table = script->table[USP10_SCRIPT_TABLE_GPOS])) return;
- offset = GET_BE_WORD(table->DefaultLangSys);
- if (offset)
script->default_language.gpos_table = (const BYTE*)table + offset;
- count = GET_BE_WORD(table->LangSysCount);
- TRACE("Deflang %p, LangCount %i\n",script->default_language.gpos_table, count);
- if ((offset = GET_BE_WORD(table->DefaultLangSys)))
script->default_language.gpos_table = (const BYTE *)table + offset;
- if (!count)
- if (!(count = GET_BE_WORD(table->LangSysCount))) return;
- if (!script->language_count)
- {
int i;
script->language_count = count;
script->languages = heap_alloc_zero(script->language_count * sizeof(*script->languages));
- TRACE("Deflang %p, LangCount %lu.\n", script->default_language.gpos_table, count);
for (i = 0; i < script->language_count; i++)
{
int offset = GET_BE_WORD(table->LangSysRecord[i].LangSys);
script->languages[i].tag = MS_MAKE_TAG(table->LangSysRecord[i].LangSysTag[0], table->LangSysRecord[i].LangSysTag[1], table->LangSysRecord[i].LangSysTag[2], table->LangSysRecord[i].LangSysTag[3]);
script->languages[i].gpos_table = ((const BYTE*)table + offset);
}
- }
- else if (count)
- initial_count = script->language_count;
- for (i = 0; i < count; ++i) {
int i;
for (i = 0; i < count; i++)
{
int offset = GET_BE_WORD(table->LangSysRecord[i].LangSys);
OPENTYPE_TAG tag = MS_MAKE_TAG(table->LangSysRecord[i].LangSysTag[0], table->LangSysRecord[i].LangSysTag[1], table->LangSysRecord[i].LangSysTag[2], table->LangSysRecord[i].LangSysTag[3]);
tag = MS_MAKE_TAG(table->LangSysRecord[i].LangSysTag[0],
table->LangSysRecord[i].LangSysTag[1],
table->LangSysRecord[i].LangSysTag[2],
table->LangSysRecord[i].LangSysTag[3]);
if (!(language = usp10_script_get_language(script, tag)))
{
if (!usp10_array_reserve((void **)&script->languages, &script->languages_size,
script->language_count + 1, sizeof(*script->languages)))
{
ERR("Failed grow languages array.\n");
return;
}
if (!(initial_count && (language = usp10_script_get_language(script, tag)))
&& !(language = usp10_script_add_language(script, tag)))
return;
language = &script->languages[script->language_count];
++script->language_count;
language->tag = tag;
}
language->gpos_table = (const BYTE *)table + offset;
}
}language->gpos_table = (const BYTE *)table + GET_BE_WORD(table->LangSysRecord[i].LangSys); }