Henri Verbeet : usp10: Avoid special handling if the substitution count is 0 in GSUB_apply_ChainContextSubst ().

Alexandre Julliard julliard at winehq.org
Thu Apr 6 15:05:24 CDT 2017


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

Author: Henri Verbeet <hverbeet at codeweavers.com>
Date:   Thu Apr  6 12:03:45 2017 +0200

usp10: Avoid special handling if the substitution count is 0 in GSUB_apply_ChainContextSubst().

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 | 62 +++++++++++++++++++++------------------------------
 1 file changed, 26 insertions(+), 36 deletions(-)

diff --git a/dlls/usp10/opentype.c b/dlls/usp10/opentype.c
index 81a5180..a3346ef 100644
--- a/dlls/usp10/opentype.c
+++ b/dlls/usp10/opentype.c
@@ -1237,7 +1237,6 @@ static INT GSUB_apply_ChainContextSubst(const OT_LookupList* lookup, const OT_Lo
         }
         else if (GET_BE_WORD(ccsf1->SubstFormat) == 2)
         {
-            int newIndex = glyph_index;
             WORD offset, count;
             const void *backtrack_class_table;
             const void *input_class_table;
@@ -1281,12 +1280,13 @@ static INT GSUB_apply_ChainContextSubst(const OT_LookupList* lookup, const OT_Lo
 
             for (i = 0; i < count; i++)
             {
-                WORD backtrack_count, input_count, lookahead_count;
+                WORD backtrack_count, input_count, lookahead_count, substitute_count;
                 int k;
                 const GSUB_ChainSubClassRule_1 *backtrack;
                 const GSUB_ChainSubClassRule_2 *input;
                 const GSUB_ChainSubClassRule_3 *lookahead;
                 const GSUB_ChainSubClassRule_4 *substitute;
+                int new_index = GSUB_E_NOGLYPH;
 
                 offset = GET_BE_WORD(csc->ChainSubClassRule[i]);
                 backtrack = (const GSUB_ChainSubClassRule_1 *)((BYTE *)csc + offset);
@@ -1343,35 +1343,30 @@ static INT GSUB_apply_ChainContextSubst(const OT_LookupList* lookup, const OT_Lo
                     continue;
                 TRACE("Matched LookAhead\n");
 
-                if (GET_BE_WORD(substitute->SubstCount))
+                substitute_count = GET_BE_WORD(substitute->SubstCount);
+                for (k = 0; k < substitute_count; ++k)
                 {
-                    for (k = 0; k < GET_BE_WORD(substitute->SubstCount); ++k)
-                    {
-                        int lookupIndex = GET_BE_WORD(substitute->SubstLookupRecord[k].LookupListIndex);
-                        int SequenceIndex = GET_BE_WORD(substitute->SubstLookupRecord[k].SequenceIndex) * write_dir;
-
-                        TRACE("SUBST: %i -> %i %i\n",k, SequenceIndex, lookupIndex);
-                        newIndex = GSUB_apply_lookup(lookup, lookupIndex, glyphs, glyph_index + SequenceIndex, write_dir, glyph_count);
-                        if (newIndex == GSUB_E_NOGLYPH)
-                        {
-                            ERR("Chain failed to generate a glyph\n");
-                            continue;
-                        }
-                    }
-                    return newIndex;
+                    WORD lookup_index = GET_BE_WORD(substitute->SubstLookupRecord[k].LookupListIndex);
+                    WORD sequence_index = GET_BE_WORD(substitute->SubstLookupRecord[k].SequenceIndex) * write_dir;
+
+                    TRACE("SUBST: %u -> %u %u.\n", k, sequence_index, lookup_index);
+                    new_index = GSUB_apply_lookup(lookup, lookup_index, glyphs,
+                            glyph_index + sequence_index, write_dir, glyph_count);
+                    if (new_index == GSUB_E_NOGLYPH)
+                        ERR("Chain failed to generate a glyph.\n");
                 }
-                else return GSUB_E_NOGLYPH;
+                return new_index;
             }
         }
         else if (GET_BE_WORD(ccsf1->SubstFormat) == 3)
         {
-            WORD backtrack_count, input_count, lookahead_count;
+            WORD backtrack_count, input_count, lookahead_count, substitution_count;
             int k;
             const GSUB_ChainContextSubstFormat3_1 *backtrack;
             const GSUB_ChainContextSubstFormat3_2 *input;
             const GSUB_ChainContextSubstFormat3_3 *lookahead;
             const GSUB_ChainContextSubstFormat3_4 *substitute;
-            int newIndex = glyph_index;
+            int new_index = GSUB_E_NOGLYPH;
 
             TRACE("  subtype 3 (Coverage-based Chaining Context Glyph Substitution)\n");
 
@@ -1428,24 +1423,19 @@ static INT GSUB_apply_ChainContextSubst(const OT_LookupList* lookup, const OT_Lo
                 continue;
             TRACE("Matched LookAhead\n");
 
-            if (GET_BE_WORD(substitute->SubstCount))
+            substitution_count = GET_BE_WORD(substitute->SubstCount);
+            for (k = 0; k < substitution_count; ++k)
             {
-                for (k = 0; k < GET_BE_WORD(substitute->SubstCount); ++k)
-                {
-                    int lookupIndex = GET_BE_WORD(substitute->SubstLookupRecord[k].LookupListIndex);
-                    int SequenceIndex = GET_BE_WORD(substitute->SubstLookupRecord[k].SequenceIndex) * write_dir;
-
-                    TRACE("SUBST: %i -> %i %i\n",k, SequenceIndex, lookupIndex);
-                    newIndex = GSUB_apply_lookup(lookup, lookupIndex, glyphs, glyph_index + SequenceIndex, write_dir, glyph_count);
-                    if (newIndex == GSUB_E_NOGLYPH)
-                    {
-                        ERR("Chain failed to generate a glyph\n");
-                        continue;
-                    }
-                }
-                return newIndex;
+                WORD lookup_index = GET_BE_WORD(substitute->SubstLookupRecord[k].LookupListIndex);
+                WORD sequence_index = GET_BE_WORD(substitute->SubstLookupRecord[k].SequenceIndex) * write_dir;
+
+                TRACE("SUBST: %u -> %u %u.\n", k, sequence_index, lookup_index);
+                new_index = GSUB_apply_lookup(lookup, lookup_index, glyphs,
+                        glyph_index + sequence_index, write_dir, glyph_count);
+                if (new_index == GSUB_E_NOGLYPH)
+                    ERR("Chain failed to generate a glyph.\n");
             }
-            else return GSUB_E_NOGLYPH;
+            return new_index;
         }
     }
     return GSUB_E_NOGLYPH;




More information about the wine-cvs mailing list