GSUB テーブル (2) - FeatureList

FeatureList
次に、FeatureList テーブルを解説します。

「縦書き置換」「合字置換」「文字幅置換」など、各置き換えの種類ごとに分けられたデータとなっています。

実際に使う際には、ScriptList からインデックス番号を取得して参照するか、直接 FeatureList をテーブルを参照します。
テーブルデータ
FeatureList
uint16 featureCountFeatureRecord の数
FeatureRecord featureRecords[featureCount]FeatureRecord の配列。
featureTag の数値順に並んでいる。

ScriptList テーブルで取得したインデックス番号は、この配列の添字となる。

FeatureRecord
Tag featureTag識別子 ('vert' など)
Offset16 featureOffsetFeature テーブルへのオフセット位置。
(FeatureList の先頭を 0 する)

Feature
Offset16 featureParamsOffsetFeatureParams テーブルへのオフセット位置 (Feature の先頭を 0 とする)。
0 でなし。
特定の feature のみで使用され、構造は各 feature によって異なる。
('cv01' - 'cv99', 'size', 'ss01' - 'ss20')
uint16 lookupIndexCount配列の数
uint16 lookupListIndices[lookupIndexCount]LookupList テーブルのインデックス番号 (0〜) の配列。
任意の順番で並んでいる。

最終的に、LookupList テーブルを参照するためのインデックス値が取得できます。

LookupList には、対象となるグリフを検索して、置き換えるためのデータが格納されています。
FeatureRecord のタグ (featureTag)
タグ一覧は、仕様書の「Feature tags」にあります (GSUB/GPOS 共通)。

GSUB で使われる主なタグは、以下の通りです。

文字置換
aalt複数あるバリエーションからの選択
nalt丸付き文字に置換
rubyルビ用かなに置換
loclデフォルトの形から、言語ごとにローカライズされたグリフに置換
合字/分解
liga合字置換
ccmp2つ以上のグリフの合字/分解
他の機能よりも先に実行する。
dlig印刷上、好ましいとされる合字への置換
縦書き
vert縦書きグリフへの置換
vrt2縦書きと、欧文などを右に90度回転したグリフ
vrtr欧文などを右に90度回転したグリフ。
vert と一緒に使うことを想定している。vrt2 と一緒には使えない。
幅変換
hwidプロポーショナル/全角グリフを半角幅グリフに
fwid半角グリフを全角グリフに
pwid全角/半角幅グリフを半角プロポーショナルに
twid全角の1/3幅のグリフに置換 (主に数字)
qwid全角の1/4幅のグリフに置換 (主に数字)
pknaひらかなを全角<->半角に
字形変換
hkna標準のひらかなを、印刷の横書き専用の字形に置換
vkna標準のひらかなを、印刷の縦書き専用の字形に置換
ital1つのフォントに、通常と斜体の両方の欧文が含まれる場合、通常グリフを斜体のグリフに置換。
漢字などの置換
smpl簡略字体、または中国語の簡体字に置換
trad旧字体、または中国語の繁体字に置換
jp78JIS90 → JIS78 に置換
jp83JIS90 → JIS83 に置換
jp90JIS78/83 → JIS90 に置換
jp04JIS2004 以外を JIS2004 に置換
nlck印刷標準字体に置換 (字体が複雑な方へ)
exptJIS78 字形に置換
hojoJIS2004 → JIS90 のグリフに置換。
(JIS90 と JIS2004 の文字が重複しているため、両方をサポートするフォントを作成する場合は、JIS2004 の方が推奨される)
数字など
dnom数字やスラッシュを、分数用の分母グリフに置換
numr数字やスラッシュを、分数用の分子グリフに置換
frac分数用のグリフに置換
subs下付き文字
sups上付き文字
zero中にスラッシュが付く、数字のゼロに置換

複数処理
GSUB では、グリフの置換を複数の種類で連続して行うことができます。
('vert' で縦書きにした後に、さらに別の文字に置き換えるなど)

仕様書の方で、同時に使用できない機能は記述されていますが、それらの処理順は完全にソフトウェア側に委ねられているため、必要に応じて適切に対処する必要があります。
プログラム
>> 18_gsub_feature.c

GSUB の FeatureList の一覧を表示するプログラムです。

各 FeatureList インデックスを参照している ScriptList のタグも併せて表示しています。

---- FeatureList ----

featureCount: 631

[0] 'aalt' | offset:3788 | 0,1, ('DFLT' '*def')
[1] 'aalt' | offset:3796 | 0,1, ('cyrl' '*def')
[2] 'aalt' | offset:3804 | 0,1, ('cyrl' 'JAN ')
...
[574] 'vert' | offset:7672 | 49,50,53, ('hani' '*def')
[575] 'vert' | offset:7682 | 49,50,53, ('hani' 'JAN ')
[576] 'vert' | offset:7692 | 49,52,53, ('hani' 'KOR ')
[577] 'vert' | offset:7702 | 49,53, ('hani' 'ZHH ')
[578] 'vert' | offset:7710 | 49,51,52, ('hani' 'ZHS ')
[579] 'vert' | offset:7720 | 49,53, ('hani' 'ZHT ')
...

見てみるとわかりますが、同じタグで、LookupList インデックス値も全く同じものが複数個ならんでいる場合が多いです。

ただし、featureTag によっては、各言語によってインデックス値が異なっている場合もあります。

「源ノ明朝」や「源ノ角ゴシック」のような、中国語/日本語/韓国語がセットになっている CJK フォントでは、上記のように、各言語によって置き換える縦書きグリフが一部異なっています。

縦書きで必要なもの
vert」または「vrt2」です。

vrtr」はあまり使われていないと思うので、基本的には、この2つのいずれかで、縦書きグリフへの変換を行います。

vrt2」には、「vert」と同じグリフに加えて、欧文などを時計回りに90度回転したグリフが含まれています。
縦書き中に、欧文を回転して横書きしたい場合に使います。

ただし、この2つは、フォントによって、片方しかない場合や、両方含まれている場合もあります。
どちらを使うかはソフトウェアによって異なるため、必要に応じて適切なものを使ってください。

ただ、フリーのフォントではまれに、本来 vert に入れるべきグリフが vrt2 のみに入っていたり、vert/vrt2 両方に入れるべきグリフが、片方にしか入っていなかったりするフォントがあるので、万全を期すなら、両方のデータを合体させて使った方が良いです。