Add support for kEmbeddedBitmapText_Flag to DirectWrite.

R=reed@google.com

Review URL: https://codereview.chromium.org/263503004

git-svn-id: http://skia.googlecode.com/svn/trunk@14518 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/src/sfnt/SkOTTable_EBDT.h b/src/sfnt/SkOTTable_EBDT.h
new file mode 100644
index 0000000..89d7a3a
--- /dev/null
+++ b/src/sfnt/SkOTTable_EBDT.h
@@ -0,0 +1,109 @@
+/*
+ * 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_EBDT_DEFINED
+#define SkOTTable_EBDT_DEFINED
+
+#include "SkEndian.h"
+#include "SkOTTableTypes.h"
+#include "SkOTTable_head.h"
+#include "SkOTTable_loca.h"
+#include "SkTypedEnum.h"
+
+#pragma pack(push, 1)
+
+struct SkOTTableEmbeddedBitmapData {
+    static const SK_OT_CHAR TAG0 = 'E';
+    static const SK_OT_CHAR TAG1 = 'B';
+    static const SK_OT_CHAR TAG2 = 'D';
+    static const SK_OT_CHAR TAG3 = 'T';
+    static const SK_OT_ULONG TAG = SkOTTableTAG<SkOTTableEmbeddedBitmapData>::value;
+
+    SK_OT_Fixed version;
+    static const SK_OT_Fixed version_initial = SkTEndian_SwapBE32(0x00020000);
+
+    struct BigGlyphMetrics {
+        SK_OT_BYTE height;
+        SK_OT_BYTE width;
+        SK_OT_CHAR horiBearingX;
+        SK_OT_CHAR horiBearingY;
+        SK_OT_BYTE horiAdvance;
+        SK_OT_CHAR vertBearingX;
+        SK_OT_CHAR vertBearingY;
+        SK_OT_BYTE vertAdvance;
+    };
+
+    struct SmallGlyphMetrics {
+        SK_OT_BYTE height;
+        SK_OT_BYTE width;
+        SK_OT_CHAR bearingX;
+        SK_OT_CHAR bearingY;
+        SK_OT_BYTE advance;
+    };
+
+    // Small metrics, byte-aligned data.
+    struct Format1 {
+        SmallGlyphMetrics smallGlyphMetrics;
+        //SK_OT_BYTE[] byteAlignedBitmap;
+    };
+
+    // Small metrics, bit-aligned data.
+    struct Format2 {
+        SmallGlyphMetrics smallGlyphMetrics;
+        //SK_OT_BYTE[] bitAlignedBitmap;
+    };
+
+    // Format 3 is not used.
+
+    // EBLC metrics (IndexSubTable::header::indexFormat 2 or 5), compressed data.
+    // Only used on Mac.
+    struct Format4 {
+        SK_OT_ULONG whiteTreeOffset;
+        SK_OT_ULONG blackTreeOffset;
+        SK_OT_ULONG glyphDataOffset;
+    };
+
+    // EBLC metrics (IndexSubTable::header::indexFormat 2 or 5), bit-aligned data.
+    struct Format5 {
+        //SK_OT_BYTE[] bitAlignedBitmap;
+    };
+
+    // Big metrics, byte-aligned data.
+    struct Format6 {
+        BigGlyphMetrics bigGlyphMetrics;
+        //SK_OT_BYTE[] byteAlignedBitmap;
+    };
+
+    // Big metrics, bit-aligned data.
+    struct Format7 {
+        BigGlyphMetrics bigGlyphMetrics;
+        //SK_OT_BYTE[] bitAlignedBitmap;
+    };
+
+    struct EBDTComponent {
+        SK_OT_USHORT glyphCode; // Component glyph code
+        SK_OT_CHAR xOffset; // Position of component left
+        SK_OT_CHAR yOffset; // Position of component top
+    };
+
+    struct Format8 {
+        SmallGlyphMetrics smallMetrics; // Metrics information for the glyph
+        SK_OT_BYTE pad; // Pad to short boundary
+        SK_OT_USHORT numComponents; // Number of components
+        //EBDTComponent componentArray[numComponents]; // Glyph code, offset array
+    };
+
+    struct Format9 {
+        BigGlyphMetrics bigMetrics; // Metrics information for the glyph
+        SK_OT_USHORT numComponents; // Number of components
+        //EBDTComponent componentArray[numComponents]; // Glyph code, offset array
+    };
+};
+
+#pragma pack(pop)
+
+#endif
diff --git a/src/sfnt/SkOTTable_EBLC.h b/src/sfnt/SkOTTable_EBLC.h
new file mode 100644
index 0000000..845418d
--- /dev/null
+++ b/src/sfnt/SkOTTable_EBLC.h
@@ -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
diff --git a/src/sfnt/SkOTTable_EBSC.h b/src/sfnt/SkOTTable_EBSC.h
new file mode 100644
index 0000000..316c45d
--- /dev/null
+++ b/src/sfnt/SkOTTable_EBSC.h
@@ -0,0 +1,41 @@
+/*
+ * 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_EBSC_DEFINED
+#define SkOTTable_EBSC_DEFINED
+
+#include "SkEndian.h"
+#include "SkOTTable_EBLC.h"
+#include "SkOTTableTypes.h"
+
+#pragma pack(push, 1)
+
+struct SkOTTableEmbeddedBitmapScaling {
+    static const SK_OT_CHAR TAG0 = 'E';
+    static const SK_OT_CHAR TAG1 = 'S';
+    static const SK_OT_CHAR TAG2 = 'B';
+    static const SK_OT_CHAR TAG3 = 'C';
+    static const SK_OT_ULONG TAG = SkOTTableTAG<SkOTTableEmbeddedBitmapScaling>::value;
+
+    SK_OT_Fixed version;
+    static const SK_OT_Fixed version_initial = SkTEndian_SwapBE32(0x00020000);
+
+    SK_OT_ULONG numSizes;
+
+    struct BitmapScaleTable {
+        SkOTTableEmbeddedBitmapLocation::SbitLineMetrics hori;
+        SkOTTableEmbeddedBitmapLocation::SbitLineMetrics vert;
+        SK_OT_BYTE ppemX; //target horizontal pixels per EM
+        SK_OT_BYTE ppemY; //target vertical pixels per EM
+        SK_OT_BYTE substitutePpemX; //use bitmaps of this size
+        SK_OT_BYTE substitutePpemY; //use bitmaps of this size
+    }; //bitmapScaleTable[numSizes];
+};
+
+#pragma pack(pop)
+
+#endif