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