* 仕様書

[REFS[
-
[1] 
[CITE@en-us[[[GDEF]] — Glyph Definition Table (OpenType 1.9) - Typography | Microsoft Docs]], [[PeterCon]], [TIME[2022-08-16T08:07:02.000Z]] <https://docs.microsoft.com/en-us/typography/opentype/spec/GDEF>
]REFS]

* 表

[36] 
[CODE[GDEF]] [[表][OpenType表]]は[[グリフ]]に関係する雑多な情報を格納するため使われています。

[37] 
各[[部分表]]はいずれも必要なときだけ記述することになっています。
1つも[[部分表]]がないことも (理論上は) あります。

* 文脈

[15] 
[CODE[GDEF]] [[表]]は必須ではなく、不要なら省略できます。
実際に省略した[[フォント]]も珍しくありません。

[29] 
[[級定義]]は全体に適用される [CODE[GDEF]] のもの以外に、
[CODE[GPOS]] や [CODE[GPOS]] の [[lookup]]
にも書くことができます。特定の [[lookup]]
でしか使わないようなものはその場で個別に定義されるようです。


* グリフ集合

** グリフ級定義

[5] 
[CODE[GDEF]]
[[表]]の
[DFN[[CODE[glyphClassDefOffset]]]]
で参照される[DFN[[RUBYB[グリフ[RUBY[級][きゅう][クラス]][RUBY[定][てい]][RUBY[義][ぎ]]][Glyph Class Definition]]]]
([DFN[GlyphClassDef]])
[[部分表]]は、
[[フォント]]内の[[グリフ]]を分類するものです。
[SRC[>>1]]

[25] 
[CODE[GDEF]] [[表]]の [F[version]] [N[1.0]], [N[1.2]], [N[1.3]] に存在します。
[SRC[>>1]]

[6] 
[[級定義]][[表]]として記述します。
[SRC[>>1]]
[[級値]]は [[uint16]] で、
[[級定義]]表内に明示しない場合の既定値は [N[0]] となります。

[7] 
[[級値]]は次のいずれかによります。
[SRC[>>1]]

- [DFN[[N[0]]]] 未分類 
- [N[1]] [[基底グリフ]]
- [N[2]] [[合字グリフ]]
- [N[3]] [[マークグリフ]]
- [DFN[[N[4]]]] [RUBYB[部品][component]]グリフ

;; [9] [N[1]] は[[基底文字]]に相当するもの、
[N[3]] は[[結合文字]]に相当するもの。
[N[2]] は複数の[[文字]]の組み合わせで生じる[[合字]]を表現するもの、
[N[4]] は[[合字]]の構成部品を表すもの。

[8] 
ここで指定された[[グリフ級]]は,
[CODE[GPOS]]
や
[CODE[GSUB]]
の記述に用いることができます。

[10] 
[CODE[GDEF]] [[表]]も
[[GlyphClassDef]] [[部分表]]も[[グリフ]]への[[グリフ級]]の割当も必須ではなく、
必要ないなら省略して良いことになっています。


** マーク添付級定義

[11] 
[CODE[GDEF]]
[[表]]の
[DFN[[CODE[markGlyphSetsDefOffset]]]]
で参照される[DFN[[RUBYB[マーク[RUBY[添][てん]][RUBY[付][ぷ]][RUBY[級][きゅう][クラス]][RUBY[定][てい]][RUBY[義][ぎ]]][Mark Attachment Class Definition]]]] ([DFN[MarkAttachClassDef]])
[[部分表]]は、
[RUBYB[[[マーク][結合マーク]]][mark]][[グリフ]]を分類するものです。
[SRC[>>1]]

[26] 
[CODE[GDEF]] [[表]]の [F[version]] [N[1.0]], [N[1.2]], [N[1.3]] に存在します。
[SRC[>>1]]


[12] 
[[級定義]][[表]]として記述します。
[SRC[>>1]]
[[級値]]は [[uint16]] で、
[[級定義]]表内に明示しない場合の既定値は [N[0]] となります。

[16] 
[[グリフ級定義]]とは独立しており,
(意味があるかはともかく)
[[グリフ級]]が [N[3]] ([[マーク]])
でなくても[[マーク添付級]]を
[N[0]]
以外に設定できます。

[17] 
級値の意味は特に定められていません。
[[フォント]]ごとに決められるのでしょう。
同じような位置の[[マーク][結合マーク]]をグループ化することが想定されています
[SRC[>>1]]。

[13] 
ここで指定された[[マーク添付級]]は,
[CODE[GPOS]]
や
[CODE[GSUB]]
の記述に用いることができます。

[14] 
[CODE[GDEF]] [[表]]も
[[MarkAttachClassDef]] [[部分表]]も[[グリフ]]への[[マーク添付級]]の割当も必須ではなく、
必要ないなら省略して良いことになっています。

** マークグリフ集合群

[18] 
[CODE[GDEF]]
[[表]]の
[DFN[[CODE[markAttachClassDefOffset]]]]
で参照される[DFN[[RUBYB[マークグリフ[RUBY[集][しゅう]][RUBY[合][ごう]][RUBY[群][ぐん]]][Mark Glyph Sets]]]]
([DFN[MarkGlyphSets]])
[[部分表]]は、
[[グリフ]]の集合を記述するものです。

[27] 
[CODE[GDEF]] [[表]]の [F[version]] [N[1.2]], [N[1.3]] に存在します。
[SRC[>>1]]


[22] 
現在 [CODE[format]] は [N[1]] のみが規定されています。
[SRC[>>1]]

[23] 
[CODE[format]] [N[1]] では、
[[Coverage]] [[表]]を任意の個数記述できます。
[SRC[>>1]]

[24] 
位置 [VAR[i]] の [[Coverage]] [[表]]を使って、
第 [VAR[i]] の[[マークグリフ集合]]に[[グリフ]]が所属するかどうかが定まります。
[[級定義]]を使った[[マーク添付級定義]]では1つの[[グリフ]]がちょうど1つの[[マーク添付級]]に属するのとは違って、
こちらでは1つの[[グリフ]]は任意の個数の[[マークグリフ集合]]に所属できます。



[19] 
[[マーク添付級]]を更に拡張して[[グリフ]]をグループ化するために使えます。
[SRC[>>1]]

[20] 
ここで指定された[[グリフ]]の[[集合]]は,
[CODE[GPOS]]
や
[CODE[GSUB]]
の記述に用いることができます。

[21] 
[CODE[GDEF]] [[表]]も
[[MarkGlyphSets]] [[部分表]]も必須ではなく、
必要ないなら省略して良いことになっています。



* 添付点リスト

[30] 
[CODE[GDEF]]
[[表][OpenType表]]の
[DFN[[RUBYB[[RUBY[添][てん]][RUBY[付][ぷ]][RUBY[点][てん]]リスト][Attachment Point List]]]]
([DFN[[CODE[AttachmentList]]]])
は、
[CODE[GPOS]]
[[表][OpenType表]]中で定義されるすべての[RUBYB[[[添付点]]][attachment point]]と、
それに関連付けられた[[グリフ]]を識別するものです。
[SRC[>>1]]

[31] 
[[クライアント]]はこれを使って各[[グリフ]]の[[添付点]]の[[座標]]に速くアクセスできます。
[[クライアント]]は、
[[グリフ]]の[[ビットマップ]]と[[添付点]]の[[座標]]を[[キャッシュ]]しておくことができます。
[SRC[>>1]]

[38] 
[[添付点リスト]]は、[[グリフID]]と、それに対する [[contour point index]]
のリストで構成されます。
[SRC[>>1]]

[39] 
このデータは高速処理のためなので、情報としては冗長です。
[CODE[GPOS]] の複雑な[[データ構造]]を辿らなくてもアクセスできるようにすることを意図しています
[SRC[>>1]]。

[40] 
この情報が実態と合っていない場合にどうなるかは特に規定されていません。
処理性能が低下するかもしれませんし、
時には[[レンダリング]]が乱れることもあるかもしれません。

[41] 
この情報が含まれない[[フォント]]も珍しくありません。
(その多くは該当する[[添付点]]がないから含めていないケースでしょうが、
[[添付点]]がないことは [CODE[GPOS]] を調べないと実装は知り得ないので、
空の[[添付点リスト]]を [CODE[GDEF]] に入れておくべきとも言えます。)
本来この情報は実装側で (必要なら) 自動生成して保持しておくべきもので、
[[フォント]]に含まれていても無視して良いのかも知れません。


* 合字キャレットリスト

[32] 
[CODE[GDEF]]
[[表][OpenType表]]の[DFN[[RUBYB[[RUBY[合][ごう]][RUBY[字][じ]]キャレットリスト][Ligature Caret List]]]]
([DFN[[CODE[LigatureCaretList]]]])
[[表][OpenType表]]は、
[[フォント]]中のすべての[[合字]]における[[キャレット]]の位置決定のための[[座標]]を指定するものです。
[SRC[>>1]]

[33] 
表示された文章中の[[合字]]の構成要素を[[選択]]して highlight
するために使うことが出来ます。
[SRC[>>1]]

[42] 
「すべて」とはいいますが、[[グリフ級定義]]や [CODE[GSUB]] とは完全に独立しています。
[[フォント]]中の[[合字]]すべてが[[キャレット]]情報を持つことは[[データ構造]]上保証されていません。

[34] 
各[[合字]]は、
1つ[[以上]]の[RUBYB[キャレット位置][caret position]]を持つことができます。
[SRC[>>1]]

[35] 
各キャレット位置は、
[[用字系]]や[[言語系]]の[[書字方向]]における[[基線]]に対する
[VAR[X]] または [VAR[Y]] の値です。
[SRC[>>1]]

[43] 
[[合字キャレットリスト]]では、
キャレット位置の[[座標]]を直接指定する方法の他に、
[[グリフ]]の [[contour point]] の [[index]] を指定する方法、
[[variable font]] 用の方法があります。
[SRC[>>1]]

;;
[44] 
キャレット位置を直接指定すると [[font hinting]] でズレが生じる可能性があります。
[SRC[>>1]]



* 利用例

[2] 
[CITE[BabelStone Han]] :
[[glyph class]]
1, 2, 3
の[[グリフ]]の一覧が入っています。 
[CODE[classFormat]] 2。

[3] 
[CITE[花園明朝]] :
全文字 
[[glyph class]]
1
とする一覧が入っています。
[CODE[classFormat]] 2。

[4] 
[CITE[Nishiki-teki]] :
[[glyph class]]
1, 2, 3
の[[グリフ]]の一覧が入っています。 
[CODE[classFormat]] 2。

[CODE[MarkAttachClassDef]]
も
class 0
に1つだけ入っています。
[CODE[classFormat]] 1。

[CODE[LigCaretList]]
も入っていますが中身は空です。

* メモ

[28] [CITE@ja-jp[OpenType glyph processing (part 2) - Typography | Microsoft Docs]], [[alib-ms]], [TIME[2022-08-27T08:46:53.000Z]] <https://docs.microsoft.com/ja-jp/typography/develop/processing-part2#gdef-table>