[1] 
[DFN[[RUBYB[[RUBY[表][ひょう][テーブル]]][table]]]]は、
[[TrueType]] / [[OpenType]]
[[フォント]]の[[データ構造]]の基本単位の1つです。

* 仕様書

[REFS[
- 
[2] 
[CITE@ja-jp[Advanced typographic tables - OpenType Layout (OpenType 1.9) - Typography | [[Microsoft]] Docs]], [[PeterCon]], [TIME[2022-08-28T02:24:32.000Z]] <https://docs.microsoft.com/ja-jp/typography/opentype/spec/ttochap1#opentype-layout-tables>
-
[5] 
[CITE@ja-jp[OpenType font file (OpenType 1.9) - Typography | [[Microsoft]] Docs]], [[PeterCon]], [TIME[2022-08-28T12:09:17.000Z]] <https://docs.microsoft.com/ja-jp/typography/opentype/spec/otff#data-types>
-
[20] 
[CITE@ja-jp[OpenType font file (OpenType 1.9) - Typography | [[Microsoft]] Docs]], [[PeterCon]], [TIME[2022-08-29T08:58:59.000Z]] <https://docs.microsoft.com/ja-jp/typography/opentype/spec/otff#tableRecord>
-
[18] 
[CITE@ja-jp[OpenType font file (OpenType 1.9) - Typography | [[Microsoft]] Docs]], [[PeterCon]], [TIME[2022-08-29T08:35:09.000Z]] <https://docs.microsoft.com/ja-jp/typography/opentype/spec/otff#font-tables>
-
[19] 
[CITE@ja-jp[OpenType font file (OpenType 1.9) - Typography | [[Microsoft]] Docs]], [[PeterCon]], [TIME[2022-08-29T08:53:52.000Z]] <https://docs.microsoft.com/ja-jp/typography/opentype/spec/otff#the-font-collection-file-structure>
-
[4] 
[CITE@ja-jp[TSI table specifications - Typography | [[Microsoft]] Docs]], [[robmck-ms]], [TIME[2022-08-28T02:26:40.000Z]] <https://docs.microsoft.com/ja-jp/typography/tools/vtt/tsi-tables>

]REFS]

* 意味

[6] 
[[OpenType]] では[RUBYB[[[欄]]][field]]を持った[[構造][データ構造]]に[[表]]と[[記録]]があり、
これらが [[OpenType]] [[ファイル]]の主要な構成要素になっています。

[7] 
[DFN[[RUBY[表][ひょう][table]]]]は一般に [[offset]] で参照されるものです。
[SRC[>>5]]

[8] 
[DFN[[RUBYB[[RUBY[記][き]][RUBY[録][ろく]]][record]]]]は親構造中に順序に従って出現するものです。
[SRC[>>5]]

[9] 
[[表][OpenType表]]から [[offset]] で参照される他の[[表][OpenType表]]は[DFN[[RUBYB[[RUBY[部][ぶ]][RUBY[分][ぶん]][RUBY[表][ひょう]]][subtable]]]]と呼ばれています。
曖昧でない時は[[部分表]]も[[表]]と呼ばれています。
文脈なく[[表]]というときはたいていは[[フォント]]の最上位の構造に相当する[[表]]のことを指しています。

* offset

[10] 
[[OpenType]]
における
[DFN[[CODE[Offset16]]]],
[DFN[[CODE[Offset24]]]],
[DFN[[CODE[Offset32]]]]
は、それぞれ
[CODE[uint16]],
[CODE[uint24]],
[CODE[uint32]]
で,
[[部分表]]への [[offset]] (位置の差分) を表しています。
[SRC[>>5]]

[11] 
[[offset]] の[[起算点]]は[[欄]]によって違い、
[[仕様書]]の関係するところで一々[[規定]]されています。
大抵はその [[offset]] が出現した[[部分表]]の先頭を [N[0]]
と数えています。

[12] 
[[offset]] 値は [N[0]] とすることができ、
[DFN[[CODE[NULL]]]]
値と呼ばれています。
[SRC[>>5]]

[13] 
[CODE[NULL]] 値を使えるかどうかは[[欄]]によって違い、
[[仕様書]]の関係するところで一々[[規定]]されています。
[SRC[>>5]]

[14] 
[[フォント]]が[[不適合]]な場合は使えないところでも [CODE[NULL]]
が使われる場合がありますから、
[[フォント]]を解釈する実装はそれを想定しておく[RUBYB[べき][should]]です。
[SRC[>>5]]
そうしなければ参照元の[[部分表]]自体が参照されていることになりますから、
処理がおかしくなってしまいます。

[15] 
[[フォント]]ファイル中の[[表]]の配置位置は決まっていません。
[[符号無し整数]]なので[[起算点]]より前には置けませんし、
[[offset]] 欄のビット数で表せる最大の位置よりも後には置けませんが、
その中間の好きな位置に置けます。
複数の [[offset]] 値が同じ位置を参照することもできます。

[EG[
[16] 
例えば複数の [[lookup]] が同等の [CODE[Coverage]] を使いたければ、
同じものを2つ配置する必要はなく、
それらより後に1つだけ配置して、どちらにもその先頭を指すような [[offset]]
を設定することができます。 [[offset]] の値は違うかもしれませんが、
参照元の[[起算点]] + [[offset]] が同じ値になります。

]EG]

[30] 
仕様上はどこに置いても良さそうに (置く場所に制限はなさそうに) も読めるのですが、
どうも実装によってはそうでもないことがあるみたいです。
親の[[表][表 (OpenType)]]に属する[[部分表]]は親の[[表][表 (OpenType)]]の範囲に含まれる、
と仕様書を解釈するべきなのでしょうか。よくわかりません。

[EG[
[31] 
例えば [[Chrome]] は
[CODE[cmap]] [[表][表 (OpenType)]]
[F[[CODE[format]]]] [N[14]]
[[部分表]]の
[F[[CODE[nonDefaultUVSOffset]]]]
が指す[[記録]]がその[[部分表]]の
[F[[CODE[length]]]]
までの範囲内になければ構文解析エラーとします。



]EG]


[17] 
[[フォント]]ファイルを解釈する実装は、
[[バッファー溢れ]]等、
不正な[[メモリー操作]]が発生しないよう注意が必要です。
[[フォント]]ファイルは壊れているかもしれませんし、
不正なデータかもしれません。


* 表タグ

[22] 
[[フォント]]の最上位に当たる[[表]]の種別は[DFN[[RUBYB[[RUBY[表][ひょう]]タグ][table tag]]]]で識別されます。

[23] [CODE[TableRecord]] の [DFN[[F[[CODE[tableTag]]]]]]
は[[表]]の識別子たる[[タグ][OpenTypeタグ]]です。 [SRC[>>20]]

[26] 
[[OpenType]] [[フォント]]は、
[[OpenType]] の[[表][OpenType表]]の他、
[[TrueType]] 等、他の仕様の[[表][OpenType表]]も含められます。
[SRC[>>20]]
[SEE[ TrueType と OpenType の仕様の関係は [[OpenType]] ]]

[24] 
[[OpenType]] の[[規定]]では、
同じ[[タグ][表タグ]]の[[表][OpenType表]]は[[フォント]]当たり高々1つだけ含められます。
複数ある場合の挙動は未定義で、
実装はどれかを選んでも構いませんし、[[非妥当]]として拒絶しても構いません。
[SRC[>>20]]

[25] 
[[OpenType]] 以外の[[表][OpenType表]]は、
同じ[[タグ][表タグ]]を複数使っても構いません。
[SRC[>>20]]

[27] 
[[TrueType]] は、すべて[[小文字]]の[[表タグ]]を [[Apple]] 用に予約しています。
[SRC[>>20]]
[[OpenType]] で[[小文字]]の[[表タグ]]と[[大文字]]の[[表タグ]]が一見無秩序に混在しているのは、
この規定の影響のようです。

[28] 
[[OpenType]] は[[表タグ]]を特に制限することなく独自の利用
([DFN[[RUBYB[カスタムタグ][custom tag]]]])
を認めているものの、
[[先方互換性]]のため [[Microsoft]] に通知する[RUBYB[べき][should]]だとしています。
[SRC[>>20]]

[29] 
[[大文字と小文字の区別]]を当の [CITE[OpenType]] 仕様書がきっちりしていないのは、
困ったものです。
[SEE[ [[CMAP]], [[KERN]] ]]

[SEE[ [[OpenTypeタグ]], [[私用]] ]]

* 表の一覧

[21] 
[[フォント]]の最上位に当たる[[表]]は次のものがあります。

[FIG(table)[ [3] [[OpenType]] [[表]]

:tag: [[タグ][OpenTypeタグ]]
:o:[[OpenType]] [SRC[>>19]]
:l:[[OpenType Layout]] [SRC[>>2]]
:v:[[Visual TrueType]] [SRC[>>4]]
:ttc:[[TTC]] [SRC[>>19]]
:ttc2:[[TTC]] [SRC[その他]]

:tag: [CODE[avar]]
:o:[[Font Variations][OpenType Font Variations]]

:tag: [CODE[BASE]]
:l:○
:o:advanced typographic

:tag: [CODE[CBDT]]
:o: [[bitmap glyph]], [[color fonts]]

:tag: [CODE[C2PA]]

:tag: [CODE[CBLC]]
:o: [[bitmap glyph]], [[color fonts]]


:tag: [CODE[CFF ]]
:o: [[CFF outline]] (準必須)

:tag: [CODE[CFF2]]
:o: [[CFF outline]] (準必須)

:tag: [CODE[cmap]]
:o:必須
:ttc:各々持つべき

:tag:[CODE[COLR]]
:o:[[color fonts]]

:tag:[CODE[CPAL]]
:o:[[color fonts]]

:tag: [CODE[cvar]]
:o:[[Font Variations][OpenType Font Variations]]

:tag: [CODE[cvt ]]
:o: [[TrueType outline]]
:ttc:共有すべき

:tag:[CODE[DSIG]]
:o: other
:ttc2:末尾

:tag: [CODE[EBDT]]
:o: [[bitmap glyph]]
:ttc:共有すべき

:tag: [CODE[EBLC]]
:o: [[bitmap glyph]]
:ttc:共有すべき

:tag: [CODE[EBSC]]
:o: [[bitmap glyph]]
:ttc:共有すべき

:tag: [CODE[fpgm]]
:o: [[TrueType outline]]
:ttc:共有すべき

:tag: [CODE[fvar]]
:o:[[Font Variations][OpenType Font Variations]]

:tag: [CODE[gasp]]
:o: [[TrueType outline]]

:tag: [CODE[GDEF]]
:l:○
:o:advanced typographic

:tag: [CODE[glyf]]
:o: [[TrueType outline]] (必須)
:ttc:共有すべき

:tag: [CODE[GPOS]]
:l:○
:o:advanced typographic

:tag: [CODE[GSUB]]
:l:○
:o:advanced typographic

:tag: [CODE[gvar]]
:o:[[Font Variations][OpenType Font Variations]]

:tag:[CODE[hdmx]]
:o: other
:ttc:共有すべき

:tag: [CODE[head][head (OpenType)]]
:o:必須

:tag: [CODE[hhea]]
:o:必須

:tag: [CODE[hmtx]]
:o:必須
:ttc:共有すべき

:tag: [CODE[HVAR]]
:o:[[Font Variations][OpenType Font Variations]]

:tag: [CODE[JSTF]]
:l:○
:o:advanced typographic

:tag:[CODE[kern]]
:o: other

:tag: [CODE[loca]]
:o: [[TrueType outline]] (必須)
:ttc:共有すべき

:tag:[CODE[LTSH]]
:o: other
:ttc:共有すべき

:tag: [CODE[MATH]]
:o:advanced typographic


:tag: [CODE[maxp]]
:o:必須
:ttc:共有すべき

:tag:[CODE[MERG]]
:o: other

:tag:[CODE[meta][meta (OpenType)]]
:o: other

:tag: [CODE[MVAR]]
:o:[[Font Variations][OpenType Font Variations]]

:tag: [CODE[name][name (OpenType)]]
:o:必須
:ttc:各々持つべき

:tag: [CODE[OS/2][OS/2 (OpenType)]]
:o:必須
:ttc:各々持つべき

:tag:[CODE[PCLT]]
:o: other

:tag: [CODE[post][post (OpenType)]]
:o:必須

:tag: [CODE[prep]]
:o: [[TrueType outline]]
:ttc:共有すべき

:tag: [CODE[sbix]]
:o: [[bitmap glyph]], [[color fonts]]


:tag: [CODE[STAT]]
:o:[[Font Variations][OpenType Font Variations]], other


:tag: [CODE[SVG ][SVG-in-OpenType]]
:o: [[SVG outline]], [[color fonts]]


:tag: [CODE[TSI0]]
:v:○

:tag: [CODE[TSI1]]
:v:○

:tag: [CODE[TSI2]]
:v:○

:tag: [CODE[TSI3]]
:v:○

:tag: [CODE[TSI4]]
:v:廃止

:tag: [CODE[TSI5]]
:v:○

:tag: [CODE[TSIB]]
:v:廃止

:tag: [CODE[TSIC]]
:v:○

:tag: [CODE[TSID]]
:v:廃止

:tag: [CODE[TSIJ]]
:v:廃止

:tag: [CODE[TSIP]]
:v:廃止

:tag: [CODE[TSIS]]
:v:廃止

:tag:[CODE[VDMX]]
:o: other

:tag:[CODE[vhea]]
:o: other

:tag:[CODE[vmtx]]
:o: other

:tag: [CODE[VORG]]
:o: [[CFF outline]]

:tag: [CODE[VVAR]]
:o:[[Font Variations][OpenType Font Variations]]

]FIG]


* メモ