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 18 struct 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 144 static_assert(sizeof(SkOTTableOS2_V0) == 78, "sizeof_SkOTTableOS2_V0_not_78"); 145 146 #endif 147