1/*
2 * Copyright 2012 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#ifndef SkOTTable_head_DEFINED
9#define SkOTTable_head_DEFINED
10
11#include "SkEndian.h"
12#include "SkOTTableTypes.h"
13#include "SkTypedEnum.h"
14
15#pragma pack(push, 1)
16
17struct SkOTTableHead {
18    static const SK_OT_CHAR TAG0 = 'h';
19    static const SK_OT_CHAR TAG1 = 'e';
20    static const SK_OT_CHAR TAG2 = 'a';
21    static const SK_OT_CHAR TAG3 = 'd';
22    static const SK_OT_ULONG TAG = SkOTTableTAG<SkOTTableHead>::value;
23
24    SK_OT_Fixed version;
25    static const SK_OT_Fixed version1 = SkTEndian_SwapBE32(0x00010000);
26    SK_OT_Fixed fontRevision;
27    static const uint32_t fontChecksum = 0xB1B0AFBA; //checksum of all TT fonts
28    SK_OT_ULONG checksumAdjustment;
29    SK_OT_ULONG magicNumber;
30    static const SK_OT_ULONG magicNumberConst = SkTEndian_SwapBE32(0x5F0F3CF5);
31    union Flags {
32        struct Field {
33            //8-15
34            SK_OT_BYTE_BITFIELD(
35                GXMetamorphosis_Apple,
36                HasStrongRTL_Apple,
37                HasIndicStyleRearrangement,
38                AgfaMicroTypeExpressProcessed,
39                FontConverted,
40                DesignedForClearType,
41                LastResort,
42                Reserved15)
43            //0-7
44            SK_OT_BYTE_BITFIELD(
45                BaselineAtY0,
46                LeftSidebearingAtX0,
47                InstructionsDependOnPointSize,
48                IntegerScaling,
49                InstructionsAlterAdvanceWidth,
50                VerticalCenteredGlyphs_Apple,
51                Reserved06,
52                RequiresLayout_Apple)
53        } field;
54        struct Raw {
55            static const SK_OT_USHORT BaselineAtY0Mask = SkTEndian_SwapBE16(1 << 0);
56            static const SK_OT_USHORT LeftSidebearingAtX0Mask = SkTEndian_SwapBE16(1 << 1);
57            static const SK_OT_USHORT InstructionsDependOnPointSizeMask = SkTEndian_SwapBE16(1 << 2);
58            static const SK_OT_USHORT IntegerScalingMask = SkTEndian_SwapBE16(1 << 3);
59            static const SK_OT_USHORT InstructionsAlterAdvanceWidthMask = SkTEndian_SwapBE16(1 << 4);
60            static const SK_OT_USHORT VerticalCenteredGlyphs_AppleMask = SkTEndian_SwapBE16(1 << 5);
61            //Reserved
62            static const SK_OT_USHORT RequiresLayout_AppleMask = SkTEndian_SwapBE16(1 << 7);
63
64            static const SK_OT_USHORT GXMetamorphosis_AppleMask = SkTEndian_SwapBE16(1 << 8);
65            static const SK_OT_USHORT HasStrongRTL_AppleMask = SkTEndian_SwapBE16(1 << 9);
66            static const SK_OT_USHORT HasIndicStyleRearrangementMask = SkTEndian_SwapBE16(1 << 10);
67            static const SK_OT_USHORT AgfaMicroTypeExpressProcessedMask = SkTEndian_SwapBE16(1 << 11);
68            static const SK_OT_USHORT FontConvertedMask = SkTEndian_SwapBE16(1 << 12);
69            static const SK_OT_USHORT DesignedForClearTypeMask = SkTEndian_SwapBE16(1 << 13);
70            static const SK_OT_USHORT LastResortMask = SkTEndian_SwapBE16(1 << 14);
71            //Reserved
72            SK_OT_USHORT value;
73        } raw;
74    } flags;
75    SK_OT_USHORT unitsPerEm;
76    SK_OT_LONGDATETIME created;
77    SK_OT_LONGDATETIME modified;
78    SK_OT_SHORT xMin;
79    SK_OT_SHORT yMin;
80    SK_OT_SHORT xMax;
81    SK_OT_SHORT yMax;
82    union MacStyle {
83        struct Field {
84            //8-15
85            SK_OT_BYTE_BITFIELD(
86                Reserved08,
87                Reserved09,
88                Reserved10,
89                Reserved11,
90                Reserved12,
91                Reserved13,
92                Reserved14,
93                Reserved15)
94            //0-7
95            SK_OT_BYTE_BITFIELD(
96                Bold,
97                Italic,
98                Underline,
99                Outline,
100                Shadow,
101                Condensed,
102                Extended,
103                Reserved07)
104        } field;
105        struct Raw {
106            static const SK_OT_USHORT BoldMask = SkTEndian_SwapBE16(1);
107            static const SK_OT_USHORT ItalicMask = SkTEndian_SwapBE16(1 << 1);
108            static const SK_OT_USHORT UnderlineMask = SkTEndian_SwapBE16(1 << 2);
109            static const SK_OT_USHORT OutlineMask = SkTEndian_SwapBE16(1 << 3);
110            static const SK_OT_USHORT ShadowMask = SkTEndian_SwapBE16(1 << 4);
111            static const SK_OT_USHORT CondensedMask = SkTEndian_SwapBE16(1 << 5);
112            static const SK_OT_USHORT ExtendedMask = SkTEndian_SwapBE16(1 << 6);
113
114            SK_OT_USHORT value;
115        } raw;
116    } macStyle;
117    SK_OT_USHORT lowestRecPPEM;
118    struct FontDirectionHint {
119        SK_TYPED_ENUM(Value, SK_OT_SHORT,
120            ((FullyMixedDirectionalGlyphs, SkTEndian_SwapBE16(0)))
121            ((OnlyStronglyLTR, SkTEndian_SwapBE16(1)))
122            ((StronglyLTR, SkTEndian_SwapBE16(2)))
123            ((OnlyStronglyRTL, static_cast<SK_OT_SHORT>(SkTEndian_SwapBE16((uint16_t)-1))))
124            ((StronglyRTL, static_cast<SK_OT_SHORT>(SkTEndian_SwapBE16((uint16_t)-2))))
125            SK_SEQ_END,
126        (value)SK_SEQ_END)
127    } fontDirectionHint;
128    struct IndexToLocFormat {
129        SK_TYPED_ENUM(Value, SK_OT_SHORT,
130            ((ShortOffsets, SkTEndian_SwapBE16(0)))
131            ((LongOffsets, SkTEndian_SwapBE16(1)))
132            SK_SEQ_END,
133        (value)SK_SEQ_END)
134    } indexToLocFormat;
135    struct GlyphDataFormat {
136        SK_TYPED_ENUM(Value, SK_OT_SHORT,
137            ((CurrentFormat, SkTEndian_SwapBE16(0)))
138            SK_SEQ_END,
139        (value)SK_SEQ_END)
140    } glyphDataFormat;
141};
142
143#pragma pack(pop)
144
145
146#include <stddef.h>
147SK_COMPILE_ASSERT(offsetof(SkOTTableHead, glyphDataFormat) == 52, SkOTTableHead_glyphDataFormat_not_at_52);
148SK_COMPILE_ASSERT(sizeof(SkOTTableHead) == 54, sizeof_SkOTTableHead_not_54);
149
150#endif
151