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