usp10: Add support for format 2 pair adjustments.

This commit is contained in:
Huw Davies 2012-12-20 12:55:34 +00:00 committed by Alexandre Julliard
parent 08fcdd5f6f
commit 496898db51
1 changed files with 43 additions and 0 deletions

View File

@ -351,6 +351,18 @@ typedef struct {
WORD PairSetOffset[1];
} GPOS_PairPosFormat1;
typedef struct {
WORD PosFormat;
WORD Coverage;
WORD ValueFormat1;
WORD ValueFormat2;
WORD ClassDef1;
WORD ClassDef2;
WORD Class1Count;
WORD Class2Count;
WORD Class1Record[1];
} GPOS_PairPosFormat2;
typedef struct {
WORD SecondGlyph;
WORD Value1[1];
@ -1255,6 +1267,37 @@ static INT GPOS_apply_PairAdjustment(const OT_LookupTable *look, const WORD *gly
}
}
}
else if (GET_BE_WORD(ppf1->PosFormat) == 2)
{
const GPOS_PairPosFormat2 *ppf2 = (const GPOS_PairPosFormat2*)((const BYTE*)look + offset);
int index;
WORD ValueFormat1 = GET_BE_WORD( ppf2->ValueFormat1 );
WORD ValueFormat2 = GET_BE_WORD( ppf2->ValueFormat2 );
INT val_fmt1_size = GPOS_get_value_record( ValueFormat1, NULL, NULL );
INT val_fmt2_size = GPOS_get_value_record( ValueFormat2, NULL, NULL );
WORD class1_count = GET_BE_WORD( ppf2->Class1Count );
WORD class2_count = GET_BE_WORD( ppf2->Class2Count );
offset = GET_BE_WORD( ppf2->Coverage );
index = GSUB_is_glyph_covered( (const BYTE*)ppf2 + offset, glyphs[glyph_index] );
if (index != -1)
{
WORD class1, class2;
class1 = OT_get_glyph_class( (const BYTE *)ppf2 + GET_BE_WORD(ppf2->ClassDef1), glyphs[glyph_index] );
class2 = OT_get_glyph_class( (const BYTE *)ppf2 + GET_BE_WORD(ppf2->ClassDef2), glyphs[glyph_index + write_dir] );
if (class1 < class1_count && class2 < class2_count)
{
const WORD *pair_val = ppf2->Class1Record + (class1 * class2_count + class2) * (val_fmt1_size + val_fmt2_size);
int next = 1;
TRACE( "Format 2: Found Pair %x,%x\n", glyphs[glyph_index], glyphs[glyph_index + write_dir] );
apply_pair_value( ppf2, ValueFormat1, ValueFormat2, pair_val, ppem, ptAdjust, ptAdvance );
if (ValueFormat2) next++;
return glyph_index + next;
}
}
}
else
FIXME("Pair Adjustment Positioning: Format %i Unhandled\n",GET_BE_WORD(ppf1->PosFormat));
}