1363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger/* 2363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger * Copyright 2012 Google Inc. 3363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger * 4363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger * Use of this source code is governed by a BSD-style license that can be 5363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger * found in the LICENSE file. 6363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger */ 7363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 8363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#ifndef SkOTTable_glyf_DEFINED 9363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#define SkOTTable_glyf_DEFINED 10363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 11363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#include "SkEndian.h" 12363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#include "SkOTTableTypes.h" 13363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#include "SkOTTable_head.h" 14363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#include "SkOTTable_loca.h" 15363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#include "SkTypedEnum.h" 16363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 17363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#pragma pack(push, 1) 18363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 19363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerstruct SkOTTableGlyphData; 20363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 21363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerextern uint8_t const * const SK_OT_GlyphData_NoOutline; 22363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 23363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerstruct SkOTTableGlyph { 24363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger static const SK_OT_CHAR TAG0 = 'g'; 25363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger static const SK_OT_CHAR TAG1 = 'l'; 26363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger static const SK_OT_CHAR TAG2 = 'y'; 27363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger static const SK_OT_CHAR TAG3 = 'f'; 28363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger static const SK_OT_ULONG TAG = SkOTTableTAG<SkOTTableGlyph>::value; 29363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 30363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger class Iterator { 31363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger public: 32363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger Iterator(const SkOTTableGlyph& glyf, 33363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger const SkOTTableIndexToLocation& loca, 34363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkOTTableHead::IndexToLocFormat locaFormat) 35363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger : fGlyf(glyf) 36363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger , fLocaFormat(SkOTTableHead::IndexToLocFormat::ShortOffsets == locaFormat.value ? 0 : 1) 37363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger , fCurrentGlyphOffset(0) 38363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger { fLocaPtr.shortOffset = reinterpret_cast<const SK_OT_USHORT*>(&loca); } 39363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 40363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger void advance(uint16_t num) { 41363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger fLocaPtr.shortOffset += num << fLocaFormat; 42363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger fCurrentGlyphOffset = fLocaFormat ? SkEndian_SwapBE32(*fLocaPtr.longOffset) 43d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger : uint32_t(SkEndian_SwapBE16(*fLocaPtr.shortOffset) << 1); 44363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } 45363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger const SkOTTableGlyphData* next() { 46363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger uint32_t previousGlyphOffset = fCurrentGlyphOffset; 47363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger advance(1); 48363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger if (previousGlyphOffset == fCurrentGlyphOffset) { 49363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger return reinterpret_cast<const SkOTTableGlyphData*>(&SK_OT_GlyphData_NoOutline); 50363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } else { 51363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger return reinterpret_cast<const SkOTTableGlyphData*>( 52363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger reinterpret_cast<const SK_OT_BYTE*>(&fGlyf) + previousGlyphOffset 53363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger ); 54363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } 55363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } 56363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger private: 57363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger const SkOTTableGlyph& fGlyf; 58363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger uint16_t fLocaFormat; //0 or 1 59363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger uint32_t fCurrentGlyphOffset; 60363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger union LocaPtr { 61363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger const SK_OT_USHORT* shortOffset; 62363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger const SK_OT_ULONG* longOffset; 63363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } fLocaPtr; 64363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger }; 65363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger}; 66363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 67363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerstruct SkOTTableGlyphData { 68363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SK_OT_SHORT numberOfContours; //== -1 Composite, > 0 Simple 69363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SK_OT_FWORD xMin; 70363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SK_OT_FWORD yMin; 71363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SK_OT_FWORD xMax; 72363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SK_OT_FWORD yMax; 73363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 74363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger struct Simple { 75363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SK_OT_USHORT endPtsOfContours[1/*numberOfContours*/]; 76363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 77363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger struct Instructions { 78363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SK_OT_USHORT length; 79363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SK_OT_BYTE data[1/*length*/]; 80363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger }; 81363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 82363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger union Flags { 83363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger struct Field { 84363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SK_OT_BYTE_BITFIELD( 85363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger OnCurve, 86363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger xShortVector, 87363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger yShortVector, 88363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger Repeat, 89363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger xIsSame_xShortVectorPositive, 90363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger yIsSame_yShortVectorPositive, 91363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger Reserved6, 92363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger Reserved7) 93363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } field; 94363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger struct Raw { 95363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger static const SK_OT_USHORT OnCurveMask = SkTEndian_SwapBE16(1 << 0); 96363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger static const SK_OT_USHORT xShortVectorMask = SkTEndian_SwapBE16(1 << 1); 97363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger static const SK_OT_USHORT yShortVectorMask = SkTEndian_SwapBE16(1 << 2); 98363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger static const SK_OT_USHORT RepeatMask = SkTEndian_SwapBE16(1 << 3); 99363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger static const SK_OT_USHORT xIsSame_xShortVectorPositiveMask = SkTEndian_SwapBE16(1 << 4); 100363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger static const SK_OT_USHORT yIsSame_yShortVectorPositiveMask = SkTEndian_SwapBE16(1 << 5); 101363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SK_OT_BYTE value; 102363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } raw; 103363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger }; 104363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 105363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger //xCoordinates 106363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger //yCoordinates 107363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger }; 108363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 109363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger struct Composite { 110363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger struct Component { 111363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger union Flags { 112363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger struct Field { 113363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger //8-15 114363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SK_OT_BYTE_BITFIELD( 115363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger WE_HAVE_INSTRUCTIONS, 116363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger USE_MY_METRICS, 117363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger OVERLAP_COMPOUND, 118363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SCALED_COMPONENT_OFFSET, 119363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger UNSCALED_COMPONENT_OFFSET, 120363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger Reserved13, 121363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger Reserved14, 122363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger Reserved15) 123363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger //0-7 124363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SK_OT_BYTE_BITFIELD( 125363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger ARG_1_AND_2_ARE_WORDS, 126363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger ARGS_ARE_XY_VALUES, 127363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger ROUND_XY_TO_GRID, 128363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger WE_HAVE_A_SCALE, 129363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger RESERVED, 130363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger MORE_COMPONENTS, 131363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger WE_HAVE_AN_X_AND_Y_SCALE, 132363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger WE_HAVE_A_TWO_BY_TWO) 133363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } field; 134363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger struct Raw { 135363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger static const SK_OT_USHORT ARG_1_AND_2_ARE_WORDS_Mask = SkTEndian_SwapBE16(1 << 0); 136363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger static const SK_OT_USHORT ARGS_ARE_XY_VALUES_Mask = SkTEndian_SwapBE16(1 << 1); 137363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger static const SK_OT_USHORT ROUND_XY_TO_GRID_Mask = SkTEndian_SwapBE16(1 << 2); 138363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger static const SK_OT_USHORT WE_HAVE_A_SCALE_Mask = SkTEndian_SwapBE16(1 << 3); 139363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger static const SK_OT_USHORT RESERVED_Mask = SkTEndian_SwapBE16(1 << 4); 140363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger static const SK_OT_USHORT MORE_COMPONENTS_Mask = SkTEndian_SwapBE16(1 << 5); 141363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger static const SK_OT_USHORT WE_HAVE_AN_X_AND_Y_SCALE_Mask = SkTEndian_SwapBE16(1 << 6); 142363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger static const SK_OT_USHORT WE_HAVE_A_TWO_BY_TWO_Mask = SkTEndian_SwapBE16(1 << 7); 143363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 144363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger static const SK_OT_USHORT WE_HAVE_INSTRUCTIONS_Mask = SkTEndian_SwapBE16(1 << 8); 145363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger static const SK_OT_USHORT USE_MY_METRICS_Mask = SkTEndian_SwapBE16(1 << 9); 146363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger static const SK_OT_USHORT OVERLAP_COMPOUND_Mask = SkTEndian_SwapBE16(1 << 10); 147363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger static const SK_OT_USHORT SCALED_COMPONENT_OFFSET_Mask = SkTEndian_SwapBE16(1 << 11); 148363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger static const SK_OT_USHORT UNSCALED_COMPONENT_OFFSET_mask = SkTEndian_SwapBE16(1 << 12); 149363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger //Reserved 150363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger //Reserved 151363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger //Reserved 152363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SK_OT_USHORT value; 153363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } raw; 154363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } flags; 155363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SK_OT_USHORT glyphIndex; 156363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger union Transform { 157363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger union Matrix { 158363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger /** !WE_HAVE_A_SCALE & !WE_HAVE_AN_X_AND_Y_SCALE & !WE_HAVE_A_TWO_BY_TWO */ 159363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger struct None { } none; 160363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger /** WE_HAVE_A_SCALE */ 161363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger struct Scale { 162363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SK_OT_F2DOT14 a_d; 163363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } scale; 164363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger /** WE_HAVE_AN_X_AND_Y_SCALE */ 165363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger struct ScaleXY { 166363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SK_OT_F2DOT14 a; 167363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SK_OT_F2DOT14 d; 168363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } scaleXY; 169363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger /** WE_HAVE_A_TWO_BY_TWO */ 170363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger struct TwoByTwo { 171363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SK_OT_F2DOT14 a; 172363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SK_OT_F2DOT14 b; 173363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SK_OT_F2DOT14 c; 174363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SK_OT_F2DOT14 d; 175363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } twoByTwo; 176363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger }; 177363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger /** ARG_1_AND_2_ARE_WORDS & ARGS_ARE_XY_VALUES */ 178363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger struct WordValue { 179363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SK_OT_FWORD e; 180363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SK_OT_FWORD f; 181363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkOTTableGlyphData::Composite::Component::Transform::Matrix matrix; 182363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } wordValue; 183363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger /** !ARG_1_AND_2_ARE_WORDS & ARGS_ARE_XY_VALUES */ 184363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger struct ByteValue { 185363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SK_OT_CHAR e; 186363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SK_OT_CHAR f; 187363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkOTTableGlyphData::Composite::Component::Transform::Matrix matrix; 188363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } byteValue; 189363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger /** ARG_1_AND_2_ARE_WORDS & !ARGS_ARE_XY_VALUES */ 190363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger struct WordIndex { 191363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SK_OT_USHORT compoundPointIndex; 192363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SK_OT_USHORT componentPointIndex; 193363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkOTTableGlyphData::Composite::Component::Transform::Matrix matrix; 194363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } wordIndex; 195363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger /** !ARG_1_AND_2_ARE_WORDS & !ARGS_ARE_XY_VALUES */ 196363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger struct ByteIndex { 197363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SK_OT_BYTE compoundPointIndex; 198363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SK_OT_BYTE componentPointIndex; 199363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkOTTableGlyphData::Composite::Component::Transform::Matrix matrix; 200363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } byteIndex; 201363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } transform; 202363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } component;//[] last element does not set MORE_COMPONENTS 203363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 204363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger /** Comes after the last Component if the last component has WE_HAVE_INSTR. */ 205363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger struct Instructions { 206363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SK_OT_USHORT length; 207363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SK_OT_BYTE data[1/*length*/]; 208363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger }; 209363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger }; 210363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger}; 211363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 212363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#pragma pack(pop) 213363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 214363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#endif 215