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