hmtx - Horizontal Metrics (OpenType 1.7)
The type longHorMetric is defined as an array where each element has two parts: the advance width, which is of type USHORT, and the left side bearing, which is of type SHORT. These fields are in font design units.
typedef struct _longHorMetric { USHORT advanceWidth; SHORT lsb; } longHorMetric;
Field | Type | Description |
---|---|---|
hMetrics | longHorMetric [numberOfHMetrics] |
Paired advance width and left side bearing values for each glyph. The value numOfHMetrics comes from the 'hhea' table. If the font is monospaced, only one entry need be in the array, but that entry is required. The last entry applies to all subsequent glyphs. |
leftSideBearing | SHORT[ ] | Here the advanceWidth is assumed to be the same as the advanceWidth for the last entry above. The number of entries in this array is derived from numGlyphs (from 'maxp' table) minus numberOfHMetrics. This generally is used with a run of monospaced glyphs (e.g., Kanji fonts or Courier fonts). Only one run is allowed and it must be at the end. This allows a monospaced font to vary the left side bearing values for each glyph. |
A font rendering engine must use the advanceWidths in the hmtx table for the advances of a CFF OFF font, even though the CFF table specifies its own glyph widths. Note that fonts in a Font Collection which share a CFF table may specify different advanceWidths in their hmtx table for a particular glyph index.
For any glyph, xmax and xmin are given in 'glyf' table, lsb and aw are given in 'hmtx' table. rsb is calculated as follows:
rsb = aw - (lsb + xmax - xmin)
If pp1 and pp2 are phantom points used to control lsb and rsb, their initial position in x is calculated as follows:
pp1 = xmin - lsb pp2 = pp1 + aw
OpenType specification