| Index: src/sfnt/SkOTTable_EBLC.h
|
| ===================================================================
|
| --- src/sfnt/SkOTTable_EBLC.h (revision 0)
|
| +++ src/sfnt/SkOTTable_EBLC.h (working copy)
|
| @@ -0,0 +1,152 @@
|
| +/*
|
| + * 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 "SkEndian.h"
|
| +#include "SkOTTable_EBDT.h"
|
| +#include "SkOTTableTypes.h"
|
| +#include "SkTypedEnum.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 {
|
| + SK_TYPED_ENUM(Value, SK_OT_BYTE,
|
| + ((BW, 1))
|
| + ((Gray4, 2))
|
| + ((Gray16, 4))
|
| + ((Gray256, 8))
|
| + SK_SEQ_END,
|
| + SK_SEQ_END)
|
| + 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
|
|
|