/* * 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" #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 { enum Value : SK_OT_BYTE { BW = 1, Gray4 = 2, Gray16 = 4, Gray256 = 8, }; 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