EBDT — Embedded Bitmap Data Table (OpenType 1.9)
The EBDT table is used to embed monochrome or grayscale bitmap glyph data. It is used together with the EBLC table, which provides embedded bitmap locators, and the EBSC table, which provides embedded bitmap scaling information.
OpenType embedded bitmaps are also called “sbits” (for “scaler bitmaps”). A set of bitmaps for a face at a given size is called a strike.
The EBLC table identifies the sizes and glyph ranges of the sbits, and keeps offsets to glyph bitmap data in indexSubTables. The EBDT table then stores the glyph bitmap data, in a number of different possible formats. Glyph metrics information may be stored in either the EBLC or EBDT table, depending upon the indexSubTable and glyph bitmap data formats. The EBSC table identifies sizes that will be handled by scaling up or scaling down other sbit sizes.
The EBDT table is a super set of Apple’s Apple Advanced Typography (AAT) 'bdat' table.
EBDT Header
The EBDT table begins with a header containing simply the table version number.
Type | Name | Description |
---|---|---|
uint16 | majorVersion | Major version of the EBDT table, = 2. |
uint16 | minorVersion | Minor version of the EBDT table, = 0. |
Note that the first version of the EBDT table is 2.0.
The rest of the EBDT table is a collection of bitmap data. The data can be in a number of possible formats, indicated by information in the EBLC table. Some of the formats contain metric information plus image data, and other formats contain only the image data. Long word alignment is not required for these sub tables; byte alignment is sufficient.
There are also two different formats for glyph metrics: big glyph metrics and small glyph metrics. Big glyph metrics define metrics information for both horizontal and vertical layouts. This is important in fonts (such as Kanji) where both types of layout may be used. Small glyph metrics define metrics information for one layout direction only. Which direction applies, horizontal or vertical, is determined by the flags field in the BitmapSize records within the EBLC table.
BigGlyphMetrics
Type | Name | Description |
---|---|---|
uint8 | height | Number of rows of data. |
uint8 | width | Number of columns of data. |
int8 | horiBearingX | Distance in pixels from the horizontal origin to the left edge of the bitmap. |
int8 | horiBearingY | Distance in pixels from the horizontal origin to the top edge of the bitmap. |
uint8 | horiAdvance | Horizontal advance width in pixels. |
int8 | vertBearingX | Distance in pixels from the vertical origin to the left edge of the bitmap. |
int8 | vertBearingY | Distance in pixels from the vertical origin to the top edge of the bitmap. |
uint8 | vertAdvance | Vertical advance width in pixels. |
SmallGlyphMetrics
Type | Name | Description |
---|---|---|
uint8 | height | Number of rows of data. |
uint8 | width | Number of columns of data. |
int8 | bearingX | Distance in pixels from the horizontal origin to the left edge of the bitmap (for horizontal text); or distance in pixels from the vertical origin to the top edge of the bitmap (for vertical text). |
int8 | bearingY | Distance in pixels from the horizontal origin to the top edge of the bitmap (for horizontal text); or distance in pixels from the vertical origin to the left edge of the bitmap (for vertical text). |
uint8 | advance | Horizontal or vertical advance width in pixels. |
Glyph Bitmap Data
The nine different formats currently defined for glyph bitmap data are listed and described below. Different formats are better for different purposes. Apple 'bdat' tables support only formats 1 through 7.
In all formats, if the bitDepth is greater than 1, all of a pixel’s bits are stored consecutively in memory, and all of a row’s pixels are stored consecutively.
Note: Each of these formats can contain black/white or grayscale bitmaps depending on the setting of the bitDepth field in the EBLC table. For performance reasons, we recommend using a byte-aligned format for embedded bitmaps with bitDepth of 8.
Format 1: small metrics, byte-aligned data
Type | Name | Description |
---|---|---|
SmallGlyphMetrics | smallMetrics | Metrics information for the glyph |
uint8 | imageData[variable] | Byte-aligned bitmap data |
Glyph bitmap format 1 consists of small metrics records (either horizontal or vertical depending on the flags field of the BitmapSize record within the EBLC table) followed by byte aligned bitmap data. The bitmap data begins with the most significant bit of the first byte corresponding to the top-left pixel of the bounding box, proceeding through succeeding bits moving left to right. The data for each row is padded to a byte boundary, so the next row begins with the most significant bit of a new byte. 1 bits correspond to black, and 0 bits to white.
Format 2: small metrics, bit-aligned data
Type | Name | Description |
---|---|---|
SmallGlyphMetrics | smallMetrics | Metrics information for the glyph |
uint8 | imageData[variable] | Bit-aligned bitmap data |
Glyph bitmap format 2 is the same as format 1 except that the bitmap data is bit aligned. This means that the data for a new row will begin with the bit immediately following the last bit of the previous row. The start of each glyph must be byte aligned, so the last row of a glyph may require padding. This format takes a little more time to parse, but saves file space compared to format 1.
Format 3: (obsolete)
Format 4: (not supported) metrics in EBLC, compressed data
Glyph bitmap format 4 is a compressed format used by Apple in some of their East Asian fonts. This format is not supported in OpenType.
Format 5: metrics in EBLC, bit-aligned image data only
Type | Name | Description |
---|---|---|
uint8 | imageData[variable] | Bit-aligned bitmap data |
Glyph bitmap format 5 is similar to format 2 except that no metrics information is included, just the bit aligned data. This format is for use with EBLC indexSubTable format 2 or format 5, which will contain the metrics information for all glyphs. It works well for Kanji fonts.
The rasterizer recalculates sbit metrics for Format 5 bitmap data, allowing Windows to report correct ABC widths, even if the bitmaps have white space on either side of the bitmap image. This allows fonts to store monospaced bitmap glyphs in the efficient Format 5 without breaking Windows GetABCWidths call.
Format 6: big metrics, byte-aligned data
Type | Name | Description |
---|---|---|
BigGlyphMetrics | bigMetrics | Metrics information for the glyph |
uint8 | imageData[variable] | Byte-aligned bitmap data |
Glyph bitmap format 6 is the same as format 1 except that is uses big glyph metrics instead of small.
Format7: big metrics, bit-aligned data
Type | Name | Description |
---|---|---|
BigGlyphMetrics | bigMetrics | Metrics information for the glyph |
uint8 | imageData[variable] | Bit-aligned bitmap data |
Glyph bitmap format 7 is the same as format 2 except that is uses big glyph metrics instead of small.
EbdtComponent Record
The EbdtComponent record is used in glyph bitmap data formats 8 and 9.
Type | Name | Description |
---|---|---|
uint16 | glyphID | Component glyph ID |
int8 | xOffset | Position of component left |
int8 | yOffset | Position of component top |
The EbdtComponent record contains the glyph ID of the component, which can be used to look up the location of component glyph data in the EBLC table, as well as xOffset and yOffset values, which specify where to position the top-left corner of the component in the composite. Nested composites (a composite of composites) are allowed, and the number of nesting levels is determined by implementation stack space.
Format 8: small metrics, component data
Type | Name | Description |
---|---|---|
SmallGlyphMetrics | smallMetrics | Metrics information for the glyph |
uint8 | pad | Pad to 16-bit boundary |
uint16 | numComponents | Number of components |
EbdtComponent | components[numComponents] | Array of EbdtComponent records |
Format 9: big metrics, component data
Type | Name | Description |
---|---|---|
BigGlyphMetrics | bigMetrics | Metrics information for the glyph |
uint16 | numComponents | Number of components |
EbdtComponent | components[numComponents] | Array of EbdtComponent records |
Glyph bitmap formats 8 and 9 are used for composite bitmaps. For accented characters and other composite glyphs it may be more efficient to store a copy of each component separately, and then use a composite description to construct the finished glyph. The composite formats allow for any number of components, and allow the components to be positioned anywhere in the finished glyph. Format 8 uses small metrics, and format 9 uses big metrics.