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