Aric Stewart : usp10: Handle GPOS ValueRecords.

Alexandre Julliard julliard at winehq.org
Mon Jul 16 14:14:30 CDT 2012


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

Author: Aric Stewart <aric at codeweavers.com>
Date:   Mon Jul 16 07:24:09 2012 -0500

usp10: Handle GPOS ValueRecords.

---

 dlls/usp10/opentype.c |   38 ++++++++++++++++++++++++++++++++++++++
 1 files changed, 38 insertions(+), 0 deletions(-)

diff --git a/dlls/usp10/opentype.c b/dlls/usp10/opentype.c
index 093dab7..70d0da7 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;




More information about the wine-cvs mailing list