OLD | NEW |
(Empty) | |
| 1 /* |
| 2 * Copyright 2014 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_EBLC_DEFINED |
| 9 #define SkOTTable_EBLC_DEFINED |
| 10 |
| 11 #include "SkEndian.h" |
| 12 #include "SkOTTable_EBDT.h" |
| 13 #include "SkOTTableTypes.h" |
| 14 #include "SkTypedEnum.h" |
| 15 |
| 16 #pragma pack(push, 1) |
| 17 |
| 18 struct SkOTTableEmbeddedBitmapLocation { |
| 19 static const SK_OT_CHAR TAG0 = 'E'; |
| 20 static const SK_OT_CHAR TAG1 = 'B'; |
| 21 static const SK_OT_CHAR TAG2 = 'L'; |
| 22 static const SK_OT_CHAR TAG3 = 'C'; |
| 23 static const SK_OT_ULONG TAG = SkOTTableTAG<SkOTTableEmbeddedBitmapLocation>
::value; |
| 24 |
| 25 SK_OT_Fixed version; |
| 26 static const SK_OT_Fixed version_initial = SkTEndian_SwapBE32(0x00020000); |
| 27 |
| 28 SK_OT_ULONG numSizes; |
| 29 |
| 30 struct SbitLineMetrics { |
| 31 SK_OT_CHAR ascender; |
| 32 SK_OT_CHAR descender; |
| 33 SK_OT_BYTE widthMax; |
| 34 SK_OT_CHAR caretSlopeNumerator; |
| 35 SK_OT_CHAR caretSlopeDenominator; |
| 36 SK_OT_CHAR caretOffset; |
| 37 SK_OT_CHAR minOriginSB; |
| 38 SK_OT_CHAR minAdvanceSB; |
| 39 SK_OT_CHAR maxBeforeBL; |
| 40 SK_OT_CHAR minAfterBL; |
| 41 SK_OT_CHAR pad1; |
| 42 SK_OT_CHAR pad2; |
| 43 }; |
| 44 |
| 45 struct BitmapSizeTable { |
| 46 SK_OT_ULONG indexSubTableArrayOffset; //offset to indexSubtableArray fro
m beginning of EBLC. |
| 47 SK_OT_ULONG indexTablesSize; //number of bytes in corresponding index su
btables and array |
| 48 SK_OT_ULONG numberOfIndexSubTables; //an index subtable for each range o
r format change |
| 49 SK_OT_ULONG colorRef; //not used; set to 0. |
| 50 SbitLineMetrics hori; //line metrics for text rendered horizontally |
| 51 SbitLineMetrics vert; //line metrics for text rendered vertically |
| 52 SK_OT_USHORT startGlyphIndex; //lowest glyph index for this size |
| 53 SK_OT_USHORT endGlyphIndex; //highest glyph index for this size |
| 54 SK_OT_BYTE ppemX; //horizontal pixels per Em |
| 55 SK_OT_BYTE ppemY; //vertical pixels per Em |
| 56 struct BitDepth { |
| 57 SK_TYPED_ENUM(Value, SK_OT_BYTE, |
| 58 ((BW, 1)) |
| 59 ((Gray4, 2)) |
| 60 ((Gray16, 4)) |
| 61 ((Gray256, 8)) |
| 62 SK_SEQ_END, |
| 63 SK_SEQ_END) |
| 64 SK_OT_BYTE value; |
| 65 } bitDepth; //the Microsoft rasterizer v.1.7 or greater supports |
| 66 union Flags { |
| 67 struct Field { |
| 68 //0-7 |
| 69 SK_OT_BYTE_BITFIELD( |
| 70 Horizontal, // Horizontal small glyph metrics |
| 71 Vertical, // Vertical small glyph metrics |
| 72 Reserved02, |
| 73 Reserved03, |
| 74 Reserved04, |
| 75 Reserved05, |
| 76 Reserved06, |
| 77 Reserved07) |
| 78 } field; |
| 79 struct Raw { |
| 80 static const SK_OT_CHAR Horizontal = 1u << 0; |
| 81 static const SK_OT_CHAR Vertical = 1u << 1; |
| 82 SK_OT_CHAR value; |
| 83 } raw; |
| 84 } flags; |
| 85 }; //bitmapSizeTable[numSizes]; |
| 86 |
| 87 struct IndexSubTableArray { |
| 88 SK_OT_USHORT firstGlyphIndex; //first glyph code of this range |
| 89 SK_OT_USHORT lastGlyphIndex; //last glyph code of this range (inclusive) |
| 90 SK_OT_ULONG additionalOffsetToIndexSubtable; //add to BitmapSizeTable::i
ndexSubTableArrayOffset to get offset from beginning of 'EBLC' |
| 91 }; //indexSubTableArray[BitmapSizeTable::numberOfIndexSubTables]; |
| 92 |
| 93 struct IndexSubHeader { |
| 94 SK_OT_USHORT indexFormat; //format of this indexSubTable |
| 95 SK_OT_USHORT imageFormat; //format of 'EBDT' image data |
| 96 SK_OT_ULONG imageDataOffset; //offset to image data in 'EBDT' table |
| 97 }; |
| 98 |
| 99 // Variable metrics glyphs with 4 byte offsets |
| 100 struct IndexSubTable1 { |
| 101 IndexSubHeader header; |
| 102 //SK_OT_ULONG offsetArray[lastGlyphIndex - firstGlyphIndex + 1 + 1]; //l
ast element points to one past end of last glyph |
| 103 //glyphData = offsetArray[glyphIndex - firstGlyphIndex] + imageDataOffse
t |
| 104 }; |
| 105 |
| 106 // All Glyphs have identical metrics |
| 107 struct IndexSubTable2 { |
| 108 IndexSubHeader header; |
| 109 SK_OT_ULONG imageSize; // all glyphs are of the same size |
| 110 SkOTTableEmbeddedBitmapData::BigGlyphMetrics bigMetrics; // all glyphs h
ave the same metrics; glyph data may be compressed, byte-aligned, or bit-aligned |
| 111 }; |
| 112 |
| 113 // Variable metrics glyphs with 2 byte offsets |
| 114 struct IndexSubTable3 { |
| 115 IndexSubHeader header; |
| 116 //SK_OT_USHORT offsetArray[lastGlyphIndex - firstGlyphIndex + 1 + 1]; //
last element points to one past end of last glyph, may have extra element to for
ce even number of elements |
| 117 //glyphData = offsetArray[glyphIndex - firstGlyphIndex] + imageDataOffse
t |
| 118 }; |
| 119 |
| 120 // Variable metrics glyphs with sparse glyph codes |
| 121 struct IndexSubTable4 { |
| 122 IndexSubHeader header; |
| 123 SK_OT_ULONG numGlyphs; |
| 124 struct CodeOffsetPair { |
| 125 SK_OT_USHORT glyphCode; |
| 126 SK_OT_USHORT offset; //location in EBDT |
| 127 }; //glyphArray[numGlyphs+1] |
| 128 }; |
| 129 |
| 130 // Constant metrics glyphs with sparse glyph codes |
| 131 struct IndexSubTable5 { |
| 132 IndexSubHeader header; |
| 133 SK_OT_ULONG imageSize; //all glyphs have the same data size |
| 134 SkOTTableEmbeddedBitmapData::BigGlyphMetrics bigMetrics; //all glyphs ha
ve the same metrics |
| 135 SK_OT_ULONG numGlyphs; |
| 136 //SK_OT_USHORT glyphCodeArray[numGlyphs] //must have even number of entr
ies (set pad to 0) |
| 137 }; |
| 138 |
| 139 union IndexSubTable { |
| 140 IndexSubHeader header; |
| 141 IndexSubTable1 format1; |
| 142 IndexSubTable2 format2; |
| 143 IndexSubTable3 format3; |
| 144 IndexSubTable4 format4; |
| 145 IndexSubTable5 format5; |
| 146 }; |
| 147 |
| 148 }; |
| 149 |
| 150 #pragma pack(pop) |
| 151 |
| 152 #endif |
OLD | NEW |