glyph class

GDEF 表 (OpenType)

仕様書

[36] GDEF グリフに関係する雑多な情報を格納するため使われています。

[37]部分表はいずれも必要なときだけ記述することになっています。 1つも部分表がないことも (理論上は) あります。

文脈

[15] GDEF は必須ではなく、不要なら省略できます。 実際に省略したフォントも珍しくありません。

[29] 級定義は全体に適用される GDEF のもの以外に、 GPOSGPOSlookup にも書くことができます。特定の lookup でしか使わないようなものはその場で個別に定義されるようです。

グリフ集合

グリフ級定義

[5] GDEF glyphClassDefOffset で参照されるグリフ (きゅう) (クラス) (てい) () (Glyph Class Definition) (GlyphClassDef) 部分表は、 フォント内のグリフを分類するものです。 >>1

[25] GDEF version 1.0, 1.2, 1.3 に存在します。 >>1

[6] 級定義として記述します。 >>1 級値uint16 で、 級定義表内に明示しない場合の既定値は 0 となります。

[7] 級値は次のいずれかによります。 >>1

[9] 1基底文字に相当するもの、 3結合文字に相当するもの。 2 は複数の文字の組み合わせで生じる合字を表現するもの、 4合字の構成部品を表すもの。

[8] ここで指定されたグリフ級は, GPOSGSUB の記述に用いることができます。

[10] GDEF GlyphClassDef 部分表グリフへのグリフ級の割当も必須ではなく、 必要ないなら省略して良いことになっています。

マーク添付級定義

[11] GDEF markGlyphSetsDefOffset で参照されるマーク (てん) () (きゅう) (クラス) (てい) () (Mark Attachment Class Definition) (MarkAttachClassDef) 部分表は、 マーク (mark) グリフを分類するものです。 >>1

[26] GDEF version 1.0, 1.2, 1.3 に存在します。 >>1

[12] 級定義として記述します。 >>1 級値uint16 で、 級定義表内に明示しない場合の既定値は 0 となります。

[16] グリフ級定義とは独立しており, (意味があるかはともかく) グリフ級3 (マーク) でなくてもマーク添付級0 以外に設定できます。

[17] 級値の意味は特に定められていません。 フォントごとに決められるのでしょう。 同じような位置のマークをグループ化することが想定されています >>1

[13] ここで指定されたマーク添付級は, GPOSGSUB の記述に用いることができます。

[14] GDEF MarkAttachClassDef 部分表グリフへのマーク添付級の割当も必須ではなく、 必要ないなら省略して良いことになっています。

マークグリフ集合群

[18] GDEF markAttachClassDefOffset で参照されるマークグリフ (しゅう) (ごう) (ぐん) (Mark Glyph Sets) (MarkGlyphSets) 部分表は、 グリフの集合を記述するものです。

[27] GDEF version 1.2, 1.3 に存在します。 >>1

[22] 現在 format1 のみが規定されています。 >>1

[23] format 1 では、 Coverage を任意の個数記述できます。 >>1

[24] 位置 iCoverage を使って、 第 iマークグリフ集合グリフが所属するかどうかが定まります。 級定義を使ったマーク添付級定義では1つのグリフがちょうど1つのマーク添付級に属するのとは違って、 こちらでは1つのグリフは任意の個数のマークグリフ集合に所属できます。

[19] マーク添付級を更に拡張してグリフをグループ化するために使えます。 >>1

[20] ここで指定されたグリフ集合は, GPOSGSUB の記述に用いることができます。

[21] GDEF MarkGlyphSets 部分表も必須ではなく、 必要ないなら省略して良いことになっています。

添付点リスト

[30] GDEF (てん) () (てん) リスト (Attachment Point List) (AttachmentList) は、 GPOS 中で定義されるすべての添付点 (attachment point) と、 それに関連付けられたグリフを識別するものです。 >>1

[31] クライアントはこれを使って各グリフ添付点座標に速くアクセスできます。 クライアントは、 グリフビットマップ添付点座標キャッシュしておくことができます。 >>1

[38] 添付点リストは、グリフIDと、それに対する contour point index のリストで構成されます。 >>1

[39] このデータは高速処理のためなので、情報としては冗長です。 GPOS の複雑なデータ構造を辿らなくてもアクセスできるようにすることを意図しています >>1

[40] この情報が実態と合っていない場合にどうなるかは特に規定されていません。 処理性能が低下するかもしれませんし、 時にはレンダリングが乱れることもあるかもしれません。

[41] この情報が含まれないフォントも珍しくありません。 (その多くは該当する添付点がないから含めていないケースでしょうが、 添付点がないことは GPOS を調べないと実装は知り得ないので、 空の添付点リストGDEF に入れておくべきとも言えます。) 本来この情報は実装側で (必要なら) 自動生成して保持しておくべきもので、 フォントに含まれていても無視して良いのかも知れません。

合字キャレットリスト

[32] GDEF (ごう) () キャレットリスト (Ligature Caret List) (LigatureCaretList) は、 フォント中のすべての合字におけるキャレットの位置決定のための座標を指定するものです。 >>1

[33] 表示された文章中の合字の構成要素を選択して highlight するために使うことが出来ます。 >>1

[42] 「すべて」とはいいますが、グリフ級定義GSUB とは完全に独立しています。 フォント中の合字すべてがキャレット情報を持つことはデータ構造上保証されていません。

[34]合字は、 1つ以上キャレット位置 (caret position) を持つことができます。 >>1

[35] 各キャレット位置は、 用字系言語系書字方向における基線に対する X または Y の値です。 >>1

[43] 合字キャレットリストでは、 キャレット位置の座標を直接指定する方法の他に、 グリフcontour pointindex を指定する方法、 variable font 用の方法があります。 >>1

[44] キャレット位置を直接指定すると font hinting でズレが生じる可能性があります。 >>1

利用例

[2] BabelStone Han : glyph class 1, 2, 3 のグリフの一覧が入っています。 classFormat 2。

[3] 花園明朝 : 全文字 glyph class 1 とする一覧が入っています。 classFormat 2。

[4] Nishiki-teki : glyph class 1, 2, 3 のグリフの一覧が入っています。 classFormat 2。

MarkAttachClassDef も class 0 に1つだけ入っています。 classFormat 1。

LigCaretList も入っていますが中身は空です。

メモ

[28] OpenType glyph processing (part 2) - Typography | Microsoft Docs, alib-ms, https://docs.microsoft.com/ja-jp/typography/develop/processing-part2#gdef-table