OpenType のフォーマット仕様
OpenType フォントの仕様は、Microsoft のページに載っています (英語)。
OpenType specification
構造としては、TrueType と同じ sfnt 形式に沿った形となっています。
OpenType specification
構造としては、TrueType と同じ sfnt 形式に沿った形となっています。
データタイプ
※ OpenType ファイルのバイト順は、ビッグエンディアンです。
uint8 | 符号なし8bit |
---|---|
int8 | 符号あり8bit |
uint16 | 符号なし16bit |
int16 | 符号あり16bit |
uint24 | 符号なし24bit |
uint32 | 符号なし32bit |
int32 | 符号あり32bit |
Fixed | 32bit 符号あり、固定小数点数 (16:16) |
FWORD | int16 フォントデザイン単位 |
UFWORD | uint16 フォントデザイン単位 |
F2DOT14 | 16bit 符号あり、固定小数点数 (2:14) |
LONGDATETIME | 符号あり64bit。 1904年1月1日の AM 0:00 以降の秒数で表される日付 |
Tag | 1byte文字 (0x20-0x7E) x 4 = 32bit。識別子 |
Offset16 | uint16。オフセット位置 |
Offset32 | uint32。オフセット位置 |
ヘッダと全体の構造
OpenType/TrueType ファイルの全体的な構造は、以下のようになっています。
まずは、先頭の 4byte で、オフセットテーブルか TTC ヘッダかを判別し、フォントコレクションか単一フォントかを判別します。
「'ttcf' (0x74746366)」の場合はフォントコレクションで、それ以外は単一フォントです。
▼ 単一フォント (OTF/TTF) の場合 ----------------------------------- [オフセットテーブル] (一つのみ) [複数のテーブルデータ] ▼ フォントコレクション (OTC/TTC) の場合 ------------------------------------------- [TTC ヘッダテーブル] (先頭に一つのみ) [オフセットテーブル] x フォントの数 [複数のテーブルデータ] (各フォントで共通するテーブルもあり)
まずは、先頭の 4byte で、オフセットテーブルか TTC ヘッダかを判別し、フォントコレクションか単一フォントかを判別します。
「'ttcf' (0x74746366)」の場合はフォントコレクションで、それ以外は単一フォントです。
TTC ヘッダ
フォントコレクションファイルの先頭にあるヘッダです。
DSIG テーブルでは、デジタル署名を設定することができます。
これにより、そのフォントが署名者本人が作成したものであることを証明できるため、改ざんを防げます。
Tag ttcTag | 'ttcf' (0x74746366) |
---|---|
uint16 majorVersion | メジャーバージョン。1 or 2 |
uint16 minorVersion | マイナーバージョン。0 |
uint32 numFonts | ファイル内に含まれるフォントの数 |
Offset32 tableDirectoryOffsets[numFonts] | 各フォントのオフセットテーブルへのオフセット位置 (ファイル先頭を 0 とする) |
ver 2.0 の場合、以下が続く | |
uint32 dsigTag | DSIG テーブル (デジタル署名) が存在することを示すタグ = 'DSIG' (0x44534947)。 署名がない場合は 0。 |
uint32 dsigLength | DSIG テーブルの長さ |
uint32 dsigOffset | DSIG テーブルへのオフセット位置 (ファイル先頭を 0 とする) |
DSIG テーブルでは、デジタル署名を設定することができます。
これにより、そのフォントが署名者本人が作成したものであることを証明できるため、改ざんを防げます。
オフセットテーブル
各フォントの先頭にあるヘッダです。
「searchRange, entrySelector, rangeShift」 の値は、テーブル検索用のパラメータなので、使わなくても問題ありません。
uint32 version | バージョン。 PostScript アウトラインを含む場合は、「0x4F54544F ('OTTO')」。 TrueType アウトラインの場合は、「0x00010000」。 |
---|---|
uint16 numTables | テーブルの数 |
uint16 searchRange | numTables 以下の最大の2の累乗値 x 16 の値。 [例] numTables = 10 なら、10 以下の2の累乗の最大は 8 なので、8 x 16 = 128 |
uint16 entrySelector | numTables 以下の最大の2の累乗値を Log2 した値 |
uint16 rangeShift | numTables x 16 - searchRange |
TableRecord [numTables] | TableRecord データの配列 |
「searchRange, entrySelector, rangeShift」 の値は、テーブル検索用のパラメータなので、使わなくても問題ありません。
TableRecord
Tag tableTag | テーブル識別子 ('cmap' など) |
---|---|
uint32 checksum | チェックサムの数値 |
Offset32 offset | テーブルデータへのオフセット位置 (ファイル先頭を 0 とする)。 フォントコレクションの場合も、ファイル先頭を 0 とした位置。 |
uint32 length | テーブルデータの長さ |
- テーブルデータは 4byte 境界であること。
(サイズが 4 で割り切れない長さの場合は、4byte 単位になるように 0 で埋める)
- テーブルデータの長さには、境界余白分の長さは含まれない。
(データの長さが 10 で、4byte 単位に合わせたサイズが 12 の場合、「10」を長さとして記録する) - テーブルレコードは、識別子の数値の昇順で並べられている。
テーブルデータ
フォントのデータは、種類ごとに各テーブルに分けられています。
フォントに必須となるテーブルと、必要に応じて格納するテーブルがあります。
例えば、文字コードからグリフインデックスへの変換に使うのが 'cmap' テーブルであり、これは必須となるデータです。
フォントに必須となるテーブルと、必要に応じて格納するテーブルがあります。
例えば、文字コードからグリフインデックスへの変換に使うのが 'cmap' テーブルであり、これは必須となるデータです。
テーブル識別子タグ
必須テーブル | |
cmap | 文字コードからグリフIDへの変換 |
---|---|
head | 基本的な情報 |
hhea | 水平レイアウトの情報 |
hmtx | 水平グリフの送り幅などの情報 |
maxp | 色々な最大値の定義 |
name | フォント名などの文字列 |
OS/2 | フォントの情報 |
post | PostScript 情報 |
TrueType アウトライン | |
'cvt ' | グリフの制御データ (option) |
fpgm | Font program (option) |
glyf | グリフデータ |
loca | 各グリフのオフセット位置 |
prep | CVT Program (option) |
gasp | Grid-fitting/Scan-conversion (option) |
CFF アウトライン | |
'CFF ' | Compact Font Format 1.0 |
CFF2 | Compact Font Format 2.0 |
VORG | 縦書き時の各グリフごとのY原点 (option) |
SVG アウトライン | |
'SVG ' | SVG |
ビットマップグリフ | |
EBDT | 埋め込みビットマップ データ |
EBLC | 埋め込みビットマップ location data |
EBSC | 埋め込みビットマップ scaling data |
CBDT | カラービットマップ データ |
CBLC | カラービットマップ location data |
sbix | PNG/JPEG/TIFF などの形式のビットマップデータ |
OpenType 拡張 | |
BASE | 各言語ごとのベースライン情報 |
GDEF | 個々のグリフに関する情報。 タイプや合字キャレットなど。 |
GPOS | グリフの位置や幅の調整 |
GSUB | グリフの置き換え |
JSTF | 行揃え |
MATH | 数式レイアウト情報 |
OpenType 可変フォント | |
avar | Axis variations |
cvar | CVT variations (TrueType アウトラインのみ) |
fvar | Font variations |
gvar | Glyph variations (TrueType アウトラインのみ) |
HVAR | 水平レイアウト |
MVAR | Metrics variations |
STAT | スタイル属性。 非バリエーションフォントでもオプションとして使われる。 |
VVAR | 垂直レイアウト |
カラーフォント | |
COLR | カラーテーブル |
CPAL | カラーパレットテーブル |
CBDT | カラービットマップ データ |
CBLC | カラービットマップ location data |
ほか | |
DSIG | デジタル署名 |
hdmx | 特定のピクセルサイズ時の各グリフの水平レイアウト幅 |
kern | カーニング |
LTSH | Linear threshold data |
MERG | アンチエイリアス処理時、各グリフを個別に実行するか、特定のグリフペアを一緒に処理するかの指定 |
meta | メタデータ |
PCLT | PCL 5 データ |
VDMX | Vertical device metrics |
vhea | 垂直グリフのレイアウト情報 |
vmtx | 縦書きのメトリクス情報 |