前回の続きであるが、OpenTypeレイアウトテーブルは複雑でどういう順番で書いていけばいいのか悩む
。
で、今回は前回を踏まえて、GSUB、GPOSテーブルで使われる共通のテーブル構成について。ちなみに、GSUBテーブルはグリフ置換のためのテーブル、GPOSテーブルはグリフの位置を正しく決定(ポジショニング)するためのテーブルである。GSUB、GPOSテーブルは、それぞれそのヘッダーにScriptList、FeatureList、LookupListへのオフセットを持っているのだが、まずは、これら3つの構造から。
まずは、ScriptListについて。
OpenTypeフォントは、様々なスクリプトのグリフをレンダリングするために使われる1つ以上のグリフのグループを持てるのだが、それらはScriptListで定義される。
ScriptListの構造は次のようになる。
ScriptList| 型 |
名前 |
説明 |
| USHORT |
ScriptCount |
Scriptレコードの数 |
| ScriptRecord |
ScriptRecords[ScriptCount] |
Scriptレコードの配列(タグのアルファベット順) |
ScriptCountはScriptレコードの数を表し、ScriptRecordsはScriptレコードの配列である。
Scriptレコードの構造は次のようになる。
Scriptレコード| 型 |
名前 |
説明 |
| Tag |
ScriptTag |
スクリプトタグ |
| Offset(USHORT) |
Script |
ScriptテーブルへのScriptListの先頭からのオフセット |
ScriptTagは前回説明した通り4バイトの印字可能なASCII文字で構成されるスクリプトを表す識別子である。ScriptはScriptテーブルへのオフセットである。
Scriptテーブルは、スクリプト内の言語システムを定義し、その構造は次のようになる。
Scriptテーブル| 型 |
名前 |
説明 |
| Offset(USHORT) |
DefaultLangSys |
デフォルトのLangSysテーブルへのScriptテーブルの先頭からのオフセットまたはNULL |
| USHORT |
LangSysCount |
LangSysレコードの数 |
| LangSysRecord |
LangSysRecords[LangSysCount] |
LangSysレコードの配列(タグのアルファベット順) |
DefaultLangSysは、スクリプト内のデフォルトの振る舞いを調整するLangSysテーブルへのオフセットを表す。LangSysCount、LangSysRecordsはそれぞれLangSysレコードの数とその配列である。
LangSysレコードの構造は次のようになる。
LangSysレコード| 型 |
名前 |
説明 |
| Tag |
LangSysTag |
言語システムタグ |
| Offset(USHORT) |
LangSys |
LangSysテーブルへのScriptテーブルの先頭からのオフセット |
LangSysレコードはScriptレコードと似た構成になっており、LangSysTagは言語システムタグ、LangSysはLangSysテーブルへのオフセットを表す。
LangSysテーブルは、前回の言語システムの説明の通り、言語システムで使用するフィーチャーを定義し、その構造は次のようになる。
LangSysテーブル| 型 |
名前 |
説明 |
| Offset(USHORT) |
LookupOrder |
NULL |
| USHORT |
ReqFeatureIndex |
必須フィーチャーのフィーチャーインデックス、または、0xFFFF(必須フィーチャーがない場合) |
| USHORT |
FeatureCount |
フィーチャーの数(必須フィーチャーは除く) |
| USHORT |
FeatureIndices[FeatureCount] |
フィーチャーのフィーチャーインデックスの配列 |
ReqFeatureIndexは、言語システムの必須フィーチャーのインデックスを表し、FeatureCountは言語システムのフィーチャーの数を表し、FeatureIndicesはフィーチャーインデックスの配列である。ちなみに、それぞれのフィーチャーはまだ、説明していないFeatureListで定義されるが、上記のフィーチャーインデックスを使って言語システムのそれぞれのフィーチャーにアクセスされる。
以上を踏まえるとスクリプト、言語システム、フィーチャーの概念的な関係は次の図のようになる。
次回以降、残りのFeatureList、LookupListを順に見ていこうと思うが、ここらへんは具体的に実際のフォントでの解析結果も示したほうが分かりやすいのであるが、何せT2Analayzerの開発の方が追い付かない
。というより、解析するプログラムはだいたい出来てるのだが、GUIをどうするかで悩んでいる。
追記:一応、GUIをこしらえたので、実際にScriptListを解析してみる。まずは、お馴染みのMS ゴシック(MSGOTHIC.TTF)のGSUBテーブルのScriptListから。
上の画像より、kanaスクリプトが定義され、その中に、JAN言語システムが定義されているのが分かる。また、JAN言語システム内にフィーチャーインデックス0のフィーチャーが定義されている。フィーチャーはFeatureListで定義されているので、フィーチャーインデックス0のフィーチャーがどんなフィーチャーであるかは、FeatureListを解析してみないと分からない。
次は、Tahomaフォント(tahoma.TTF)のGSUBテーブルのScriptList。
上の画像よりarabスクリプトが定義されている。その中に言語システムは明示的に定義されていないので、テキスト処理クライアントで利用する場合は、デフォルトの言語システムを利用することになる。そして、そのタグなしのデフォルトの言語システム内に、フィーチャーインデックスがそれぞれ0、1、2、3、4の5つのフィーチャーが定義されているのが分かる。
最近のコメント