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_OS_2_VA_DEFINED
9 #define SkOTTable_OS_2_VA_DEFINED
10 
11 #include "src/core/SkEndian.h"
12 #include "src/sfnt/SkIBMFamilyClass.h"
13 #include "src/sfnt/SkOTTableTypes.h"
14 #include "src/sfnt/SkPanose.h"
15 
16 #pragma pack(push, 1)
17 
18 //Original V0 TT
19 struct SkOTTableOS2_VA {
20     SK_OT_USHORT version;
21     //SkOTTableOS2_VA::VERSION and SkOTTableOS2_V0::VERSION are both 0.
22     //The only way to differentiate these two versions is by the size of the table.
23     static const SK_OT_USHORT VERSION = SkTEndian_SwapBE16(0);
24 
25     SK_OT_SHORT xAvgCharWidth;
26     struct WeightClass {
27         enum Value : SK_OT_USHORT {
28             UltraLight = SkTEndian_SwapBE16(1),
29             ExtraLight = SkTEndian_SwapBE16(2),
30             Light = SkTEndian_SwapBE16(3),
31             SemiLight = SkTEndian_SwapBE16(4),
32             Medium = SkTEndian_SwapBE16(5),
33             SemiBold = SkTEndian_SwapBE16(6),
34             Bold = SkTEndian_SwapBE16(7),
35             ExtraBold = SkTEndian_SwapBE16(8),
36             UltraBold = SkTEndian_SwapBE16(9),
37             SK_SEQ_END,
38         } value;
39     } usWeightClass;
40     struct WidthClass {
41         enum Value : SK_OT_USHORT {
42             UltraCondensed = SkTEndian_SwapBE16(1),
43             ExtraCondensed = SkTEndian_SwapBE16(2),
44             Condensed = SkTEndian_SwapBE16(3),
45             SemiCondensed = SkTEndian_SwapBE16(4),
46             Medium = SkTEndian_SwapBE16(5),
47             SemiExpanded = SkTEndian_SwapBE16(6),
48             Expanded = SkTEndian_SwapBE16(7),
49             ExtraExpanded = SkTEndian_SwapBE16(8),
50             UltraExpanded = SkTEndian_SwapBE16(9),
51             SK_SEQ_END,
52         } value;
53     } usWidthClass;
54     union Type {
55         struct Field {
56             //8-15
57             SK_OT_BYTE_BITFIELD(
58                 Reserved08,
59                 Reserved09,
60                 Reserved10,
61                 Reserved11,
62                 Reserved12,
63                 Reserved13,
64                 Reserved14,
65                 Reserved15)
66             //0-7
67             SK_OT_BYTE_BITFIELD(
68                 Reserved00,
69                 Restricted,
70                 PreviewPrint,
71                 Editable,
72                 Reserved04,
73                 Reserved05,
74                 Reserved06,
75                 Reserved07)
76         } field;
77         struct Raw {
78             static const SK_OT_USHORT Installable = 0;
79             static const SK_OT_USHORT RestrictedMask = SkOTSetUSHORTBit<1>::value;
80             static const SK_OT_USHORT PreviewPrintMask = SkOTSetUSHORTBit<2>::value;
81             static const SK_OT_USHORT EditableMask = SkOTSetUSHORTBit<3>::value;
82             SK_OT_USHORT value;
83         } raw;
84     } fsType;
85     SK_OT_SHORT ySubscriptXSize;
86     SK_OT_SHORT ySubscriptYSize;
87     SK_OT_SHORT ySubscriptXOffset;
88     SK_OT_SHORT ySubscriptYOffset;
89     SK_OT_SHORT ySuperscriptXSize;
90     SK_OT_SHORT ySuperscriptYSize;
91     SK_OT_SHORT ySuperscriptXOffset;
92     SK_OT_SHORT ySuperscriptYOffset;
93     SK_OT_SHORT yStrikeoutSize;
94     SK_OT_SHORT yStrikeoutPosition;
95     SkIBMFamilyClass sFamilyClass;
96     SkPanose panose;
97     SK_OT_ULONG ulCharRange[4];
98     SK_OT_CHAR achVendID[4];
99     union Selection {
100         struct Field {
101             //8-15
102             SK_OT_BYTE_BITFIELD(
103                 Reserved08,
104                 Reserved09,
105                 Reserved10,
106                 Reserved11,
107                 Reserved12,
108                 Reserved13,
109                 Reserved14,
110                 Reserved15)
111             //0-7
112             SK_OT_BYTE_BITFIELD(
113                 Italic,
114                 Underscore,
115                 Negative,
116                 Outlined,
117                 Strikeout,
118                 Bold,
119                 Reserved06,
120                 Reserved07)
121         } field;
122         struct Raw {
123             static const SK_OT_USHORT ItalicMask = SkOTSetUSHORTBit<0>::value;
124             static const SK_OT_USHORT UnderscoreMask = SkOTSetUSHORTBit<1>::value;
125             static const SK_OT_USHORT NegativeMask = SkOTSetUSHORTBit<2>::value;
126             static const SK_OT_USHORT OutlinedMask = SkOTSetUSHORTBit<3>::value;
127             static const SK_OT_USHORT StrikeoutMask = SkOTSetUSHORTBit<4>::value;
128             static const SK_OT_USHORT BoldMask = SkOTSetUSHORTBit<5>::value;
129             SK_OT_USHORT value;
130         } raw;
131     } fsSelection;
132     SK_OT_USHORT usFirstCharIndex;
133     SK_OT_USHORT usLastCharIndex;
134 };
135 
136 #pragma pack(pop)
137 
138 
139 static_assert(sizeof(SkOTTableOS2_VA) == 68, "sizeof_SkOTTableOS2_VA_not_68");
140 
141 #endif
142