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: (dfLastChar – dfFirstChar) + 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.