From 1dc148d7cc0a95815c350edbf026bfe3e5258989 Mon Sep 17 00:00:00 2001 From: Aric Stewart Date: Mon, 16 Jul 2012 07:24:09 -0500 Subject: [PATCH] usp10: Handle GPOS ValueRecords. --- dlls/usp10/opentype.c | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/dlls/usp10/opentype.c b/dlls/usp10/opentype.c index 093dab7a1bb..70d0da75cbd 100644 --- a/dlls/usp10/opentype.c +++ b/dlls/usp10/opentype.c @@ -315,6 +315,17 @@ typedef struct { } GPOS_AnchorFormat3; typedef struct { + WORD XPlacement; + WORD YPlacement; + WORD XAdvance; + WORD YAdvance; + WORD XPlaDevice; + WORD YPlaDevice; + WORD XAdvDevice; + WORD YAdvDevice; +} GPOS_ValueRecord; + +typedef struct { WORD PosFormat; WORD MarkCoverage; WORD BaseCoverage; @@ -1010,6 +1021,33 @@ static void GPOS_convert_design_units_to_device(LPOUTLINETEXTMETRICW lpotm, LPLO FIXME("Font with lfWidth set no handled properly\n"); } +static INT GPOS_get_value_record(WORD ValueFormat, const WORD data[], GPOS_ValueRecord *record) +{ + INT offset = 0; + if (ValueFormat & 0x0001) record->XPlacement = GET_BE_WORD(data[offset++]); + if (ValueFormat & 0x0002) record->YPlacement = GET_BE_WORD(data[offset++]); + if (ValueFormat & 0x0004) record->XAdvance = GET_BE_WORD(data[offset++]); + if (ValueFormat & 0x0008) record->YAdvance = GET_BE_WORD(data[offset++]); + if (ValueFormat & 0x0010) record->XPlaDevice = GET_BE_WORD(data[offset++]); + if (ValueFormat & 0x0020) record->YPlaDevice = GET_BE_WORD(data[offset++]); + if (ValueFormat & 0x0040) record->XAdvDevice = GET_BE_WORD(data[offset++]); + if (ValueFormat & 0x0080) record->YAdvDevice = GET_BE_WORD(data[offset++]); + return offset; +} + +static VOID GPOS_get_value_record_offsets(const BYTE* head, GPOS_ValueRecord *ValueRecord, WORD ValueFormat, INT ppem, LPPOINT ptPlacement, LPPOINT ptAdvance) +{ + if (ValueFormat & 0x0001) ptPlacement->x += (short)ValueRecord->XPlacement; + if (ValueFormat & 0x0002) ptPlacement->y += (short)ValueRecord->YPlacement; + if (ValueFormat & 0x0004) ptAdvance->x += (short)ValueRecord->XAdvance; + if (ValueFormat & 0x0008) ptAdvance->y += (short)ValueRecord->YAdvance; + if (ValueFormat & 0x0010) ptPlacement->x += GPOS_get_device_table_value((const OT_DeviceTable*)(head + ValueRecord->XPlaDevice), ppem); + if (ValueFormat & 0x0020) ptPlacement->y += GPOS_get_device_table_value((const OT_DeviceTable*)(head + ValueRecord->YPlaDevice), ppem); + if (ValueFormat & 0x0040) ptAdvance->x += GPOS_get_device_table_value((const OT_DeviceTable*)(head + ValueRecord->XAdvDevice), ppem); + if (ValueFormat & 0x0080) ptAdvance->y += GPOS_get_device_table_value((const OT_DeviceTable*)(head + ValueRecord->YAdvDevice), ppem); + if (ValueFormat & 0xFF00) FIXME("Unhandled Value Format %x\n",ValueFormat&0xFF00); +} + static VOID GPOS_apply_MarkToBase(const OT_LookupTable *look, const WORD *glyphs, INT glyph_index, INT write_dir, INT glyph_count, INT ppem, LPPOINT pt) { int j; -- 2.11.4.GIT