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