[1] 表は、 TrueType / OpenType フォントのデータ構造の基本単位の1つです。
[6] OpenType では欄を持った構造に表と記録があり、 これらが OpenType ファイルの主要な構成要素になっています。
[7] 表は一般に offset で参照されるものです。 >>5
[8] 記録は親構造中に順序に従って出現するものです。 >>5
[9] 表から offset で参照される他の表は部分表と呼ばれています。 曖昧でない時は部分表も表と呼ばれています。 文脈なく表というときはたいていはフォントの最上位の構造に相当する表のことを指しています。
[10]
OpenType
における
Offset16
,
Offset24
,
Offset32
は、それぞれ
uint16
,
uint24
,
uint32
で,
部分表への offset (位置の差分) を表しています。
>>5
[11] offset の起算点は欄によって違い、 仕様書の関係するところで一々規定されています。 大抵はその offset が出現した部分表の先頭を 0 と数えています。
[12]
offset 値は 0 とすることができ、
NULL
値と呼ばれています。
>>5
[13]
NULL
値を使えるかどうかは欄によって違い、
仕様書の関係するところで一々規定されています。
>>5
[14]
フォントが不適合な場合は使えないところでも NULL
が使われる場合がありますから、
フォントを解釈する実装はそれを想定しておくべきです。
>>5
そうしなければ参照元の部分表自体が参照されていることになりますから、
処理がおかしくなってしまいます。
[15] フォントファイル中の表の配置位置は決まっていません。 符号無し整数なので起算点より前には置けませんし、 offset 欄のビット数で表せる最大の位置よりも後には置けませんが、 その中間の好きな位置に置けます。 複数の offset 値が同じ位置を参照することもできます。
[16]
例えば複数の lookup が同等の Coverage
を使いたければ、
同じものを2つ配置する必要はなく、
それらより後に1つだけ配置して、どちらにもその先頭を指すような offset
を設定することができます。 offset の値は違うかもしれませんが、
参照元の起算点 + offset が同じ値になります。
[30] 仕様上はどこに置いても良さそうに (置く場所に制限はなさそうに) も読めるのですが、 どうも実装によってはそうでもないことがあるみたいです。 親の表に属する部分表は親の表の範囲に含まれる、 と仕様書を解釈するべきなのでしょうか。よくわかりません。
[31]
例えば Chrome は
cmap
表
format
14
部分表の
nonDefaultUVSOffset
が指す記録がその部分表の
length
までの範囲内になければ構文解析エラーとします。
[17] フォントファイルを解釈する実装は、 バッファー溢れ等、 不正なメモリー操作が発生しないよう注意が必要です。 フォントファイルは壊れているかもしれませんし、 不正なデータかもしれません。
[22] フォントの最上位に当たる表の種別は表タグで識別されます。
[23] TableRecord
の tableTag
は表の識別子たるタグです。 >>20
[26]
OpenType フォントは、
OpenType の表の他、
TrueType 等、他の仕様の表も含められます。
>>20
[24] OpenType の規定では、 同じタグの表はフォント当たり高々1つだけ含められます。 複数ある場合の挙動は未定義で、 実装はどれかを選んでも構いませんし、非妥当として拒絶しても構いません。 >>20
[25] OpenType 以外の表は、 同じタグを複数使っても構いません。 >>20
[27] TrueType は、すべて小文字の表タグを Apple 用に予約しています。 >>20 OpenType で小文字の表タグと大文字の表タグが一見無秩序に混在しているのは、 この規定の影響のようです。
[28] OpenType は表タグを特に制限することなく独自の利用 (カスタムタグ) を認めているものの、 先方互換性のため Microsoft に通知するべきだとしています。 >>20
[29]
大文字と小文字の区別を当の OpenType 仕様書がきっちりしていないのは、
困ったものです。