1058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com/* 2058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com * Copyright 2014 Google Inc. 3058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com * 4058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com * Use of this source code is governed by a BSD-style license that can be 5058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com * found in the LICENSE file. 6058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com */ 7058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com 8058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com#ifndef SkOTTable_EBLC_DEFINED 9058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com#define SkOTTable_EBLC_DEFINED 10058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com 11058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com#include "SkEndian.h" 12058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com#include "SkOTTable_EBDT.h" 13058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com#include "SkOTTableTypes.h" 14058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com#include "SkTypedEnum.h" 15058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com 16058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com#pragma pack(push, 1) 17058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com 18058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.comstruct SkOTTableEmbeddedBitmapLocation { 19058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com static const SK_OT_CHAR TAG0 = 'E'; 20058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com static const SK_OT_CHAR TAG1 = 'B'; 21058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com static const SK_OT_CHAR TAG2 = 'L'; 22058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com static const SK_OT_CHAR TAG3 = 'C'; 23058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com static const SK_OT_ULONG TAG = SkOTTableTAG<SkOTTableEmbeddedBitmapLocation>::value; 24058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com 25058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com SK_OT_Fixed version; 26058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com static const SK_OT_Fixed version_initial = SkTEndian_SwapBE32(0x00020000); 27058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com 28058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com SK_OT_ULONG numSizes; 29058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com 30058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com struct SbitLineMetrics { 31058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com SK_OT_CHAR ascender; 32058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com SK_OT_CHAR descender; 33058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com SK_OT_BYTE widthMax; 34058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com SK_OT_CHAR caretSlopeNumerator; 35058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com SK_OT_CHAR caretSlopeDenominator; 36058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com SK_OT_CHAR caretOffset; 37058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com SK_OT_CHAR minOriginSB; 38058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com SK_OT_CHAR minAdvanceSB; 39058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com SK_OT_CHAR maxBeforeBL; 40058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com SK_OT_CHAR minAfterBL; 41058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com SK_OT_CHAR pad1; 42058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com SK_OT_CHAR pad2; 43058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com }; 44058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com 45058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com struct BitmapSizeTable { 46058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com SK_OT_ULONG indexSubTableArrayOffset; //offset to indexSubtableArray from beginning of EBLC. 47058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com SK_OT_ULONG indexTablesSize; //number of bytes in corresponding index subtables and array 48058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com SK_OT_ULONG numberOfIndexSubTables; //an index subtable for each range or format change 49058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com SK_OT_ULONG colorRef; //not used; set to 0. 50058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com SbitLineMetrics hori; //line metrics for text rendered horizontally 51058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com SbitLineMetrics vert; //line metrics for text rendered vertically 52058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com SK_OT_USHORT startGlyphIndex; //lowest glyph index for this size 53058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com SK_OT_USHORT endGlyphIndex; //highest glyph index for this size 54058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com SK_OT_BYTE ppemX; //horizontal pixels per Em 55058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com SK_OT_BYTE ppemY; //vertical pixels per Em 56058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com struct BitDepth { 57058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com SK_TYPED_ENUM(Value, SK_OT_BYTE, 58058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com ((BW, 1)) 59058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com ((Gray4, 2)) 60058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com ((Gray16, 4)) 61058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com ((Gray256, 8)) 62058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com SK_SEQ_END, 63058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com SK_SEQ_END) 64058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com SK_OT_BYTE value; 65058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com } bitDepth; //the Microsoft rasterizer v.1.7 or greater supports 66058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com union Flags { 67058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com struct Field { 68058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com //0-7 69058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com SK_OT_BYTE_BITFIELD( 70058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com Horizontal, // Horizontal small glyph metrics 71058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com Vertical, // Vertical small glyph metrics 72058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com Reserved02, 73058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com Reserved03, 74058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com Reserved04, 75058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com Reserved05, 76058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com Reserved06, 77058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com Reserved07) 78058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com } field; 79058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com struct Raw { 80058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com static const SK_OT_CHAR Horizontal = 1u << 0; 81058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com static const SK_OT_CHAR Vertical = 1u << 1; 82058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com SK_OT_CHAR value; 83058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com } raw; 84058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com } flags; 85058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com }; //bitmapSizeTable[numSizes]; 86058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com 87058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com struct IndexSubTableArray { 88058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com SK_OT_USHORT firstGlyphIndex; //first glyph code of this range 89058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com SK_OT_USHORT lastGlyphIndex; //last glyph code of this range (inclusive) 90058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com SK_OT_ULONG additionalOffsetToIndexSubtable; //add to BitmapSizeTable::indexSubTableArrayOffset to get offset from beginning of 'EBLC' 91058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com }; //indexSubTableArray[BitmapSizeTable::numberOfIndexSubTables]; 92058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com 93058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com struct IndexSubHeader { 94058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com SK_OT_USHORT indexFormat; //format of this indexSubTable 95058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com SK_OT_USHORT imageFormat; //format of 'EBDT' image data 96058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com SK_OT_ULONG imageDataOffset; //offset to image data in 'EBDT' table 97058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com }; 98058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com 99058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com // Variable metrics glyphs with 4 byte offsets 100058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com struct IndexSubTable1 { 101058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com IndexSubHeader header; 102058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com //SK_OT_ULONG offsetArray[lastGlyphIndex - firstGlyphIndex + 1 + 1]; //last element points to one past end of last glyph 103058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com //glyphData = offsetArray[glyphIndex - firstGlyphIndex] + imageDataOffset 104058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com }; 105058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com 106058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com // All Glyphs have identical metrics 107058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com struct IndexSubTable2 { 108058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com IndexSubHeader header; 109058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com SK_OT_ULONG imageSize; // all glyphs are of the same size 110058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com SkOTTableEmbeddedBitmapData::BigGlyphMetrics bigMetrics; // all glyphs have the same metrics; glyph data may be compressed, byte-aligned, or bit-aligned 111058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com }; 112058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com 113058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com // Variable metrics glyphs with 2 byte offsets 114058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com struct IndexSubTable3 { 115058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com IndexSubHeader header; 116058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com //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 117058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com //glyphData = offsetArray[glyphIndex - firstGlyphIndex] + imageDataOffset 118058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com }; 119058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com 120058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com // Variable metrics glyphs with sparse glyph codes 121058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com struct IndexSubTable4 { 122058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com IndexSubHeader header; 123058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com SK_OT_ULONG numGlyphs; 124058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com struct CodeOffsetPair { 125058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com SK_OT_USHORT glyphCode; 126058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com SK_OT_USHORT offset; //location in EBDT 127058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com }; //glyphArray[numGlyphs+1] 128058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com }; 129058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com 130058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com // Constant metrics glyphs with sparse glyph codes 131058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com struct IndexSubTable5 { 132058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com IndexSubHeader header; 133058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com SK_OT_ULONG imageSize; //all glyphs have the same data size 134058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com SkOTTableEmbeddedBitmapData::BigGlyphMetrics bigMetrics; //all glyphs have the same metrics 135058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com SK_OT_ULONG numGlyphs; 136058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com //SK_OT_USHORT glyphCodeArray[numGlyphs] //must have even number of entries (set pad to 0) 137058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com }; 138058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com 139058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com union IndexSubTable { 140058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com IndexSubHeader header; 141058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com IndexSubTable1 format1; 142058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com IndexSubTable2 format2; 143058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com IndexSubTable3 format3; 144058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com IndexSubTable4 format4; 145058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com IndexSubTable5 format5; 146058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com }; 147058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com 148058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com}; 149058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com 150058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com#pragma pack(pop) 151058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com 152058670b1e52910e61d9de294a46b5023ed6dd964bungeman@google.com#endif 153