FontForge が使用する TrueType/OpenType への非標準の拡張

非標準の機能タグ

内部的に使用

TeX 用

非標準のテーブル

PfEd’— FontForge の拡張テーブル

(歴史的事情により、‘PfEd’という名前になっています)

このテーブルは、バージョン番号とサブテーブルの個数を含むヘッダで始まります。
uint32 version 現在は 0x00010000
uint32 count

この後ろにテーブルの中身が続きます。以下のデータ構造 (つまり、各テーブルのタグとオフセット) が count 回だけ繰り返されます。
uint32 tag
uint32 offset ‘PfEd’テーブルの先頭から数える

サブテーブルのフォーマットはそのサブテーブルのタグによって異なります。現在サポートされているのは、以下の 3 種類のタグです。

colr’— 各グリフの色のサブテーブル

このサブテーブルのヘッダはバージョン番号と範囲の個数で始まります。
uint16 version 0
uint16 count 範囲の個数

この後ろに、以下の構造体が <count> 個だけ置かれます。
uint16 最初のグリフインデックス
uint16 最後のグリフインデックス
uint32 color 24 ビット RGB 値として表現される

cmnt’— グリフコメント用のサブテーブル

範囲の個数

この後ろに、以下の構造体が <count> 個だけ置かれます。
uint16 最初のグリフインデックス
uint16 最後のグリフインデックス
uint32 offset このサブテーブルの先頭からの値

offset は、バイトオフセットの配列を指し、その配列には (<end>-<start>+1+1) 個の要素が含まれます。これにより上記の範囲データ構造は、各グリフごとに 1 個のインデックスを表し、それに加え、最後の文字列の長さを計算できるように末尾に 1 個の要素が置かれています。
uint32 offset テーブルの先頭からの値
...

そしてこれらのオフセットは Unicode (UCS2) 文字列を指しています。文字列は順番に並んでいると見なすため、各文字列の長さは、その文字列のオフセットを次の文字列のオフセットから引き算することによって得られます。

fcmt’— フォントコメント用サブテーブル

このサブテーブルのヘッダはバージョン番号と範囲の個数で始まります。
uint16 version 0
uint16 length 文字列中の文字数

そしてこの後に <length> 個の Unicode (UCS2) 文字が続きます。現在はこれらの Unicode 文字は常に ASCII 値のみを含みますが、将来は変更される可能性があります。

TeX ’— TeX メトリックテーブル

このテーブルは、バージョン番号とサブテーブルの個数を含むヘッダで始まります。
uint32 version 現在は 0x00010000
uint32 count

この後ろにテーブルの中身が続きます。以下のデータ構造 (つまり、各テーブルのタグとオフセット) が count 回だけ繰り返されます。
uint32 tag
uint32 offset ‘PfEd’テーブルの先頭から

サブテーブルのフォーマットはサブテーブルのタグによって異なります。現在のところ、以下の 3 種類のタグがサポートされています。

htdp’— グリフ表示色用サブテーブル

このサブテーブルのヘッダはバージョン番号とグリフの個数で始まります。
uint16 version 0
uint16 count グリフの個数

この後ろに、以下の構造体が <count> 個だけ置かれます。
uint16 height em ユニット単位
uint16 depth

これらの値は TFM ファイルの fix_word ではなく em ユニット単位の値で格納しています。なぜなら、sfnt においてより意味があるのは em ユニットであり、スペース消費も少ないからです。

sbsp’— グリフコメント用のサブテーブル (訳註:誤植。「下つき/上つき文字用サブテーブル」)

このテーブルのフォーマットは前述のテーブルと本質的に同じです。サブテーブルのヘッダは、バージョン番号とグリフの個数で始まります。
uint16 version 0
uint16 count グリフの個数

この後ろに、以下の構造体が <count> 個だけ置かれます。
uint16 下つき文字のオフセット em ユニット単位の値
uint16 上つき文字のオフセット

これらの値は TFM ファイルの fix_word ではなく em ユニット単位の値で格納しています。なぜなら、sfnt においてより意味があるのは em ユニットであり、スペース消費も少ないからです。

ftpm’— フォントパラメータ (フォントディメンジョン) 用サブテーブル

このサブテーブルのヘッダはバージョン番号とパラメータの個数で始まります:
uint16 version 0
uint16 count フォントに含まれるパラメータの個数

そしてこの後に続くのは、以下の構造体の <count> 要素の繰り返しです:
uint32 タグ パラメータ名
int32

これらの値は TFM ファイルの fix_word で格納されており、em ユニット単位の値ではありません。なぜなら、この値の意味は仕様で規定されておらず、(少なくとも) Slantパラメータは em ユニットに変換できないからです。

定義済みの 4 文字のパラメータタグは以下のとおりです。
タグ 意味 TFM ファイルにおける伝統的なフォントパラメータ番号 (フォントディメンション番号)
Slnt スラント 1
Spac スペース 2
Stre 伸長度 3
Shnk 縮小度 4
XHgt x ハイト 5
Quad クワタ幅 6
ExSp 追加スペース 7 (テキストフォントの場合)
MtSp Math Space 7 (数学フォント・拡張数学フォントの場合)
Num1 ディスプレイスタイルまたは圧縮ディスプレイスタイルにおける分子の持ち上げ量 8 (数学フォントの場合)
Num2 (圧縮)ディスプレイスタイル以外での \atop または \atopwithdelims による分子の持ち上げ量 10
Dnm1 ディスプレイスタイルまたは圧縮ディスプレイスタイルにおける分母の引き下げ量 11
Dnm2 (圧縮)ディスプレイスタイル以外での分母の引き下げ量 12
Sup1 ディスプレイスタイルにおける、文字につく上つき文字の持ち上げ量の最小値 13
Sup2 テキスト・上(下)付き文字・二重上(下)付き文字スタイルにおける、文字につく上つき文字の持ち上げ量の最小値 14
Sup3 圧縮されたスタイルにおける、文字につく上つき文字の持ち上げ量の最小値 15
Sub1 上つき文字が無い場合の、文字につく下つき文字の引き下げ量の最小値 16
Sub2 上つき文字と下つき文字が同時につく場合の、文字につく下つき文字の引き下げ量の最小値 17
SpDp 上つき文字のベースラインより上の部分が、親文字と重なり合う最大量 18
SbDp 下つき文字のベースラインより下の部分が、親文字と重なり合う最大量 19
Dlm1 (圧縮)ディスプレイスタイルにおいて、分数を構成する垂直ボックスを囲む区切り記号の(高さ+深さ)の最小値 20
Dlm2 ディスプレイスタイル以外において、分数を構成する垂直ボックスを囲む区切り記号の(高さ+深さ)の最小値 21
AxHt 軸の高さ (\vcenter による垂直揃え位置の、(高さ+深さ)/2より得られる真の中心からの持ち上げ量) 22
RlTk 罫線のデフォルトの太さ 8 (拡張数学フォントの場合)
BOS1 Big Op Spacing1 9
BOS2 Big Op Spacing2 10
BOS3 Big Op Spacing3 11
BOS4 Big Op Spacing4 12
BOS5 Big Op Spacing5 13

BDF ’ — BDF 属性テーブル

このテーブルはバージョン番号とサイズ違いの個数を含むヘッダから始まります。
uint16 バージョン 現在は 0x0001
uint16 サイズ違いの個数
uint32 文字列テーブルへのオフセット (BDF テーブルの先頭から数えた値)

それに続き、各サイズごとに、それぞれ何個の属性が含まれるかを識別するデータ項目が続きます。
uint16 EM あたりピクセル数
uint16 配列 property-count (属性の個数)

その次に属性の値が置かれます。まず最初のビットマップサイズの属性が property-count[1] 個だけ並び、次に property-count[2] 個の属性が、というように並びます。各属性の形式は以下のとおりです:
uint32 名前 属性名の文字列テーブルにおけるオフセット
uint16 データ型 0 ⇒ 文字列
1 ⇒ アトム
2 ⇒ 整数
3 ⇒ 正整数
真の属性であることを示すために上のどれかの値と 0x10 との or を取った値も許されます。
uint32 文字列とアトムの場合、文字列テーブル内のオフセット値を格納
整数では値をそのまま格納

文字列テーブルは ASCII のバイト列を並べたものです。各文字列は NUL で終端されています。