TrueTypeFontのファイルフォーマット調べ書き

なんとなく調べてみました。
日本語のまとまった文献がほとんどなくてしんどかった。


TTFフォントファイル全体の構造

フォントに関する定義を、何種類かのサブテーブルに入れてあるファイル。
ファイルの先頭に4バイトのバージョン指定があり、あとはサブテーブルの個数、オフセットが列挙されているだけ。

サブテーブルには必須なものと、そうでないものがある。
例えば、グリフを保持するglyfテーブル、キャラクターコードとグリフをマッピングするcmapテーブルなどは必須。
Embedded bitmap dataを入れるEBDTはオプショナル、など。

カラー絵文字はApple,Google(Android),MSでどれも入れ方がバラバラだとか。
Googleはカラー絵文字のコンパイル用スクリプトを公開しているけど、Appleのはなさそう。


cmapテーブルについて

TTFファイルの中でも、自分が調べたのは主にcmapテーブルのみ。
cmapはサブテーブルの中でもとても面倒なものっぽい。

プラットフォームIDとエンコーディングIDの組み合わせでキャラクターコードとグリフの組み合わせを指定します。
それぞれ3,1だとUnicode、3,2だとShiftJISとか。

あとはキャラクターコードとグリフの対応表だけです。
こいつが簡単に見えて鬼畜なシロモノ。

対応表は、複数のフォーマットで記述できるようになっている。
フォーマット0,2,4,6,… とか。

それぞれ、全く違う法則性で並んでいる。。

フォーマット0は「フォーマットID,長さ,バージョン,byte[256]」でのみ構成される。
ので、1byte表せる範囲のグリフと文字コードの1:1の対応表しか表せない。

フォーマット4だと、任意の数の「文字コード開始位置、グリフ開始位置、グリフ終了位置」をUSHORTで表現できる。(厳密にはもう少しいろいろある)

当然この二つを同じようなルーチンで解析できるわけがないので、フォーマットごとに解析するルーチンを書く必要がある。

ところで、フォーマット4の表現できる領域はUSHORTの範囲となる。
USHORT、つまり2byteあると、U+0000~U+FFFFが扱えるので、おおよその文字を扱うにはこれで困らなかった。絵文字の台頭までは

絵文字はUnicodeでいえば追加多言語面に属する。具体的にはU+1xxxxの位置。
つまるところ、フォーマット4ですら日常的なやりとり十分に表現できなくなったことになる。
結果・・・さらに増える対応表の種類

フォーマットがこれだけあるんだから、もっと増えても構わないよね? と言わんばかりに新しいフォーマットが出てくる出てくる。
新しいフォーマット12はフォーマット4に似ている。任意の数の「文字コード開始位置、グリフ開始位置、グリフ終了位置」をULONG(4byte)で表現する。

これだけでいいじゃん、と思うところですが、4バイトを表現できるフォーマットは8,10,12,13,14があります。
なぜこんなに作った…?

挫折したので、調べ物はここで終了。


ほとんど意味のないまとめ&おわりに

・TTFファイルについて調べようとすると、それぞれのサブテーブルについて調べるのがメイン。必要のない部分は知る必要がないので、その点は楽? ではない。maxpテーブルの罠。
・cmapサブテーブルのフォーマット無駄に増えすぎだと思う。
・cmapフォーマット4推しなのはわかったから、フォーマット12しかないフォントでも受け付けてくださいMSさん。

ttfファイルを解析するにあたっての知識としては概ね事実を書いているつもりですが、それぞれのcmapサブテーブルの登場年月日とかは調べてないので適当でした。
もしかするとフォーマット12がフォーマット4より前に存在してたかもしれない。さすがにそれはないと思いますけど。

簡単な成果物はあるのでいつか公開できる形にまとめたい。


参考資料:
The OpenType Font File
Microsoft Typography Features of TrueType and OpenType
PDFBoxプロジェクトのFontBoxのソース

カテゴリー: プログラミング関連 パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です