Aric Stewart : usp10: Correct implementation of Pair Positioning Adjustment : Format 1.

Alexandre Julliard julliard at winehq.org
Wed Aug 15 14:08:34 CDT 2012


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

Author: Aric Stewart <aric at codeweavers.com>
Date:   Tue Aug 14 09:32:02 2012 -0500

usp10: Correct implementation of Pair Positioning Adjustment: Format 1.

---

 dlls/usp10/opentype.c |   67 +++++++++++++++++++++++++-----------------------
 1 files changed, 35 insertions(+), 32 deletions(-)

diff --git a/dlls/usp10/opentype.c b/dlls/usp10/opentype.c
index cc57f65..a21e0f1 100644
--- a/dlls/usp10/opentype.c
+++ b/dlls/usp10/opentype.c
@@ -1174,44 +1174,47 @@ static INT GPOS_apply_PairAdjustment(const OT_LookupTable *look, const WORD *gly
         ppf1 = (const GPOS_PairPosFormat1*)((const BYTE*)look+offset);
         if (GET_BE_WORD(ppf1->PosFormat) == 1)
         {
+            int index;
             offset = GET_BE_WORD(ppf1->Coverage);
-            if (GSUB_is_glyph_covered((const BYTE*)ppf1+offset, glyphs[glyph_index]) != -1)
+            index = GSUB_is_glyph_covered((const BYTE*)ppf1+offset, glyphs[glyph_index]);
+            if (index != -1 && index < GET_BE_WORD(ppf1->PairSetCount))
             {
-                int i;
-                int count = GET_BE_WORD(ppf1->PairSetCount);
-                for (i = 0; i < count; i++)
+                int k;
+                int pair_count;
+                const GPOS_PairSet *ps;
+                offset = GET_BE_WORD(ppf1->PairSetOffset[index]);
+                ps = (const GPOS_PairSet*)((const BYTE*)ppf1+offset);
+                pair_count = GET_BE_WORD(ps->PairValueCount);
+                for (k = 0; k < pair_count; k++)
                 {
-                    int k;
-                    int pair_count;
-                    const GPOS_PairSet *ps;
-                    offset = GET_BE_WORD(ppf1->PairSetOffset[i]);
-                    ps = (const GPOS_PairSet*)((const BYTE*)ppf1+offset);
-                    pair_count = GET_BE_WORD(ps->PairValueCount);
-                    for (k = 0; k < pair_count; k++)
+                    WORD second_glyph = GET_BE_WORD(ps->PairValueRecord[k].SecondGlyph);
+                    if (glyphs[glyph_index+write_dir] == second_glyph)
                     {
-                        if (glyphs[glyph_index+write_dir] == GET_BE_WORD(ps->PairValueRecord[k].SecondGlyph))
+                        int next = 1;
+                        GPOS_ValueRecord ValueRecord1 = {0,0,0,0,0,0,0,0};
+                        GPOS_ValueRecord ValueRecord2 = {0,0,0,0,0,0,0,0};
+                        WORD ValueFormat1 = GET_BE_WORD(ppf1->ValueFormat1);
+                        WORD ValueFormat2 = GET_BE_WORD(ppf1->ValueFormat2);
+
+                        TRACE("Format 1: Found Pair %x,%x\n",glyphs[glyph_index],glyphs[glyph_index+write_dir]);
+
+                        offset = GPOS_get_value_record(ValueFormat1, ps->PairValueRecord[k].Value1, &ValueRecord1);
+                        GPOS_get_value_record(ValueFormat2, (WORD*)((const BYTE*)(ps->PairValueRecord[k].Value2)+offset), &ValueRecord2);
+                        if (ValueFormat1)
+                        {
+                            GPOS_get_value_record_offsets((const BYTE*)ppf1, &ValueRecord1,  ValueFormat1, ppem, &ptAdjust[0], &ptAdvance[0]);
+                            TRACE("Glyph 1 resulting cumulative offset is %i,%i design units\n",ptAdjust[0].x,ptAdjust[0].y);
+                            TRACE("Glyph 1 resulting cumulative advance is %i,%i design units\n",ptAdvance[0].x,ptAdvance[0].y);
+                        }
+                        if (ValueFormat2)
                         {
-                            GPOS_ValueRecord ValueRecord1 = {0,0,0,0,0,0,0,0};
-                            GPOS_ValueRecord ValueRecord2 = {0,0,0,0,0,0,0,0};
-                            WORD ValueFormat1 = GET_BE_WORD(ppf1->ValueFormat1);
-                            WORD ValueFormat2 = GET_BE_WORD(ppf1->ValueFormat2);
-
-                            TRACE("Format 1: Found Pair %x,%x\n",glyphs[glyph_index],glyphs[glyph_index+write_dir]);
-
-                            offset = GPOS_get_value_record(ValueFormat1, ps->PairValueRecord[k].Value1, &ValueRecord1);
-                            GPOS_get_value_record(ValueFormat2, (WORD*)((const BYTE*)(ps->PairValueRecord[k].Value2)+offset), &ValueRecord2);
-                            if (ValueFormat1)
-                            {
-                                GPOS_get_value_record_offsets((const BYTE*)ppf1, &ValueRecord1,  ValueFormat1, ppem, &ptAdjust[0], &ptAdvance[0]);
-                                TRACE("Glyph 1 resulting cumulative offset is %i,%i design units\n",ptAdjust[0].x,ptAdjust[0].y);
-                            }
-                            if (ValueFormat2)
-                            {
-                                GPOS_get_value_record_offsets((const BYTE*)ppf1, &ValueRecord2,  ValueFormat2, ppem, &ptAdjust[1], &ptAdvance[1]);
-                                TRACE("Glyph 2 resulting cumulative offset is %i,%i design units\n",ptAdjust[1].x,ptAdjust[1].y);
-                                return glyph_index+2;
-                            }
+                            GPOS_get_value_record_offsets((const BYTE*)ppf1, &ValueRecord2,  ValueFormat2, ppem, &ptAdjust[1], &ptAdvance[1]);
+                            TRACE("Glyph 2 resulting cumulative offset is %i,%i design units\n",ptAdjust[1].x,ptAdjust[1].y);
+                            TRACE("Glyph 2 resulting cumulative advance is %i,%i design units\n",ptAdvance[1].x,ptAdvance[1].y);
+                            next++;
                         }
+                        if (next)
+                            return glyph_index + next;
                     }
                 }
             }




More information about the wine-cvs mailing list