The 'bdat'
table
Introduction
The bitmap data table (tag name: 'bdat'
) is a very simple structure; a version number followed by data. The data can be in various formats. Some of the formats contain metric information and other formats contain only the image. Some of the data may be compressed and other data may not. The bitmap location table contains the information to locate and understand how to interpret the data contained in this table. The association of a particular bitmap with a particular glyph and point size is handled by the bitmap location table. The bitmap location table provides information about the availability of bitmap data in this table at requested sizes and indicates whether or not bitmaps are available. It also gives the offset location into this table for the bitmap data for a particular glyph. For mono-spaced glyphs the bitmap location table contains the metric information.
Bitmap Data Table Formats
The overall structure of the bitmap data table is shown in the following figure:
The format of the bitmap data table header is as follows:
Type
|
Name
|
Description
|
---|---|---|
fixed32 | version | Version number of the bitmap data table (0x00020000 for the initial version). |
variable | glyphbitmap[numberBitMaps] | The set of bitmapped glyphs included for this font. Formats are 1, 2, 4, 5, 6, and 7. |
There are six glyph bitmap formats supported by AAT. Some of the formats are designed to handle proportional glyphs, others are more applicable to mono-spaced glyphs. Within a given font, various formats can be used. For example, a kanji font will have the first few hundred glyphs in format 7 (proportional bit) and the next 7000 glyphs in format 5 (monospaced).
The bitmap data format codes are as follows:
Format
|
Name
|
Description
|
---|---|---|
1 | proportionalFormat1 | Small metrics and byte-aligned images. |
2 | proportionalFormat2 | Small metrics and bit-aligned images. |
3 | (not used) | (not used) |
4 | monoCompressedFormat4 | Just compressed images, metrics are in the bitmap location table. |
5 | monoFormat5 | Just bit-aligned images, metrics are in the bitmap location table. |
6 | proportionalByteFormat6 | Big metrics and byte-aligned images. |
7 | proportionalBitFormat7 | Big metrics and bit-aligned images. |
Note that four of these formats handle proportional bitmap data.
- Formats 1 and 2 are the same except for the alignment of the bitmap data. Both have small metrics.
- Format 4 is a modified Huffman encoding scheme, and contains metric information and offsets to binary search trees and glyph data.
- Format 5 is a simple format of bit-aligned bitmaps, padded to a byte boundary. All the metric information is in the format 2 index subtable of the bitmap location table. This format is a real space saver for glyphs that share the same metrics (for example, monospaced Chinese, Japanese or Korean glyphs). It is similar to formats 2 and 7, except that no metric information is included, just the bit-packed bitmaps.
NOTE: The data for a Format 5 table most likely will have some white lines above and below some of the glyphs. In other words, the bitmap will not have a tight bounding box around the black bits of the glyph. This is a small price since most of the glyphs should be tight and the savings of being able to share the metrics makes up for extra white pixels. In cases where it doesn't, this format should not be used.
- Formats 6 and 7 are the same except for the alignment of the bitmap data. Both have big metrics.
Most of the formats have metric information in either bigGlyphMetrics
or smallGlyphMetrics
. The big metrics contain both horizontal and vertical metrics whereas the small metrics only hold metrics for one direction.
Structure of the bigGlyphMetrics
is shown in the following table:
Type
|
Name
|
Description
|
---|---|---|
uint8 | height | Number of rows of data. |
uint8 | width | Number of columns of data. |
sint8 | horiBearingX | Distance in pixels from the horizontal origin to the left edge of the bitmap. |
sint8 | horiBearingY | Distance in pixels from the horizontal origin to the top edge of the bitmap. |
uint8 | horiAdvance | Horizontal advance width in pixels. |
sint8 | vertBearingX | Distance in pixels from the vertical origin to the left edge of the bitmap. |
sint8 | vertBearingY | Distance in pixels from the vertical origin to the top edge of the bitmap. |
uint8 | vertAdvance | Vertical advance width in pixels. |
Structure of the smallGlyphMetrics
is shown in the following table:
Type
|
Name
|
Description
|
---|---|---|
uint8 | height | Number of rows of data. |
uint8 | width | Number of columns of data. |
sint8 | 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). |
sint8 | 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. |
The figures below show the meaning of the metrics. Possible values for the 'g' glyph below could be: horiBearingX
= 2, horiBearingY
= 11; horiAdvance
= 12; vertBearingX
= -3; vertBearingY
= -2; vertAdvance
= 20 (note: although the advance is in the -y direction, it is still unsigned since it is a distance and not a direction; the direction of vertical text is assumed top to bottom); height
= 16; and width
= 9. Remember that we are dealing with integer metrics.
If you use smallGlyphMetrics
, you must set the bit in the bitmapSizeTable.flags
of the bitmap location table to the inform the scaler as to the orientation of the metrics (using bitmapFlags
).
Format 1 glyph bitmap has the following format:
Type
|
Name
|
Description
|
---|---|---|
smallGlyphMetrics | smallMetrics | Metric information for the glyph. |
variable | imageData | Byte-aligned bitmap data. |
Format 2 glyph bitmap has the following format:
Type
|
Name
|
Description
|
---|---|---|
smallGlyphMetrics | smallMetrics | Metric information for the glyph. |
variable | imageData | Bit-aligned bitmap data padded to a byte boundary. |
Format 4 glyph bitmap has the following format:
Type
|
Name
|
Description
|
---|---|---|
uint32 | whiteTreeOffset | Offset to the white tree. |
uint32 | blackTreeOffset | Offset to the black tree. |
uint32 | glyphDataOffset | Offset to the glyph data. |
variable | trees and glyph data | The white tree, black tree, and glyph is found after all of the glyph bitmap 4 data arrays. |
Format 5 glyph bitmap has the following format:
Type
|
Name
|
Description
|
---|---|---|
variable | imageData | Bit-aligned bitmap data padded to byte boundaries. |
Format 6 glyph bitmap has the following format:
Type
|
Name
|
Description
|
---|---|---|
bigGlyphMetrics | bigMetrics | Metric information for the glyph. |
variable | imageData | Byte-aligned bitmap data. |
Format 7 glyph bitmap has the following format:
Type
|
Name
|
Description
|
---|---|---|
bigGlyphMetrics | bigMetrics | Metric information for the glyph. |
variable | imageData | Bit-aligned bitmap data. |
Dependencies
A 'bdat'
table is inextricably connected with the font's 'bloc'
(bitmap location) table. If one is present, the other must be, too, and a change to one will almost inevitably trigger a change in the other.
As a rule, most font editing tools will probably find it more convenient to read and write the two tables simultaneously rather than treat them separately. This, for example, is done by Apple’s ftxdumperfuser tool.