4.2 Font-File Structure

Font information is found at the beginning of both raster and vector font files. The FONTINFO structure has the following form:

struct FONTINFO {
        WORD  dfVersion;
        DWORD dfSize;
        char  dfCopyright[60];
        WORD  dfType;
        WORD  dfPoints;
        WORD  dfVertRes;
        WORD  dfHorizRes;
        WORD  dfAscent;
        WORD  dfInternalLeading;
        WORD  dfExternalLeading;
        BYTE  dfItalic;
        BYTE  dfUnderline;
        BYTE  dfStrikeOut;
        WORD  dfWeight;
        BYTE  dfCharSet;
        WORD  dfPixWidth;
        WORD  dfPixHeight;
        BYTE  dfPitchAndFamily;
        WORD  dfAvgWidth;
        WORD  dfMaxWidth;
        BYTE  dfFirstChar;
        BYTE  dfLastChar;
        BYTE  dfDefaultChar;
        BYTE  dfBreakChar;
        WORD  dfWidthBytes;
        DWORD dfDevice;
        DWORD dfFace;
        DWORD dfBitsPointer;
        DWORD dfBitsOffset;
        BYTE  dfReserved;
        DWORD dfFlags;
        WORD  dfAspace;
        WORD  dfBspace;
        WORD  dfCspace;
        WORD  dfColorPointer;
        DWORD dfReserved1;
        WORD  dfCharTable[];
};

Following are the members of the FONTINFO structure:

dfVersion

Specifies the version (0x0200 or 0x0300) of the file.

dfSize

Specifies the total size of the file, in bytes.

dfCopyright

Specifies copyright information.

dfType

Specifies the type of font file. This information is organized as follows:

Byte Description

Low-order Exclusively for GDI use. If the low-order bit of the word is zero, it is a bitmap (raster) font file. If the low-order bit is 1, it is a vector font file. The second bit is reserved and must be zero. If no bits follow in the file and the bits are located in memory at a fixed address specified by the dfBitsOffset member, the third bit is set to 1. Otherwise, the bit is set to zero. If the font is realized by a device, the high-order bit of the low-order byte is set. The remaining bits in the low-order byte are then reserved and set to zero.
High-order Reserved for device use and is always set to zero for standard fonts realized by GDI. Physical fonts that set the high-order bit of the low-order byte may use this byte to describe themselves. GDI never inspects the high-order byte.

dfPoints

Specifies the nominal point size (that is, the number identifying the point size) at which this character set looks best.

dfVertRes

Specifies the nominal vertical resolution (that is, the number identifying the vertical resolution), in dots per inch, at which this character set was digitized.

dfHorizRes

Specifies the nominal horizontal resolution (that is, the number identifying the horizontal resolution), in dots per inch, at which this character set was digitized.

dfAscent

Specifies the distance from the top of a character-definition cell to the base line of the typographical font. The dfAscent member is useful for aligning the base lines of fonts with different heights.

dfInternalLeading

Specifies the amount of leading inside the bounds set by the dfPixHeight member. Accent marks can occur in this area. The designer can set the value to zero.

dfExternalLeading

Specifies the amount of extra leading that the designer requests the application to add between rows. Since this area is outside the font proper, it contains no marks and is not altered by text-output calls in either opaque or transparent mode. The designer can set the value to zero.

dfItalic

Specifies whether the character-definition data represents an italic font. If the flag is set, the low-order bit is 1. All other bits are zero.

dfUnderline

Specifies whether the character-definition data represents an underlined font. If the flag is set, the low-order bit is 1. All other bits are zero.

dfStrikeOut

Specifies whether the character-definition data represents a strikeout font. If the flag is set, the low-order bit is 1. All other bits are zero.

dfWeight

Specifies the weight of the characters in the character-definition data, on a scale of 1 through 1000. A dfWeight value of 400 specifies a regular weight.

dfCharSet

Specifies the character set defined by this font.

dfPixWidth

Specifies the width of the grid on which a vector font was digitized. For raster fonts, if the dfPixWidth member is nonzero, it represents the width for all the characters in the bitmap. If the member is zero, the font has variable-width characters whose widths are specified in the array for the dfCharTable member.

dfPixHeight

Specifies the height of the character bitmap for raster fonts or the height of the grid on which a vector font was digitized.

dfPitchAndFamily

Specifies the pitch and font family. If the font is variable pitch, the low bit is set. The four high bits give the family name of the font. Font families describe the general look of a font. They identify fonts when the exact name is not available. The font families are described as follows:

Family Description

FF_DONTCARE Unknown.
FF_ROMAN Proportionally spaced fonts with serifs.
FF_SWISS Proportionally spaced fonts without serifs.
FF_MODERN Fixed-pitch fonts.
FF_SCRIPT Cursive or script fonts. (Both are designed to look similar to handwriting. Script fonts have joined letters; cursive fonts do not.)
FF_DECORATIVE Novelty fonts.

dfAvgWidth

Specifies the width of characters in the font. For fixed-pitch fonts, this value is the same as the value for the dfPixWidth member. For variable-pitch fonts, it is the width of the character “X”.

dfMaxWidth

Specifies the maximum pixel width of any character in the font. For fixed-pitch fonts, this value is the same as the value of the dfPixWidth member.

dfFirstChar

Specifies the first character code defined by the font. Character definitions are stored only for the characters actually present in the font. Use this member, therefore, when calculating indexes for either the dfBits or dfCharOffset member.

dfLastChar

Specifies the last character code defined by the font. All characters with codes between the values for the dfFirstChar and dfLastChar members must be present in the character definitions for the font.

dfDefaultChar

Specifies the character to substitute whenever a string contains a character that is out of range. The character is given relative to the dfFirstChar member so that the dfDefaultChar member is the actual value of the character less the value of the dfFirstChar member. The dfDefaultChar member indicates a special character that is not a space.

dfBreakChar

Specifies the character that defines word breaks for word wrapping and word-spacing justification. The character is given relative to the dfFirstChar member so that the dfBreakChar member is the actual value of the character less that of the dfFirstChar member. The dfBreakChar member is normally 32 minus the value of the dfFirstChar member (the ASCII space character).

dfWidthBytes

Specifies the number of bytes in each row of the bitmap. This value is always even so that the rows start on word boundaries. For vector fonts, this member has no meaning.

dfDevice

Specifies the offset in the file to the string giving the device name. For a generic font, this value is zero.

dfFace

Specifies the offset in the file to the null-terminated string that names the face.

dfBitsPointer

Specifies the absolute machine address of the bitmap. This is set by GDI at load time. The value of the dfBitsPointer member is guaranteed to be even.

dfBitsOffset

Specifies the offset in the file to the beginning of the bitmap information. If the third bit in the dfType member is set, the dfBitsOffset member is an absolute address of the bitmap (probably in read-only memory).

For raster fonts, the dfBitsOffset member points to a sequence of bytes that make up the bitmap of the font. The height of the bitmap is the height of the font, and its width is the sum of the widths of the characters in the font, rounded up to the next word boundary.

For vector fonts, the dfBitsOffset member points to a string of bytes or words (depending on the size of the grid on which the font was digitized) that specify the strokes for each character of the font. The value of the dfBitsOffset member must be even.

dfReserved

Not used.

dfFlags

Specifies the bit flags that define the format of the glyph bitmap, as follows:

Pitch value Address

DFF_FIXED 0x0001
DFF_PROPORTIONAL 0x0002
DFF_ABCFIXED 0x0004
DFF_ABCPROPORTIONAL 0x0008
DFF_1COLOR 0x0010
DFF_16COLOR 0x0020
DFF_256COLOR 0x0040
DFF_RGBCOLOR 0x0080

dfAspace

Specifies the global A space, if any. The value of the dfAspace member is the distance from the current position to the left edge of the bitmap.

dfBspace

Specifies the global B space, if any. The value of the dfBspace member is the width of the character.

dfCspace

Specifies the global C space, if any. The value of the dfCspace member is the distance from the right edge of the bitmap to the new current position. The increment of a character is the sum of the A, B, and C spaces. These spaces apply to all glyphs, including DFF_ABCFIXED.

dfColorPointer

Specifies the offset to the color table for color fonts, if any. The format of the bits is like a device-independent bitmap (DIB), but without the header. (That is, the characters are not split into disjoint bytes; instead, they are left intact.) If no color table is needed, this entry is NULL.

dfReserved1

Not used.

dfCharTable

Specifies an array of entries for raster, fixed-pitch vector, and proportionally spaced vector fonts, as follows:

Font type Description

Raster Each entry in the array consists of two 2-byte words for Windows 2.x and three 2-byte words for Windows 3.0 and later. The first word of each entry is the character width. The second word of each entry is the byte offset from the beginning of the FONTINFO structure to the character bitmap. For Windows 3.0 and later, the second and third words are used for the offset.
Fixed-pitch vector Each 2-byte entry in the array specifies the offset from the start of the bitmap to the beginning of the string of stroke specification units for the character. The number of bytes or words to be used for a particular character is calculated by subtracting its entry from the next one, so that there is a sentinel at the end of the array of values.
Proportionally-spaced vector Each 4-byte entry in the array is divided into two 2-byte fields. The first field gives the starting offset from the start of the bitmap of the character strokes. The second field gives the pixel width of the character.

One extra entry at the end of the character table describes an absolute-space character, which is guaranteed to be blank. This character is not part of the normal character set.

The number of entries in the table is calculated as follows: (dfLastChardfFirstChar) + 2. This number includes a “spare,” the sentinel offset.

For more information on the dfCharTable member, see Section 4.3, “Version-Specific Glyph Tables.”

facename

Specifies an ASCII character string that constitutes the name of the font face. The size of this member is the length of the string plus a null terminating character.

devicename

Specifies an ASCII character string that constitutes the name of the device if this font file is for a specific one. The size of this member is the length of the string plus a null terminating character.

bitmaps

Specifies character bitmap definitions. Unlike the old font format, each character is stored as a contiguous set of bytes.

The first byte contains the first 8 bits of the first scan line (that is, the top line of the character). The second byte contains the first 8 bits of the second scan line. This continues until the first “column” is completely defined. The subsequent byte contains the next 8 bits of the first scan line, padded with zeros on the right if necessary (and so on, down through the second “column”). If the glyph is quite narrow, each scan line is covered by one byte, with bits set to zero as necessary for padding. If the glyph is very wide, a third or even fourth set of bytes can be present.

Character bitmaps must be stored contiguously and arranged in ascending order. The bytes for a 12-pixel by 14-pixel “A” character, for example, are given in two sets, because the character is less than 17 pixels wide:

00 06 09 10 20 20 20 3F 20 20 20 00 00 00
00 00 00 80 40 40 40 C0 40 40 40 00 00 00

Note that in the second set of bytes, the second digit of the byte is always zero. The zeros correspond to the thirteenth through sixteenth pixels on the right side of the character, which are not used by this character bitmap.