123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150 |
- /*
- * Copyright 2014 Google Inc.
- *
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
- #ifndef SkOTTable_EBLC_DEFINED
- #define SkOTTable_EBLC_DEFINED
- #include "src/core/SkEndian.h"
- #include "src/sfnt/SkOTTableTypes.h"
- #include "src/sfnt/SkOTTable_EBDT.h"
- #pragma pack(push, 1)
- struct SkOTTableEmbeddedBitmapLocation {
- static const SK_OT_CHAR TAG0 = 'E';
- static const SK_OT_CHAR TAG1 = 'B';
- static const SK_OT_CHAR TAG2 = 'L';
- static const SK_OT_CHAR TAG3 = 'C';
- static const SK_OT_ULONG TAG = SkOTTableTAG<SkOTTableEmbeddedBitmapLocation>::value;
- SK_OT_Fixed version;
- static const SK_OT_Fixed version_initial = SkTEndian_SwapBE32(0x00020000);
- SK_OT_ULONG numSizes;
- struct SbitLineMetrics {
- SK_OT_CHAR ascender;
- SK_OT_CHAR descender;
- SK_OT_BYTE widthMax;
- SK_OT_CHAR caretSlopeNumerator;
- SK_OT_CHAR caretSlopeDenominator;
- SK_OT_CHAR caretOffset;
- SK_OT_CHAR minOriginSB;
- SK_OT_CHAR minAdvanceSB;
- SK_OT_CHAR maxBeforeBL;
- SK_OT_CHAR minAfterBL;
- SK_OT_CHAR pad1;
- SK_OT_CHAR pad2;
- };
- struct BitmapSizeTable {
- SK_OT_ULONG indexSubTableArrayOffset; //offset to indexSubtableArray from beginning of EBLC.
- SK_OT_ULONG indexTablesSize; //number of bytes in corresponding index subtables and array
- SK_OT_ULONG numberOfIndexSubTables; //an index subtable for each range or format change
- SK_OT_ULONG colorRef; //not used; set to 0.
- SbitLineMetrics hori; //line metrics for text rendered horizontally
- SbitLineMetrics vert; //line metrics for text rendered vertically
- SK_OT_USHORT startGlyphIndex; //lowest glyph index for this size
- SK_OT_USHORT endGlyphIndex; //highest glyph index for this size
- SK_OT_BYTE ppemX; //horizontal pixels per Em
- SK_OT_BYTE ppemY; //vertical pixels per Em
- struct BitDepth {
- enum Value : SK_OT_BYTE {
- BW = 1,
- Gray4 = 2,
- Gray16 = 4,
- Gray256 = 8,
- };
- SK_OT_BYTE value;
- } bitDepth; //the Microsoft rasterizer v.1.7 or greater supports
- union Flags {
- struct Field {
- //0-7
- SK_OT_BYTE_BITFIELD(
- Horizontal, // Horizontal small glyph metrics
- Vertical, // Vertical small glyph metrics
- Reserved02,
- Reserved03,
- Reserved04,
- Reserved05,
- Reserved06,
- Reserved07)
- } field;
- struct Raw {
- static const SK_OT_CHAR Horizontal = 1u << 0;
- static const SK_OT_CHAR Vertical = 1u << 1;
- SK_OT_CHAR value;
- } raw;
- } flags;
- }; //bitmapSizeTable[numSizes];
- struct IndexSubTableArray {
- SK_OT_USHORT firstGlyphIndex; //first glyph code of this range
- SK_OT_USHORT lastGlyphIndex; //last glyph code of this range (inclusive)
- SK_OT_ULONG additionalOffsetToIndexSubtable; //add to BitmapSizeTable::indexSubTableArrayOffset to get offset from beginning of 'EBLC'
- }; //indexSubTableArray[BitmapSizeTable::numberOfIndexSubTables];
- struct IndexSubHeader {
- SK_OT_USHORT indexFormat; //format of this indexSubTable
- SK_OT_USHORT imageFormat; //format of 'EBDT' image data
- SK_OT_ULONG imageDataOffset; //offset to image data in 'EBDT' table
- };
- // Variable metrics glyphs with 4 byte offsets
- struct IndexSubTable1 {
- IndexSubHeader header;
- //SK_OT_ULONG offsetArray[lastGlyphIndex - firstGlyphIndex + 1 + 1]; //last element points to one past end of last glyph
- //glyphData = offsetArray[glyphIndex - firstGlyphIndex] + imageDataOffset
- };
- // All Glyphs have identical metrics
- struct IndexSubTable2 {
- IndexSubHeader header;
- SK_OT_ULONG imageSize; // all glyphs are of the same size
- SkOTTableEmbeddedBitmapData::BigGlyphMetrics bigMetrics; // all glyphs have the same metrics; glyph data may be compressed, byte-aligned, or bit-aligned
- };
- // Variable metrics glyphs with 2 byte offsets
- struct IndexSubTable3 {
- IndexSubHeader header;
- //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
- //glyphData = offsetArray[glyphIndex - firstGlyphIndex] + imageDataOffset
- };
- // Variable metrics glyphs with sparse glyph codes
- struct IndexSubTable4 {
- IndexSubHeader header;
- SK_OT_ULONG numGlyphs;
- struct CodeOffsetPair {
- SK_OT_USHORT glyphCode;
- SK_OT_USHORT offset; //location in EBDT
- }; //glyphArray[numGlyphs+1]
- };
- // Constant metrics glyphs with sparse glyph codes
- struct IndexSubTable5 {
- IndexSubHeader header;
- SK_OT_ULONG imageSize; //all glyphs have the same data size
- SkOTTableEmbeddedBitmapData::BigGlyphMetrics bigMetrics; //all glyphs have the same metrics
- SK_OT_ULONG numGlyphs;
- //SK_OT_USHORT glyphCodeArray[numGlyphs] //must have even number of entries (set pad to 0)
- };
- union IndexSubTable {
- IndexSubHeader header;
- IndexSubTable1 format1;
- IndexSubTable2 format2;
- IndexSubTable3 format3;
- IndexSubTable4 format4;
- IndexSubTable5 format5;
- };
- };
- #pragma pack(pop)
- #endif
|