[PATCH 5/5] usp10: Simplify GPOS_expand_language_cache().

Henri Verbeet hverbeet at codeweavers.com
Tue Mar 20 06:41:59 CDT 2018


Signed-off-by: Henri Verbeet <hverbeet at 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);
     }
 }
 
-- 
2.11.0




More information about the wine-devel mailing list