FTGL まとめ

FTGL を Mac OS X で動かすときに勉強したことをまとめておきます。
やっぱり何にしても「まとめる」っていう行為はプラスになるわけで。


まず、一番おおもとの問題点です。

  • FTGL を使って日本語を出そうとしたが、出なかった


FTGL は FreeType を使ってフォントを表示していますが、
何も指定しないと FreeType では Unicode が使われますし、
FTGL 側で ft_encoding_unicode を指定していますので、
特別に日本語というものを指定しなくても、Unicode なら表示されるはずです。


で、そもそも Unicode ってなんぞやと思って FreeType がどういう Unicode
対応しているのか見てみたのですが、

FreeTypeエンコーディングについてのドキュメントのページ
http://freetype.sourceforge.net/freetype2/docs/reference/ft2-base_interface.html#FT_Encoding
には、以下のように書かれています。

Because of 32-bit charcodes defined in Unicode (i.e., surrogates),
all character codes must be expressed as FT_Longs.

The values of this type correspond to specific character repertories (i.e. charsets),
and not to text encoding methods (like UTF-8, UTF-16, GB2312_EUC, etc.).

超意訳すると、

Unicode では(サロゲートペアとかで) 32ビットの文字コードが定義されているから
全部の文字コードを FT_Long で定義してるよーん。

これらのエンコーディングのenum値は、エンコード方式( UTF-8 とか UTF-16 とか GB2312_EUC とか...)
じゃなくて、文字集合(文字セット)に対応するんだよーん。

と読めます。
これを見て頭の中のリンクが繋がったのですが、結局、UTF-8 とか UTF-16 とか UTF-32 とかは関係無く、
FreeTypeUnicode に対応してるんです。何を使っていても、Unicode のマップに合わせてやれば
問題無いだけでした。この辺がこんがらがってました。


で、現在 FTGL (FreeType) に渡す文字のエンコード方式は UTF-16 にしていますが、
何故 文字集合しか分からない FreeType が、エンコード方式である UTF-16 を理解して
そのまま日本語が表示出来るかというと、UTF-16 の 2バイト部分がほぼ UCS-2 だからです。
簡単に言うと UCS (≒ Unicode) は 2バイト部分が UCS-2 で 4バイト部分が UCS-4 なので、
UTF-16 であれば何もしなくても 2バイト部分が Unicode になるわけです。
だから通常使う限りでは UTF-16 で何も考えなくて良さそうです。
一般的には UTF-8 のほうが使われている印象ですが、UTF-8 の場合もその他(Shift_JIS とか)と同じく
Unicode のマップに変換する作業が発生することになります
Mac OS X では、UTF-8 の日本語は 3バイトだった…)。
もちろん UTF-16 で UCS-4 の文字をレンダリングするときにも変換が必要です。


そのため、ソースコードの文字エンコードUTF-16 にして、文字をソースにベタ書きすれば
そのまま FreeTypeレンダリングできるはずですが、gcc on Mac OS X だと
UTF-16 を読んでくれませんでした。


結果、ソースは Windows との絡みもあり、無難に Shift_JIS にしていますが、
フリーな TrueTypeフォントみかちゃんフォントしか知らないので、 Unicode にマップする必要があるため
iconv を使って Shift_JISUTF-16 にしました。
Shift_JIS のマップを持ったフォントを持ってきて日本語を Shift_JIS でベタ書きしても上手くいくはずです。


始め UTF-8 にしていくらやってもできないから変だなーと思っていましたが、
UTF-8 = Unicode だと思い込んでいた中途半端な知識が溝をさらに深めていました。



で結局まとめると、

めでたしめでたし。



自分が勉強したことをガーっと書いてしまったので分かりづらいかとは思いますが、
フォントとかエンコード方式とかって面白いですね。いままでワケも分からず逃げていましたが
FreeBSD を使っていた時代は FreeType なんて絶対インストールしなかった)
少しかじってみるとなんだか先が少し広がりそうな気になってきます。
思いもよらないところから Unicode の触りが勉強できてよかったです。