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