The 'fmtx' table

Introduction

The Font Metrics Table (tag: 'fmtx') identifies a glyph whose points represent various font-wide metrics: ascent, descent, caret angle, caret offset. If this table is present, these points override their corresponding values in the 'hhea' and 'vhea' tables. Representing these metrics as points rather that values offers several advantages.

  • In Quickdraw Text, glyphs are constrained to not exceed the font's ascent and descent. Because of this, many fonts artificially increase their ascent and descent values in the 'hhea' table to accomodate exceptionally tall or low glyphs. The 'fmtx' is only used in ATSUI, allowing the same font to specify "real" values for ascent and descent without changing the behavior in Quickdraw Text.
  • Since 'fmtx' metrics are represented as points, they can change for different variation settings, allowing the font to change its line spacing and/or caret angle as it changes weight, or optical point size.
  • 'fmtx' metric points can also be instructed, allowing the font to tune its line spacing at small sizes for improved readability.
  • NOTE: The material in this chapter only applies to TrueType fonts.

Font Metrics Table Format

The Font Metrics table format is as follows:

Type
Name
Meaning
fixed32 version Version (set to 0x00020000).
uint32 glyphIndex The glyph whose points represent the metrics.
uint8 horizontalBefore Point number for the horizontal ascent.
uint8 horizontalAfter Point number for the horizontal descent.
uint8 horizontalCaretHead Point number for the horizontal caret head.
uint8 horizontalCaretBase Point number for the horizontal caret base.
uint8 verticalBefore Point number for the vertical ascent.
uint8 verticalAfter Point number for the vertical descent.
uint8 verticalCaretHead Point number for the vertical caret head.
uint8 verticalCaretBase Point number for the vertical caret base.

Line spacing using the 'fmtx' table is computed by measuring the distance from the font's "Before" metric point to the "After" metric point. "Before" is the point that specifies the distance from the baseline (or centerline for vertical) to the previous line's "After." In horizontal text, this corresponds to the font's ascent. "After" is the point that specifies the distance from the baseline (centerline) to the next line's "Before." In horizontal text, this corresponds to the font's descent.

Caret angle using the 'fmtx' table is computed by using the angle between the font's "Caret Head" metric point and the "Caret Base" metric point. "Caret Head" is the point that specifies the angle for the caret relative to the "Caret Base" point. "Caret Base" is the point the specifies the location where the caret should intersect the baseline (centerline). For horizontal text, the y-coordinate of the "Caret Base" must be 0. For vertical text, the x-coordinate of the "Caret Base" must be 0.

If an 'fmtx' table is present, it must specify point numbers for all eight metric points. Even if the font is intended for only horizontal writing, it must identify points for vertical metrics as well.

Typical coordinates for an italic font whose units-per-em is 2048 are shown in the following table:

Name
Coordinates
Horizontal before (0, 1600)
Horizontal after (0, -448)
Horizontal caret head (210, 1600)
Horizontal caret base (-140, 0)
Vertical before (1024, 0)
Vertical after (-1024, 0)
Vertical caret head (1024, 0)
Vertical caret base (0, 0)