diff --git a/dlls/usp10/opentype.c b/dlls/usp10/opentype.c index 85eacf9f247..a48a6070917 100644 --- a/dlls/usp10/opentype.c +++ b/dlls/usp10/opentype.c @@ -1898,6 +1898,9 @@ static void GPOS_expand_script_cache(ScriptCache *psc) script = (const OT_ScriptList*)((const BYTE*)header + GET_BE_WORD(header->ScriptList)); count = GET_BE_WORD(script->ScriptCount); + if (!count) + return; + if (!psc->script_count) { psc->script_count = count; @@ -1941,10 +1944,11 @@ static void GPOS_expand_script_cache(ScriptCache *psc) static void _initialize_script_cache(ScriptCache *psc) { - if (!psc->script_count) + if (!psc->scripts_initialized) { GSUB_initialize_script_cache(psc); GPOS_expand_script_cache(psc); + psc->scripts_initialized = TRUE; } } @@ -2029,6 +2033,10 @@ static void GPOS_expand_language_cache(LoadedScript *script) count = GET_BE_WORD(table->LangSysCount); TRACE("Deflang %p, LangCount %i\n",script->default_language.gpos_table, count); + + if (!count) + return; + if (!script->language_count) { int i; @@ -2072,10 +2080,11 @@ static void GPOS_expand_language_cache(LoadedScript *script) static void _initialize_language_cache(LoadedScript *script) { - if (!script->language_count) + if (!script->languages_initialized) { GSUB_initialize_language_cache(script); GPOS_expand_language_cache(script); + script->languages_initialized = TRUE; } } @@ -2194,6 +2203,10 @@ static void GPOS_expand_feature_cache(LPCVOID table, LoadedLanguage *language) feature_list = (const OT_FeatureList*)((const BYTE*)header + GET_BE_WORD(header->FeatureList)); TRACE("%i features\n",count); + + if (!count) + return; + if (!language->feature_count) { language->feature_count = count; @@ -2219,7 +2232,7 @@ static void GPOS_expand_feature_cache(LPCVOID table, LoadedLanguage *language) } } } - else if (count) + else { language->features = HeapReAlloc(GetProcessHeap(),0,language->features, sizeof(LoadedFeature)*(language->feature_count + count)); @@ -2245,10 +2258,11 @@ static void GPOS_expand_feature_cache(LPCVOID table, LoadedLanguage *language) static void _initialize_feature_cache(ScriptCache *psc, LoadedLanguage *language) { - if (!language->feature_count) + if (!language->features_initialized) { GSUB_initialize_feature_cache(psc->GSUB_Table, language); GPOS_expand_feature_cache(psc->GPOS_Table, language); + language->features_initialized = TRUE; } } diff --git a/dlls/usp10/usp10_internal.h b/dlls/usp10/usp10_internal.h index 3ada1c43d09..77bb20d2012 100644 --- a/dlls/usp10/usp10_internal.h +++ b/dlls/usp10/usp10_internal.h @@ -144,6 +144,7 @@ typedef struct { OPENTYPE_TAG tag; LPCVOID gsub_table; LPCVOID gpos_table; + BOOL features_initialized; INT feature_count; LoadedFeature *features; } LoadedLanguage; @@ -153,6 +154,7 @@ typedef struct { LPCVOID gsub_table; LPCVOID gpos_table; LoadedLanguage default_language; + BOOL languages_initialized; INT language_count; LoadedLanguage *languages; } LoadedScript; @@ -174,6 +176,7 @@ typedef struct { LPVOID CMAP_Table; LPVOID CMAP_format12_Table; LPVOID GPOS_Table; + BOOL scripts_initialized; INT script_count; LoadedScript *scripts;