[PATCH 5/5] usp10: Merge GSUB_initialize_language_cache() and GPOS_expand_language_cache().

Aric Stewart aric at codeweavers.com
Wed Mar 21 14:28:22 CDT 2018


Signed-off-by: Aric Stewart <aric at codeweavers.com>

On 3/21/18 4:30 AM, Henri Verbeet wrote:
> Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
> ---
>   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 299c301758c..88272656038 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 08024c90227..99d7cd11b11 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;
> 



More information about the wine-devel mailing list