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