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 
17 struct 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>
147 static_assert(offsetof(SkOTTableHead, glyphDataFormat) == 52, "SkOTTableHead_glyphDataFormat_not_at_52");
148 static_assert(sizeof(SkOTTableHead) == 54, "sizeof_SkOTTableHead_not_54");
149 
150 #endif
151