Which tables a font file contains
Last updated 2026-11-02
On this page
A .ttf or .otf is not a blob of drawings. It is a directory plus a stack of tables: the header says which tables exist, where each one starts and how long it is, and then they follow.
This page is the entrance. Each key table has its own article.
Why tables
OpenType inherited the structure from TrueType. The big win is that tables are optional: a font can have fvar (variable axes) or none at all, and a program reads only the tables it understands, skipping the rest by length.
That is why "adding a capability" usually means "adding a table" rather than "changing the format" — and why one file can still open in software from the 1990s and in today's browser.
The seven that matter most
| Table | What it holds | Expanded in |
|---|---|---|
head |
Global settings: unitsPerEm (how fine the font's grid is), bounding box, macStyle |
head / hhea / post |
name |
Every name: family, subfamily, PostScript name, copyright and licence | The name table |
OS/2 |
Weight, width, fsSelection, typographic ascender/descender, x-height, cap height |
The OS/2 table |
hhea |
The horizontal baseline trio: ascender / descender / lineGap | head / hhea / post |
cmap |
Code point → glyph index. "Does this font have this character" is answered here | The cmap table |
maxp |
How many glyphs there are | See "The rest" below |
post |
Italic angle, underline position and thickness, PostScript name | head / hhea / post |
Those seven answer most of what the inspector shows: what the font is called, how heavy it is, how far it reaches up and down, and which characters it knows.
The rest
| Table | What it holds |
|---|---|
glyf / CFF / CFF2 |
The actual outlines (TrueType uses glyf, OpenType/CFF uses CFF) |
GSUB / GPOS / GDEF |
Layout: ligatures, small caps, kerning, super/subscripts |
fvar / gvar / avar / STAT |
Variable fonts: axes, per-axis deltas, named instances |
cvt / fpgm / prep |
Hinting instructions |
DSIG |
A digital signature — in practice almost never used |
vhea / vmtx |
Vertical metrics for vertical writing |
Having a table is not the same as the table doing something: GSUB can describe ligatures that you only see if the renderer looks them up and the text happens to contain the right sequence.
Where this site uses them
| Screen | Tables read |
|---|---|
| Inspector → basics | name (family and subfamily), OS/2 (weight, italic bit), maxp (glyph count) |
| Metrics drawing | head (unitsPerEm), hhea and OS/2 (baselines and extents), post (italic angle, underline) |
| Unicode coverage | cmap only |
| Specimen images | The outline tables, while avoiding GSUB substitutions |
Who writes the tables
Font editors (FontForge, RoboFont, Glyphs) fill them in and pack them on export. So the same design exported as .ttf and as .otf has completely different outline tables — while the other tables may be identical. Format and design are separate things.
Further reading
- Microsoft Typography — the "Font Tables" section of the OpenType specification
- Apple TrueType Reference Manual — the original definitions of
head,hhea,post