Mark Glyph Sets Table

GDEF 表 (OpenType)

仕様書

表

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

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

文脈

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

[29] 級定義は全体に適用される GDEF のもの以外に、 GPOS や GPOS の lookup にも書くことができます。特定の 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] ここで指定されたグリフ級は, GPOS や GSUB の記述に用いることができます。

[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] ここで指定されたマーク添付級は, GPOS や GSUB の記述に用いることができます。

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

マークグリフ集合群

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

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

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

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

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

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

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

[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 point の index を指定する方法、 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