Henri Verbeet : usp10: Get rid of some code duplication in GPOS_expand_feature_cache().

Alexandre Julliard julliard at winehq.org
Tue Mar 28 15:38:41 CDT 2017


Module: wine
Branch: master
Commit: 9b0f3f1bacbe3d5ba57dbef803276e4c9597dae0
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=9b0f3f1bacbe3d5ba57dbef803276e4c9597dae0

Author: Henri Verbeet <hverbeet at codeweavers.com>
Date:   Mon Mar 27 22:57:03 2017 +0200

usp10: Get rid of some code duplication in GPOS_expand_feature_cache().

Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Aric Stewart <aric at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/usp10/opentype.c | 78 +++++++++++++++------------------------------------
 1 file changed, 23 insertions(+), 55 deletions(-)

diff --git a/dlls/usp10/opentype.c b/dlls/usp10/opentype.c
index 2731c44..2b67706 100644
--- a/dlls/usp10/opentype.c
+++ b/dlls/usp10/opentype.c
@@ -2829,10 +2829,10 @@ static void GSUB_initialize_feature_cache(const void *table, LoadedLanguage *lan
 
 static void GPOS_expand_feature_cache(const void *table, LoadedLanguage *language)
 {
-    int i, count;
     const OT_LangSys *lang = language->gpos_table;
     const GPOS_Header *header = (const GPOS_Header *)table;
     const OT_FeatureList *feature_list;
+    unsigned int i, j, count;
 
     if (!lang)
         return;
@@ -2846,63 +2846,31 @@ static void GPOS_expand_feature_cache(const void *table, LoadedLanguage *languag
         return;
 
     if (!language->feature_count)
-    {
-        language->feature_count = count;
-
-        if (language->feature_count)
-        {
-            language->features = heap_alloc(language->feature_count * sizeof(*language->features));
-
-            for (i = 0; i < language->feature_count; i++)
-            {
-                LoadedFeature *loaded_feature = &language->features[i];
-                const OT_Feature *feature;
-                int j;
-                int index = GET_BE_WORD(lang->FeatureIndex[i]);
-
-                loaded_feature->tag = MS_MAKE_TAG(feature_list->FeatureRecord[index].FeatureTag[0],
-                        feature_list->FeatureRecord[index].FeatureTag[1],
-                        feature_list->FeatureRecord[index].FeatureTag[2],
-                        feature_list->FeatureRecord[index].FeatureTag[3]);
-                loaded_feature->feature = ((const BYTE *)feature_list
-                        + GET_BE_WORD(feature_list->FeatureRecord[index].Feature));
-                feature = loaded_feature->feature;
-                loaded_feature->lookup_count = GET_BE_WORD(feature->LookupCount);
-                loaded_feature->lookups = heap_alloc(loaded_feature->lookup_count * sizeof(*loaded_feature->lookups));
-                for (j = 0; j < loaded_feature->lookup_count; ++j)
-                    loaded_feature->lookups[j] = GET_BE_WORD(feature->LookupListIndex[j]);
-                loaded_feature->tableType = FEATURE_GPOS_TABLE;
-            }
-        }
-    }
+        language->features = heap_alloc(count * sizeof(*language->features));
     else
-    {
-        language->features = HeapReAlloc(GetProcessHeap(),0,language->features, sizeof(LoadedFeature)*(language->feature_count + count));
+        language->features = HeapReAlloc(GetProcessHeap(), 0, language->features,
+                (language->feature_count + count) * sizeof(*language->features));
 
-        for (i = 0; i < count; i++)
-        {
-            LoadedFeature *loaded_feature;
-            const OT_Feature *feature;
-            int j;
-            int index = GET_BE_WORD(lang->FeatureIndex[i]);
-            int idx = language->feature_count + i;
-
-            loaded_feature = &language->features[idx];
-            loaded_feature->tag = MS_MAKE_TAG(feature_list->FeatureRecord[index].FeatureTag[0],
-                    feature_list->FeatureRecord[index].FeatureTag[1],
-                    feature_list->FeatureRecord[index].FeatureTag[2],
-                    feature_list->FeatureRecord[index].FeatureTag[3]);
-            loaded_feature->feature = ((const BYTE *)feature_list
-                    + GET_BE_WORD(feature_list->FeatureRecord[index].Feature));
-            feature = loaded_feature->feature;
-            loaded_feature->lookup_count = GET_BE_WORD(feature->LookupCount);
-            loaded_feature->lookups = heap_alloc(loaded_feature->lookup_count * sizeof(*loaded_feature->lookups));
-            for (j = 0; j < loaded_feature->lookup_count; ++j)
-                loaded_feature->lookups[j] = GET_BE_WORD(feature->LookupListIndex[j]);
-            loaded_feature->tableType = FEATURE_GPOS_TABLE;
-        }
-        language->feature_count += count;
+    for (i = 0; i < count; ++i)
+    {
+        const OT_FeatureRecord *record;
+        LoadedFeature *loaded_feature;
+        const OT_Feature *feature;
+
+        record = &feature_list->FeatureRecord[GET_BE_WORD(lang->FeatureIndex[i])];
+        feature = (const OT_Feature *)((const BYTE *)feature_list + GET_BE_WORD(record->Feature));
+
+        loaded_feature = &language->features[language->feature_count + i];
+        loaded_feature->tag = MS_MAKE_TAG(record->FeatureTag[0], record->FeatureTag[1],
+                record->FeatureTag[2], record->FeatureTag[3]);
+        loaded_feature->tableType = FEATURE_GPOS_TABLE;
+        loaded_feature->feature = feature;
+        loaded_feature->lookup_count = GET_BE_WORD(feature->LookupCount);
+        loaded_feature->lookups = heap_alloc(loaded_feature->lookup_count * sizeof(*loaded_feature->lookups));
+        for (j = 0; j < loaded_feature->lookup_count; ++j)
+            loaded_feature->lookups[j] = GET_BE_WORD(feature->LookupListIndex[j]);
     }
+    language->feature_count += count;
 }
 
 static void _initialize_feature_cache(ScriptCache *psc, LoadedLanguage *language)




More information about the wine-cvs mailing list