OpenType ファイル構造

OpenType のフォーマット仕様
OpenType フォントの仕様は、Microsoft のページに載っています (英語)。

OpenType specification

構造としては、TrueType と同じ sfnt 形式に沿った形となっています。
データタイプ
※ OpenType ファイルのバイト順は、ビッグエンディアンです。

uint8符号なし8bit
int8符号あり8bit
uint16符号なし16bit
int16符号あり16bit
uint24符号なし24bit
uint32符号なし32bit
int32符号あり32bit
Fixed32bit 符号あり、固定小数点数 (16:16)
FWORDint16 フォントデザイン単位
UFWORDuint16 フォントデザイン単位
F2DOT1416bit 符号あり、固定小数点数 (2:14)
LONGDATETIME符号あり64bit。
1904年1月1日の AM 0:00 以降の秒数で表される日付
Tag1byte文字 (0x20-0x7E) x 4 = 32bit。識別子
Offset16uint16。オフセット位置
Offset32uint32。オフセット位置
ヘッダと全体の構造
OpenType/TrueType ファイルの全体的な構造は、以下のようになっています。

▼ 単一フォント (OTF/TTF) の場合
-----------------------------------

[オフセットテーブル] (一つのみ)
[複数のテーブルデータ]

▼ フォントコレクション (OTC/TTC) の場合
-------------------------------------------

[TTC ヘッダテーブル] (先頭に一つのみ)
[オフセットテーブル] x フォントの数
[複数のテーブルデータ] (各フォントで共通するテーブルもあり)

まずは、先頭の 4byte で、オフセットテーブルか TTC ヘッダかを判別し、フォントコレクションか単一フォントかを判別します。
'ttcf' (0x74746366)」の場合はフォントコレクションで、それ以外は単一フォントです。
TTC ヘッダ
フォントコレクションファイルの先頭にあるヘッダです。

Tag'ttcf' (0x74746366)
uint16メジャーバージョン。1 or 2
uint16マイナーバージョン。0
uint32 numファイル内に含まれるフォントの数
Offset32 [num]各フォントのオフセットテーブルへのオフセット位置 (ファイル先頭を 0 とする)
ver 2.0 の場合、以下が続く
uint32DSIG テーブル (デジタル署名) が存在することを示すタグ = 'DSIG' (0x44534947)。
署名がない場合は 0。
uint32DSIG テーブルの長さ
uint32DSIG テーブルへのオフセット位置 (ファイル先頭を 0 とする)

DSIG テーブルでは、デジタル署名を設定することができます。
これにより、そのフォントが署名者本人が作成したものであることを証明できるため、改ざんを防げます。
オフセットテーブル
各フォントの先頭にあるヘッダです。

uint32 versionバージョン。
PostScript アウトラインを含む場合は、「0x4F54544F ('OTTO')」。
TrueType アウトラインの場合は、「0x00010000」。
uint16 numTablesテーブルの数
uint16 searchRangenumTables 以下の最大の2の累乗値 x 16 の値。
[例] numTables = 10 なら、2の累乗の最大は 8 なので、8 x 16 = 128
uint16 entrySelectorLog2(2の最大累乗 <= numTables)
uint16 rangeShiftnumTables x 16 - searchRange
TableRecord [numTables]TableRecord データの配列

「searchRange, entrySelector, rangeShift」 の値は、テーブル検索用のパラメータなので、使わなくても問題ありません。

TableRecord
Tagテーブル識別子 ('cmap' など)
uint32チェックサムの数値
Offset32テーブルデータへのオフセット位置 (ファイル先頭を 0 とする)。
フォントコレクションの場合も、ファイル先頭を 0 とした位置。
uint32テーブルデータの長さ

  • テーブルデータは 4byte 境界であること。
    (サイズが 4 で割り切れない長さの場合は、4byte 単位になるように 0 で埋める)
  • テーブルデータの長さには、境界余白分の長さは含まれない。
    (データの長さが 10 で、4byte 単位に合わせたサイズが 12 の場合、「10」を長さとして記録する)
  • テーブルレコードは、識別子の数値の昇順で並べられている。
テーブルデータ
フォントのデータは、種類ごとに各テーブルに分けられています。
フォントに必須となるテーブルと、必要に応じて格納するテーブルがあります。

例えば、文字コードからグリフインデックスへの変換に使うのが 'cmap' テーブルであり、これは必須となるデータです。
テーブル識別子タグ
必須テーブル
cmap文字コードからグリフIDへの変換
head基本的な情報
hhea水平レイアウトの情報
hmtx水平グリフの送り幅などの情報
maxp色々な最大値の定義
nameフォント名など
OS/2OS/2 と Windows の情報
postPostScript 情報
TrueType アウトライン
'cvt 'グリフの制御データ (option)
fpgmFont program (option)
glyfグリフデータ
loca各グリフのオフセット位置
prepCVT Program (option)
gaspGrid-fitting/Scan-conversion (option)
CFF アウトライン
'CFF 'Compact Font Format 1.0
CFF2Compact Font Format 2.0
VORG縦書き時の各グリフごとのY原点 (option)
SVG アウトライン
'SVG 'SVG
ビットマップグリフ
EBDT埋め込みビットマップ データ
EBLC埋め込みビットマップ location data
EBSC埋め込みビットマップ scaling data
CBDTカラービットマップ データ
CBLCカラービットマップ location data
sbixPNG/JPEG/TIFF などの形式のビットマップデータ
OpenType 拡張
BASE各言語ごとのベースライン情報
GDEF個々のグリフに関する情報。
タイプ、合字キャレットなど。
GPOSグリフ配置。濁点の配置や文字間隔の調整など。
GSUBグリフ置換。縦書き変換や合字など。
JSTF行揃え
MATH数式レイアウト情報
OpenType バリエーション
avarAxis variations
cvarCVT variations (TrueType アウトラインのみ)
fvarFont variations
gvarGlyph variations (TrueType アウトラインのみ)
HVAR水平レイアウト
MVARMetrics variations
STATスタイル属性。
非バリエーションフォントでもオプションとして使われる。
VVAR垂直レイアウト
カラーフォント
COLRカラーテーブル
CPALカラーパレットテーブル
CBDTカラービットマップ データ
CBLCカラービットマップ location data
ほか
DSIGデジタル署名
hdmx特定のピクセルサイズ時の各グリフの水平レイアウト幅
kernカーニング
LTSHLinear threshold data
MERGアンチエイリアス処理時、各グリフを個別に実行するか、特定のグリフペアを一緒に処理するかの指定
metaメタデータ
PCLTPCL 5 データ
VDMXVertical device metrics
vhea垂直レイアウトの情報
vmtx垂直グリフの情報