|  | /* | 
|  | * Copyright 2014 Google Inc. | 
|  | * | 
|  | * Use of this source code is governed by a BSD-style license that can be | 
|  | * found in the LICENSE file. | 
|  | */ | 
|  |  | 
|  | #ifndef SkOTTable_EBLC_DEFINED | 
|  | #define SkOTTable_EBLC_DEFINED | 
|  |  | 
|  | #include "SkEndian.h" | 
|  | #include "SkOTTable_EBDT.h" | 
|  | #include "SkOTTableTypes.h" | 
|  | #include "SkTypedEnum.h" | 
|  |  | 
|  | #pragma pack(push, 1) | 
|  |  | 
|  | struct SkOTTableEmbeddedBitmapLocation { | 
|  | static const SK_OT_CHAR TAG0 = 'E'; | 
|  | static const SK_OT_CHAR TAG1 = 'B'; | 
|  | static const SK_OT_CHAR TAG2 = 'L'; | 
|  | static const SK_OT_CHAR TAG3 = 'C'; | 
|  | static const SK_OT_ULONG TAG = SkOTTableTAG<SkOTTableEmbeddedBitmapLocation>::value; | 
|  |  | 
|  | SK_OT_Fixed version; | 
|  | static const SK_OT_Fixed version_initial = SkTEndian_SwapBE32(0x00020000); | 
|  |  | 
|  | SK_OT_ULONG numSizes; | 
|  |  | 
|  | struct SbitLineMetrics { | 
|  | SK_OT_CHAR ascender; | 
|  | SK_OT_CHAR descender; | 
|  | SK_OT_BYTE widthMax; | 
|  | SK_OT_CHAR caretSlopeNumerator; | 
|  | SK_OT_CHAR caretSlopeDenominator; | 
|  | SK_OT_CHAR caretOffset; | 
|  | SK_OT_CHAR minOriginSB; | 
|  | SK_OT_CHAR minAdvanceSB; | 
|  | SK_OT_CHAR maxBeforeBL; | 
|  | SK_OT_CHAR minAfterBL; | 
|  | SK_OT_CHAR pad1; | 
|  | SK_OT_CHAR pad2; | 
|  | }; | 
|  |  | 
|  | struct BitmapSizeTable { | 
|  | SK_OT_ULONG indexSubTableArrayOffset; //offset to indexSubtableArray from beginning of EBLC. | 
|  | SK_OT_ULONG indexTablesSize; //number of bytes in corresponding index subtables and array | 
|  | SK_OT_ULONG numberOfIndexSubTables; //an index subtable for each range or format change | 
|  | SK_OT_ULONG colorRef; //not used; set to 0. | 
|  | SbitLineMetrics hori; //line metrics for text rendered horizontally | 
|  | SbitLineMetrics vert; //line metrics for text rendered vertically | 
|  | SK_OT_USHORT startGlyphIndex; //lowest glyph index for this size | 
|  | SK_OT_USHORT endGlyphIndex; //highest glyph index for this size | 
|  | SK_OT_BYTE ppemX; //horizontal pixels per Em | 
|  | SK_OT_BYTE ppemY; //vertical pixels per Em | 
|  | struct BitDepth { | 
|  | SK_TYPED_ENUM(Value, SK_OT_BYTE, | 
|  | ((BW, 1)) | 
|  | ((Gray4, 2)) | 
|  | ((Gray16, 4)) | 
|  | ((Gray256, 8)) | 
|  | SK_SEQ_END, | 
|  | SK_SEQ_END) | 
|  | SK_OT_BYTE value; | 
|  | } bitDepth; //the Microsoft rasterizer v.1.7 or greater supports | 
|  | union Flags { | 
|  | struct Field { | 
|  | //0-7 | 
|  | SK_OT_BYTE_BITFIELD( | 
|  | Horizontal, // Horizontal small glyph metrics | 
|  | Vertical,  // Vertical small glyph metrics | 
|  | Reserved02, | 
|  | Reserved03, | 
|  | Reserved04, | 
|  | Reserved05, | 
|  | Reserved06, | 
|  | Reserved07) | 
|  | } field; | 
|  | struct Raw { | 
|  | static const SK_OT_CHAR Horizontal = 1u << 0; | 
|  | static const SK_OT_CHAR Vertical = 1u << 1; | 
|  | SK_OT_CHAR value; | 
|  | } raw; | 
|  | } flags; | 
|  | }; //bitmapSizeTable[numSizes]; | 
|  |  | 
|  | struct IndexSubTableArray { | 
|  | SK_OT_USHORT firstGlyphIndex; //first glyph code of this range | 
|  | SK_OT_USHORT lastGlyphIndex; //last glyph code of this range (inclusive) | 
|  | SK_OT_ULONG additionalOffsetToIndexSubtable; //add to BitmapSizeTable::indexSubTableArrayOffset to get offset from beginning of 'EBLC' | 
|  | }; //indexSubTableArray[BitmapSizeTable::numberOfIndexSubTables]; | 
|  |  | 
|  | struct IndexSubHeader { | 
|  | SK_OT_USHORT indexFormat; //format of this indexSubTable | 
|  | SK_OT_USHORT imageFormat; //format of 'EBDT' image data | 
|  | SK_OT_ULONG imageDataOffset; //offset to image data in 'EBDT' table | 
|  | }; | 
|  |  | 
|  | // Variable metrics glyphs with 4 byte offsets | 
|  | struct IndexSubTable1 { | 
|  | IndexSubHeader header; | 
|  | //SK_OT_ULONG offsetArray[lastGlyphIndex - firstGlyphIndex + 1 + 1]; //last element points to one past end of last glyph | 
|  | //glyphData = offsetArray[glyphIndex - firstGlyphIndex] + imageDataOffset | 
|  | }; | 
|  |  | 
|  | // All Glyphs have identical metrics | 
|  | struct IndexSubTable2 { | 
|  | IndexSubHeader header; | 
|  | SK_OT_ULONG imageSize; // all glyphs are of the same size | 
|  | SkOTTableEmbeddedBitmapData::BigGlyphMetrics bigMetrics; // all glyphs have the same metrics; glyph data may be compressed, byte-aligned, or bit-aligned | 
|  | }; | 
|  |  | 
|  | // Variable metrics glyphs with 2 byte offsets | 
|  | struct IndexSubTable3 { | 
|  | IndexSubHeader header; | 
|  | //SK_OT_USHORT offsetArray[lastGlyphIndex - firstGlyphIndex + 1 + 1]; //last element points to one past end of last glyph, may have extra element to force even number of elements | 
|  | //glyphData = offsetArray[glyphIndex - firstGlyphIndex] + imageDataOffset | 
|  | }; | 
|  |  | 
|  | // Variable metrics glyphs with sparse glyph codes | 
|  | struct IndexSubTable4 { | 
|  | IndexSubHeader header; | 
|  | SK_OT_ULONG numGlyphs; | 
|  | struct CodeOffsetPair { | 
|  | SK_OT_USHORT glyphCode; | 
|  | SK_OT_USHORT offset; //location in EBDT | 
|  | }; //glyphArray[numGlyphs+1] | 
|  | }; | 
|  |  | 
|  | // Constant metrics glyphs with sparse glyph codes | 
|  | struct IndexSubTable5 { | 
|  | IndexSubHeader header; | 
|  | SK_OT_ULONG imageSize; //all glyphs have the same data size | 
|  | SkOTTableEmbeddedBitmapData::BigGlyphMetrics bigMetrics; //all glyphs have the same metrics | 
|  | SK_OT_ULONG numGlyphs; | 
|  | //SK_OT_USHORT glyphCodeArray[numGlyphs] //must have even number of entries (set pad to 0) | 
|  | }; | 
|  |  | 
|  | union IndexSubTable { | 
|  | IndexSubHeader header; | 
|  | IndexSubTable1 format1; | 
|  | IndexSubTable2 format2; | 
|  | IndexSubTable3 format3; | 
|  | IndexSubTable4 format4; | 
|  | IndexSubTable5 format5; | 
|  | }; | 
|  |  | 
|  | }; | 
|  |  | 
|  | #pragma pack(pop) | 
|  |  | 
|  | #endif |