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_V1_DEFINED
9#define SkOTTable_OS_2_V1_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_V1 {
19 SK_OT_USHORT version;
20 static const SK_OT_USHORT VERSION = SkTEndian_SwapBE16(1);
21
22 SK_OT_SHORT xAvgCharWidth;
23 struct WeightClass {
24 enum Value : SK_OT_USHORT {
25 Thin = SkTEndian_SwapBE16(100),
26 ExtraLight = SkTEndian_SwapBE16(200),
27 Light = SkTEndian_SwapBE16(300),
28 Normal = SkTEndian_SwapBE16(400),
29 Medium = SkTEndian_SwapBE16(500),
30 SemiBold = SkTEndian_SwapBE16(600),
31 Bold = SkTEndian_SwapBE16(700),
32 ExtraBold = SkTEndian_SwapBE16(800),
33 Black = SkTEndian_SwapBE16(900),
34 };
35 SK_OT_USHORT value;
36 } usWeightClass;
37 struct WidthClass {
38 enum Value : SK_OT_USHORT {
39 UltraCondensed = SkTEndian_SwapBE16(1),
40 ExtraCondensed = SkTEndian_SwapBE16(2),
41 Condensed = SkTEndian_SwapBE16(3),
42 SemiCondensed = SkTEndian_SwapBE16(4),
43 Medium = SkTEndian_SwapBE16(5),
44 SemiExpanded = SkTEndian_SwapBE16(6),
45 Expanded = SkTEndian_SwapBE16(7),
46 ExtraExpanded = SkTEndian_SwapBE16(8),
47 UltraExpanded = SkTEndian_SwapBE16(9),
48 } value;
49 } usWidthClass;
50 union Type {
51 struct Field {
52 //8-15
53 SK_OT_BYTE_BITFIELD(
54 Reserved08,
55 Reserved09,
56 Reserved10,
57 Reserved11,
58 Reserved12,
59 Reserved13,
60 Reserved14,
61 Reserved15)
62 //0-7
63 SK_OT_BYTE_BITFIELD(
64 Reserved00,
65 Restricted,
66 PreviewPrint,
67 Editable,
68 Reserved04,
69 Reserved05,
70 Reserved06,
71 Reserved07)
72 } field;
73 struct Raw {
74 static const SK_OT_USHORT Installable = 0;
75 static const SK_OT_USHORT RestrictedMask = SkOTSetUSHORTBit<1>::value;
76 static const SK_OT_USHORT PreviewPrintMask = SkOTSetUSHORTBit<2>::value;
77 static const SK_OT_USHORT EditableMask = SkOTSetUSHORTBit<3>::value;
78 SK_OT_USHORT value;
79 } raw;
80 } fsType;
81 SK_OT_SHORT ySubscriptXSize;
82 SK_OT_SHORT ySubscriptYSize;
83 SK_OT_SHORT ySubscriptXOffset;
84 SK_OT_SHORT ySubscriptYOffset;
85 SK_OT_SHORT ySuperscriptXSize;
86 SK_OT_SHORT ySuperscriptYSize;
87 SK_OT_SHORT ySuperscriptXOffset;
88 SK_OT_SHORT ySuperscriptYOffset;
89 SK_OT_SHORT yStrikeoutSize;
90 SK_OT_SHORT yStrikeoutPosition;
91 SkIBMFamilyClass sFamilyClass;
92 SkPanose panose;
93 union UnicodeRange {
94 struct Field {
95 //l0 24-31
96 SK_OT_BYTE_BITFIELD(
97 Thai,
98 Lao,
99 BasicGeorgian,
100 GeorgianExtended,
101 HangulJamo,
102 LatinExtendedAdditional,
103 GreekExtended,
104 GeneralPunctuation)
105 //l0 16-23
106 SK_OT_BYTE_BITFIELD(
107 Bengali,
108 Gurmukhi,
109 Gujarati,
110 Oriya,
111 Tamil,
112 Telugu,
113 Kannada,
114 Malayalam)
115 //l0 8-15
116 SK_OT_BYTE_BITFIELD(
117 GreekSymbolsAndCoptic,
118 Cyrillic,
119 Armenian,
120 BasicHebrew,
121 HebrewExtendedAB,
122 BasicArabic,
123 ArabicExtended,
124 Devanagari)
125 //l0 0-7
126 SK_OT_BYTE_BITFIELD(
127 BasicLatin,
128 Latin1Supplement,
129 LatinExtendedA,
130 LatinExtendedB,
131 IPAExtensions,
132 SpacingModifierLetters,
133 CombiningDiacriticalMarks,
134 BasicGreek)
135
136 //l1 24-31
137 SK_OT_BYTE_BITFIELD(
138 Hangul,
139 Reserved057,
140 Reserved058,
141 CJKUnifiedIdeographs,
142 PrivateUseArea,
143 CJKCompatibilityIdeographs,
144 AlphabeticPresentationForms,
145 ArabicPresentationFormsA)
146 //l1 16-23
147 SK_OT_BYTE_BITFIELD(
148 CJKSymbolsAndPunctuation,
149 Hiragana,
150 Katakana,
151 Bopomofo,
152 HangulCompatibilityJamo,
153 CJKMiscellaneous,
154 EnclosedCJKLettersAndMonths,
155 CJKCompatibility)
156 //l1 8-15
157 SK_OT_BYTE_BITFIELD(
158 ControlPictures,
159 OpticalCharacterRecognition,
160 EnclosedAlphanumerics,
161 BoxDrawing,
162 BlockElements,
163 GeometricShapes,
164 MiscellaneousSymbols,
165 Dingbats)
166 //l1 0-7
167 SK_OT_BYTE_BITFIELD(
168 SuperscriptsAndSubscripts,
169 CurrencySymbols,
170 CombiningDiacriticalMarksForSymbols,
171 LetterlikeSymbols,
172 NumberForms,
173 Arrows,
174 MathematicalOperators,
175 MiscellaneousTechnical)
176
177 //l2 24-31
178 SK_OT_BYTE_BITFIELD(
179 Reserved088,
180 Reserved089,
181 Reserved090,
182 Reserved091,
183 Reserved092,
184 Reserved093,
185 Reserved094,
186 Reserved095)
187 //l2 16-23
188 SK_OT_BYTE_BITFIELD(
189 Reserved080,
190 Reserved081,
191 Reserved082,
192 Reserved083,
193 Reserved084,
194 Reserved085,
195 Reserved086,
196 Reserved087)
197 //l2 8-15
198 SK_OT_BYTE_BITFIELD(
199 Reserved072,
200 Reserved073,
201 Reserved074,
202 Reserved075,
203 Reserved076,
204 Reserved077,
205 Reserved078,
206 Reserved079)
207 //l2 0-7
208 SK_OT_BYTE_BITFIELD(
209 CombiningHalfMarks,
210 CJKCompatibilityForms,
211 SmallFormVariants,
212 ArabicPresentationFormsB,
213 HalfwidthAndFullwidthForms,
214 Specials,
215 Reserved70,
216 Reserved71)
217
218 //l3 24-31
219 SK_OT_BYTE_BITFIELD(
220 Reserved120,
221 Reserved121,
222 Reserved122,
223 Reserved123,
224 Reserved124,
225 Reserved125,
226 Reserved126,
227 Reserved127)
228 //l3 16-23
229 SK_OT_BYTE_BITFIELD(
230 Reserved112,
231 Reserved113,
232 Reserved114,
233 Reserved115,
234 Reserved116,
235 Reserved117,
236 Reserved118,
237 Reserved119)
238 //l3 8-15
239 SK_OT_BYTE_BITFIELD(
240 Reserved104,
241 Reserved105,
242 Reserved106,
243 Reserved107,
244 Reserved108,
245 Reserved109,
246 Reserved110,
247 Reserved111)
248 //l3 0-7
249 SK_OT_BYTE_BITFIELD(
250 Reserved096,
251 Reserved097,
252 Reserved098,
253 Reserved099,
254 Reserved100,
255 Reserved101,
256 Reserved102,
257 Reserved103)
258 } field;
259 struct Raw {
260 struct l0 {
261 static const SK_OT_ULONG BasicLatinMask = SkOTSetULONGBit<0>::value;
262 static const SK_OT_ULONG Latin1SupplementMask = SkOTSetULONGBit<1>::value;
263 static const SK_OT_ULONG LatinExtendedAMask = SkOTSetULONGBit<2>::value;
264 static const SK_OT_ULONG LatinExtendedBMask = SkOTSetULONGBit<3>::value;
265 static const SK_OT_ULONG IPAExtensionsMask = SkOTSetULONGBit<4>::value;
266 static const SK_OT_ULONG SpacingModifierLettersMask = SkOTSetULONGBit<5>::value;
267 static const SK_OT_ULONG CombiningDiacriticalMarksMask = SkOTSetULONGBit<6>::value;
268 static const SK_OT_ULONG BasicGreekMask = SkOTSetULONGBit<7>::value;
269 static const SK_OT_ULONG GreekSymbolsAndCCopticMask = SkOTSetULONGBit<8>::value;
270 static const SK_OT_ULONG CyrillicMask = SkOTSetULONGBit<9>::value;
271 static const SK_OT_ULONG ArmenianMask = SkOTSetULONGBit<10>::value;
272 static const SK_OT_ULONG BasicHebrewMask = SkOTSetULONGBit<11>::value;
273 static const SK_OT_ULONG HebrewExtendedABMask = SkOTSetULONGBit<12>::value;
274 static const SK_OT_ULONG BasicArabicMask = SkOTSetULONGBit<13>::value;
275 static const SK_OT_ULONG ArabicExtendedMask = SkOTSetULONGBit<14>::value;
276 static const SK_OT_ULONG DevanagariMask = SkOTSetULONGBit<15>::value;
277 static const SK_OT_ULONG BengaliMask = SkOTSetULONGBit<16>::value;
278 static const SK_OT_ULONG GurmukhiMask = SkOTSetULONGBit<17>::value;
279 static const SK_OT_ULONG GujaratiMask = SkOTSetULONGBit<18>::value;
280 static const SK_OT_ULONG OriyaMask = SkOTSetULONGBit<19>::value;
281 static const SK_OT_ULONG TamilMask = SkOTSetULONGBit<20>::value;
282 static const SK_OT_ULONG TeluguMask = SkOTSetULONGBit<21>::value;
283 static const SK_OT_ULONG KannadaMask = SkOTSetULONGBit<22>::value;
284 static const SK_OT_ULONG MalayalamMask = SkOTSetULONGBit<23>::value;
285 static const SK_OT_ULONG ThaiMask = SkOTSetULONGBit<24>::value;
286 static const SK_OT_ULONG LaoMask = SkOTSetULONGBit<25>::value;
287 static const SK_OT_ULONG BasicGeorgianMask = SkOTSetULONGBit<26>::value;
288 static const SK_OT_ULONG GeorgianExtendedMask = SkOTSetULONGBit<27>::value;
289 static const SK_OT_ULONG HangulJamoMask = SkOTSetULONGBit<28>::value;
290 static const SK_OT_ULONG LatinExtendedAdditionalMask = SkOTSetULONGBit<29>::value;
291 static const SK_OT_ULONG GreekExtendedMask = SkOTSetULONGBit<30>::value;
292 static const SK_OT_ULONG GeneralPunctuationMask = SkOTSetULONGBit<31>::value;
293 };
294 struct l1 {
295 static const SK_OT_ULONG SuperscriptsAndSubscriptsMask = SkOTSetULONGBit<32 - 32>::value;
296 static const SK_OT_ULONG CurrencySymbolsMask = SkOTSetULONGBit<33 - 32>::value;
297 static const SK_OT_ULONG CombiningDiacriticalMarksForSymbolsMask = SkOTSetULONGBit<34 - 32>::value;
298 static const SK_OT_ULONG LetterlikeSymbolsMask = SkOTSetULONGBit<35 - 32>::value;
299 static const SK_OT_ULONG NumberFormsMask = SkOTSetULONGBit<36 - 32>::value;
300 static const SK_OT_ULONG ArrowsMask = SkOTSetULONGBit<37 - 32>::value;
301 static const SK_OT_ULONG MathematicalOperatorsMask = SkOTSetULONGBit<38 - 32>::value;
302 static const SK_OT_ULONG MiscellaneousTechnicalMask = SkOTSetULONGBit<39 - 32>::value;
303 static const SK_OT_ULONG ControlPicturesMask = SkOTSetULONGBit<40 - 32>::value;
304 static const SK_OT_ULONG OpticalCharacterRecognitionMask = SkOTSetULONGBit<41 - 32>::value;
305 static const SK_OT_ULONG EnclosedAlphanumericsMask = SkOTSetULONGBit<42 - 32>::value;
306 static const SK_OT_ULONG BoxDrawingMask = SkOTSetULONGBit<43 - 32>::value;
307 static const SK_OT_ULONG BlockElementsMask = SkOTSetULONGBit<44 - 32>::value;
308 static const SK_OT_ULONG GeometricShapesMask = SkOTSetULONGBit<45 - 32>::value;
309 static const SK_OT_ULONG MiscellaneousSymbolsMask = SkOTSetULONGBit<46 - 32>::value;
310 static const SK_OT_ULONG DingbatsMask = SkOTSetULONGBit<47 - 32>::value;
311 static const SK_OT_ULONG CJKSymbolsAndPunctuationMask = SkOTSetULONGBit<48 - 32>::value;
312 static const SK_OT_ULONG HiraganaMask = SkOTSetULONGBit<49 - 32>::value;
313 static const SK_OT_ULONG KatakanaMask = SkOTSetULONGBit<50 - 32>::value;
314 static const SK_OT_ULONG BopomofoMask = SkOTSetULONGBit<51 - 32>::value;
315 static const SK_OT_ULONG HangulCompatibilityJamoMask = SkOTSetULONGBit<52 - 32>::value;
316 static const SK_OT_ULONG CJKMiscellaneousMask = SkOTSetULONGBit<53 - 32>::value;
317 static const SK_OT_ULONG EnclosedCJKLettersAndMonthsMask = SkOTSetULONGBit<54 - 32>::value;
318 static const SK_OT_ULONG CJKCompatibilityMask = SkOTSetULONGBit<55 - 32>::value;
319 static const SK_OT_ULONG HangulMask = SkOTSetULONGBit<56 - 32>::value;
320 //Reserved
321 //Reserved
322 static const SK_OT_ULONG CJKUnifiedIdeographsMask = SkOTSetULONGBit<59 - 32>::value;
323 static const SK_OT_ULONG PrivateUseAreaMask = SkOTSetULONGBit<60 - 32>::value;
324 static const SK_OT_ULONG CJKCompatibilityIdeographsMask = SkOTSetULONGBit<61 - 32>::value;
325 static const SK_OT_ULONG AlphabeticPresentationFormsMask = SkOTSetULONGBit<62 - 32>::value;
326 static const SK_OT_ULONG ArabicPresentationFormsAMask = SkOTSetULONGBit<63 - 32>::value;
327 };
328 struct l2 {
329 static const SK_OT_ULONG CombiningHalfMarksMask = SkOTSetULONGBit<64 - 64>::value;
330 static const SK_OT_ULONG CJKCompatibilityFormsMask = SkOTSetULONGBit<65 - 64>::value;
331 static const SK_OT_ULONG SmallFormVariantsMask = SkOTSetULONGBit<66 - 64>::value;
332 static const SK_OT_ULONG ArabicPresentationFormsBMask = SkOTSetULONGBit<67 - 64>::value;
333 static const SK_OT_ULONG HalfwidthAndFullwidthFormsMask = SkOTSetULONGBit<68 - 64>::value;
334 static const SK_OT_ULONG SpecialsMask = SkOTSetULONGBit<69 - 64>::value;
335 };
336 SK_OT_ULONG value[4];
337 } raw;
338 } ulUnicodeRange;
339 SK_OT_CHAR achVendID[4];
340 union Selection {
341 struct Field {
342 //8-15
343 SK_OT_BYTE_BITFIELD(
344 Reserved08,
345 Reserved09,
346 Reserved10,
347 Reserved11,
348 Reserved12,
349 Reserved13,
350 Reserved14,
351 Reserved15)
352 //0-7
353 SK_OT_BYTE_BITFIELD(
354 Italic,
355 Underscore,
356 Negative,
357 Outlined,
358 Strikeout,
359 Bold,
360 Regular,
361 Reserved07)
362 } field;
363 struct Raw {
364 static const SK_OT_USHORT ItalicMask = SkOTSetUSHORTBit<0>::value;
365 static const SK_OT_USHORT UnderscoreMask = SkOTSetUSHORTBit<1>::value;
366 static const SK_OT_USHORT NegativeMask = SkOTSetUSHORTBit<2>::value;
367 static const SK_OT_USHORT OutlinedMask = SkOTSetUSHORTBit<3>::value;
368 static const SK_OT_USHORT StrikeoutMask = SkOTSetUSHORTBit<4>::value;
369 static const SK_OT_USHORT BoldMask = SkOTSetUSHORTBit<5>::value;
370 static const SK_OT_USHORT RegularMask = SkOTSetUSHORTBit<6>::value;
371 SK_OT_USHORT value;
372 } raw;
373 } fsSelection;
374 SK_OT_USHORT usFirstCharIndex;
375 SK_OT_USHORT usLastCharIndex;
376 //version0
377 SK_OT_SHORT sTypoAscender;
378 SK_OT_SHORT sTypoDescender;
379 SK_OT_SHORT sTypoLineGap;
380 SK_OT_USHORT usWinAscent;
381 SK_OT_USHORT usWinDescent;
382 //version1
383 union CodePageRange {
384 struct Field {
385 //l0 24-31
386 SK_OT_BYTE_BITFIELD(
387 Reserved24,
388 Reserved25,
389 Reserved26,
390 Reserved27,
391 Reserved28,
392 MacintoshCharacterSet,
393 OEMCharacterSet,
394 SymbolCharacterSet)
395 //l0 16-23
396 SK_OT_BYTE_BITFIELD(
397 Thai_874,
398 JISJapan_932,
399 ChineseSimplified_936,
400 KoreanWansung_949,
401 ChineseTraditional_950,
402 KoreanJohab_1361,
403 Reserved22,
404 Reserved23)
405 //l0 8-15
406 SK_OT_BYTE_BITFIELD(
407 Reserved08,
408 Reserved09,
409 Reserved10,
410 Reserved11,
411 Reserved12,
412 Reserved13,
413 Reserved14,
414 Reserved15)
415 //l0 0-7
416 SK_OT_BYTE_BITFIELD(
417 Latin1_1252,
418 Latin2EasternEurope_1250,
419 Cyrillic_1251,
420 Greek_1253,
421 Turkish_1254,
422 Hebrew_1255,
423 Arabic_1256,
424 WindowsBaltic_1257)
425
426 //l1 24-31
427 SK_OT_BYTE_BITFIELD(
428 IBMTurkish_857,
429 IBMCyrillic_855,
430 Latin2_852,
431 MSDOSBaltic_775,
432 Greek_737,
433 Arabic_708,
434 WELatin1_850,
435 US_437)
436 //l1 16-23
437 SK_OT_BYTE_BITFIELD(
438 IBMGreek_869,
439 MSDOSRussian_866,
440 MSDOSNordic_865,
441 Arabic_864,
442 MSDOSCanadianFrench_863,
443 Hebrew_862,
444 MSDOSIcelandic_861,
445 MSDOSPortuguese_860)
446 //l1 8-15
447 SK_OT_BYTE_BITFIELD(
448 Reserved40,
449 Reserved41,
450 Reserved42,
451 Reserved43,
452 Reserved44,
453 Reserved45,
454 Reserved46,
455 Reserved47)
456 //l1 0-7
457 SK_OT_BYTE_BITFIELD(
458 Reserved32,
459 Reserved33,
460 Reserved34,
461 Reserved35,
462 Reserved36,
463 Reserved37,
464 Reserved38,
465 Reserved39)
466 } field;
467 struct Raw {
468 struct l0 {
469 static const SK_OT_ULONG Latin1_1252Mask = SkOTSetULONGBit<0>::value;
470 static const SK_OT_ULONG Latin2EasternEurope_1250Mask = SkOTSetULONGBit<1>::value;
471 static const SK_OT_ULONG Cyrillic_1251Mask = SkOTSetULONGBit<2>::value;
472 static const SK_OT_ULONG Greek_1253Mask = SkOTSetULONGBit<3>::value;
473 static const SK_OT_ULONG Turkish_1254Mask = SkOTSetULONGBit<4>::value;
474 static const SK_OT_ULONG Hebrew_1255Mask = SkOTSetULONGBit<5>::value;
475 static const SK_OT_ULONG Arabic_1256Mask = SkOTSetULONGBit<6>::value;
476 static const SK_OT_ULONG WindowsBaltic_1257Mask = SkOTSetULONGBit<7>::value;
477 static const SK_OT_ULONG Thai_874Mask = SkOTSetULONGBit<16>::value;
478 static const SK_OT_ULONG JISJapan_932Mask = SkOTSetULONGBit<17>::value;
479 static const SK_OT_ULONG ChineseSimplified_936Mask = SkOTSetULONGBit<18>::value;
480 static const SK_OT_ULONG KoreanWansung_949Mask = SkOTSetULONGBit<19>::value;
481 static const SK_OT_ULONG ChineseTraditional_950Mask = SkOTSetULONGBit<20>::value;
482 static const SK_OT_ULONG KoreanJohab_1361Mask = SkOTSetULONGBit<21>::value;
483 static const SK_OT_ULONG MacintoshCharacterSetMask = SkOTSetULONGBit<29>::value;
484 static const SK_OT_ULONG OEMCharacterSetMask = SkOTSetULONGBit<30>::value;
485 static const SK_OT_ULONG SymbolCharacterSetMask = SkOTSetULONGBit<31>::value;
486 };
487 struct l1 {
488 static const SK_OT_ULONG IBMGreek_869Mask = SkOTSetULONGBit<48 - 32>::value;
489 static const SK_OT_ULONG MSDOSRussian_866Mask = SkOTSetULONGBit<49 - 32>::value;
490 static const SK_OT_ULONG MSDOSNordic_865Mask = SkOTSetULONGBit<50 - 32>::value;
491 static const SK_OT_ULONG Arabic_864Mask = SkOTSetULONGBit<51 - 32>::value;
492 static const SK_OT_ULONG MSDOSCanadianFrench_863Mask = SkOTSetULONGBit<52 - 32>::value;
493 static const SK_OT_ULONG Hebrew_862Mask = SkOTSetULONGBit<53 - 32>::value;
494 static const SK_OT_ULONG MSDOSIcelandic_861Mask = SkOTSetULONGBit<54 - 32>::value;
495 static const SK_OT_ULONG MSDOSPortuguese_860Mask = SkOTSetULONGBit<55 - 32>::value;
496 static const SK_OT_ULONG IBMTurkish_857Mask = SkOTSetULONGBit<56 - 32>::value;
497 static const SK_OT_ULONG IBMCyrillic_855Mask = SkOTSetULONGBit<57 - 32>::value;
498 static const SK_OT_ULONG Latin2_852Mask = SkOTSetULONGBit<58 - 32>::value;
499 static const SK_OT_ULONG MSDOSBaltic_775Mask = SkOTSetULONGBit<59 - 32>::value;
500 static const SK_OT_ULONG Greek_737Mask = SkOTSetULONGBit<60 - 32>::value;
501 static const SK_OT_ULONG Arabic_708Mask = SkOTSetULONGBit<61 - 32>::value;
502 static const SK_OT_ULONG WELatin1_850Mask = SkOTSetULONGBit<62 - 32>::value;
503 static const SK_OT_ULONG US_437Mask = SkOTSetULONGBit<63 - 32>::value;
504 };
505 SK_OT_ULONG value[2];
506 } raw;
507 } ulCodePageRange;
508};
509
510#pragma pack(pop)
511
512
513static_assert(sizeof(SkOTTableOS2_V1) == 86, "sizeof_SkOTTableOS2_V1_not_86");
514
515#endif
516