Module: wine Branch: master Commit: e626524e3b58b72d77b8cd89a09a2b3434ae3a94 URL: https://source.winehq.org/git/wine.git/?a=commit;h=e626524e3b58b72d77b8cd89a...
Author: Henri Verbeet hverbeet@codeweavers.com Date: Wed Mar 21 13:18:53 2018 +0330
usp10: Merge GSUB_initialize_language_cache() and GPOS_expand_language_cache().
Signed-off-by: Henri Verbeet hverbeet@codeweavers.com Signed-off-by: Aric Stewart aric@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/usp10/opentype.c | 97 ++++++++++++++++----------------------------- dlls/usp10/usp10_internal.h | 10 ++++- 2 files changed, 42 insertions(+), 65 deletions(-)
diff --git a/dlls/usp10/opentype.c b/dlls/usp10/opentype.c index 299c301..8827265 100644 --- a/dlls/usp10/opentype.c +++ b/dlls/usp10/opentype.c @@ -2705,86 +2705,57 @@ static LoadedLanguage *usp10_script_get_language(LoadedScript *script, OPENTYPE_ return NULL; }
-static void GSUB_initialize_language_cache(LoadedScript *script) -{ - const OT_Script *table; - DWORD offset; - SIZE_T i; - - if (!(table = script->table[USP10_SCRIPT_TABLE_GSUB])) - return; - - if ((offset = GET_BE_WORD(table->DefaultLangSys))) - { - script->default_language.tag = MS_MAKE_TAG('d','f','l','t'); - script->default_language.gsub_table = (const BYTE *)table + offset; - } - - if (!(script->language_count = GET_BE_WORD(table->LangSysCount))) - return; - - TRACE("Deflang %p, LangCount %lu.\n", script->default_language.gsub_table, script->language_count); - - if (!usp10_array_reserve((void **)&script->languages, &script->languages_size, - script->language_count, sizeof(*script->languages))) - { - ERR("Failed to grow languages array.\n"); - return; - } - - for (i = 0; i < script->language_count; ++i) - { - 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].gsub_table = (const BYTE *)table + GET_BE_WORD(table->LangSysRecord[i].LangSys); - } -} - -static void GPOS_expand_language_cache(LoadedScript *script) +static void usp10_script_add_language_list(LoadedScript *script, + enum usp10_language_table table, const OT_Script *list) { SIZE_T initial_count, count, i; LoadedLanguage *language; - const OT_Script *table; OPENTYPE_TAG tag; DWORD offset;
- if (!(table = script->table[USP10_SCRIPT_TABLE_GPOS])) - return; + TRACE("script %p, table %#x, list %p.\n", script, table, list);
- if ((offset = GET_BE_WORD(table->DefaultLangSys))) - script->default_language.gpos_table = (const BYTE *)table + offset; + if ((offset = GET_BE_WORD(list->DefaultLangSys))) + { + script->default_language.tag = MS_MAKE_TAG('d','f','l','t'); + script->default_language.table[table] = (const BYTE *)list + offset; + TRACE("Default language %p.\n", script->default_language.table[table]); + }
- if (!(count = GET_BE_WORD(table->LangSysCount))) + if (!(count = GET_BE_WORD(list->LangSysCount))) return;
- TRACE("Deflang %p, LangCount %lu.\n", script->default_language.gpos_table, count); + TRACE("Adding %lu languages.\n", count);
initial_count = script->language_count; for (i = 0; i < count; ++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]); + tag = MS_MAKE_TAG(list->LangSysRecord[i].LangSysTag[0], + list->LangSysRecord[i].LangSysTag[1], + list->LangSysRecord[i].LangSysTag[2], + list->LangSysRecord[i].LangSysTag[3]);
if (!(initial_count && (language = usp10_script_get_language(script, tag))) && !(language = usp10_script_add_language(script, tag))) return;
- language->gpos_table = (const BYTE *)table + GET_BE_WORD(table->LangSysRecord[i].LangSys); + language->table[table] = (const BYTE *)list + GET_BE_WORD(list->LangSysRecord[i].LangSys); } }
static void _initialize_language_cache(LoadedScript *script) { - if (!script->languages_initialized) - { - GSUB_initialize_language_cache(script); - GPOS_expand_language_cache(script); - script->languages_initialized = TRUE; - } + const OT_Script *list; + + if (script->languages_initialized) + return; + + if ((list = script->table[USP10_SCRIPT_TABLE_GSUB])) + usp10_script_add_language_list(script, USP10_LANGUAGE_TABLE_GSUB, list); + if ((list = script->table[USP10_SCRIPT_TABLE_GPOS])) + usp10_script_add_language_list(script, USP10_LANGUAGE_TABLE_GPOS, list); + + script->languages_initialized = TRUE; }
HRESULT OpenType_GetFontLanguageTags(ScriptCache *psc, OPENTYPE_TAG script_tag, OPENTYPE_TAG searchingFor, int cMaxTags, OPENTYPE_TAG *pLanguageTags, int *pcTags) @@ -2823,7 +2794,7 @@ HRESULT OpenType_GetFontLanguageTags(ScriptCache *psc, OPENTYPE_TAG script_tag, } }
- if (script->default_language.gsub_table) + if (script->default_language.table[USP10_LANGUAGE_TABLE_GSUB]) { if (i < cMaxTags) pLanguageTags[i] = script->default_language.tag; @@ -2888,13 +2859,13 @@ static void _initialize_feature_cache(ScriptCache *psc, LoadedLanguage *language if (language->features_initialized) return;
- if ((lang = language->gsub_table)) + if ((lang = language->table[USP10_LANGUAGE_TABLE_GSUB])) { feature_list = (const OT_FeatureList *)((const BYTE *)gsub_header + GET_BE_WORD(gsub_header->FeatureList)); usp10_language_add_feature_list(language, FEATURE_GSUB_TABLE, lang, feature_list); }
- if ((lang = language->gpos_table)) + if ((lang = language->table[USP10_LANGUAGE_TABLE_GPOS])) { feature_list = (const OT_FeatureList *)((const BYTE *)gpos_header + GET_BE_WORD(gpos_header->FeatureList)); usp10_language_add_feature_list(language, FEATURE_GPOS_TABLE, lang, feature_list); @@ -2906,9 +2877,9 @@ static void _initialize_feature_cache(ScriptCache *psc, LoadedLanguage *language HRESULT OpenType_GetFontFeatureTags(ScriptCache *psc, OPENTYPE_TAG script_tag, OPENTYPE_TAG language_tag, BOOL filtered, OPENTYPE_TAG searchingFor, char tableType, int cMaxTags, OPENTYPE_TAG *pFeatureTags, int *pcTags, LoadedFeature** feature) { int i; + LoadedLanguage *language; LoadedScript *script; HRESULT rc = S_OK; - LoadedLanguage *language = NULL;
_initialize_script_cache(psc); if (!(script = usp10_script_cache_get_script(psc, script_tag))) @@ -2922,9 +2893,9 @@ HRESULT OpenType_GetFontFeatureTags(ScriptCache *psc, OPENTYPE_TAG script_tag, O
_initialize_language_cache(script);
- if ((script->default_language.gsub_table || script->default_language.gpos_table) && script->default_language.tag == language_tag) - language = &script->default_language; - else + language = &script->default_language; + if (language->tag != language_tag || (!language->table[USP10_LANGUAGE_TABLE_GSUB] + && !language->table[USP10_LANGUAGE_TABLE_GPOS])) language = usp10_script_get_language(script, language_tag);
if (!language) diff --git a/dlls/usp10/usp10_internal.h b/dlls/usp10/usp10_internal.h index 08024c9..99d7cd1 100644 --- a/dlls/usp10/usp10_internal.h +++ b/dlls/usp10/usp10_internal.h @@ -152,10 +152,16 @@ typedef struct { WORD *lookups; } LoadedFeature;
+enum usp10_language_table +{ + USP10_LANGUAGE_TABLE_GSUB = 0, + USP10_LANGUAGE_TABLE_GPOS, + USP10_LANGUAGE_TABLE_COUNT +}; + typedef struct { OPENTYPE_TAG tag; - const void *gsub_table; - const void *gpos_table; + const void *table[USP10_LANGUAGE_TABLE_COUNT]; BOOL features_initialized; INT feature_count; LoadedFeature *features;