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