WindowsでFTGLを使ってOpenGLで日本語フォントを表示する
非力な環境では遅いらしいSDL_ttfの代用としてOpenGLでTrueTypeフォントを FTGL というライブラリで扱えるかどうかを試してみます。
今回使用する環境
全て無料で手に入る物で揃えてみました。
Visual C++ 2008 Express Edition (SP1) のインストール
VS2003以降ならコンパイルできるようですが、ここでは無料で手に入るVC2008 SP1を使います。Visual Studioをインストールしていない人はVisual Studio 2008 Express Editionからインストールしておきましょう。
名称が長いので以下ではVisual C++ 2008 Express EditionをVCと省略することにします。
FreeType のダウンロード
SourceForgeのFreeTypeダウンロードページからft***.zipをもらってきて展開します。私が取得したときの最新はft239.zipでした。
次にFTGLのビルドに必要なので展開したディレクトリのパスを環境変数 システム -> システムの詳細設定 -> 環境変数">*1"FREETYPE"に記述します。私は"C:\Library\"以下にまとめて置くことにします。
FreeType のビルド
VCから"$(FREETYPE)/builds/win32/vc2008/freetype.sln"を開きます*2。
ターゲットを"LIB RELEASE"にしてソリューションのビルドを行います(必要なら"LIB DEBUG"でもビルドします)。
うまくビルドできると"$(FREETYPE)/objs/win32/vc2008"に"freetype***.lib"ができている*3ので、二階層上の"$(FREETYPE)/objs"にコピーしておきます。
FTGL のビルド
SourceForgeのFTGLダウンロードページからftgl-*.tar.gzをもらってきて展開します。私が取得したときの最新はftgl-2.1.3-rc5.tar.gzでした。
以下では展開したディレクトリパスを$(FTGL)と記述することにします。環境変数にする必要はありません。
VCから"$(FTGL)/msvc/vc8/ftgl.sln"を開きます。ソリューションファイルの変換をウィザードに沿って行います。
プロジェクトftgl_dllのプロパティを開き、構成プロパティ→リンカ→入力→追加の依存ファイルの中の"freetype234.lib"を先ほど作成したファイル名に書き換えます。
準備が整ったのでftgl_dllのビルドを行います。成功すれば"$(FTGL)/msvc/Build"にftgl.dll, ftgl.libができているはずです。
GLUT のダウンロード
下記のデモで使うためにGLUT (OpenGL Utility Toolkit)を用意しておきます。GLUT はビルド済みファイルが公開されているので、GLUT for Windowsからバイナリをダウンロードして展開します。
README-win32.txtにしたがい、glut32.dllを"/Windows/System"に、glut32.libを"(MSVC9のインストール先)/lib"に、glut.hを"((MSVC9のインストール先)/include/GL"に置きます。
FTGL のデモをビルド
ここまでうまくいっていることを確かめるために FTGL についているデモを実行してみます。
VC から"$(FTGL)/msvc/vc8/ftgl_demo.sln"を開きます。
プロジェクトFTGLDemo のプロパティを開き、構成プロパティ→リンカ→全般→追加のライブラリ ディレクトリに"$(FREETYPE)/objs"を追加します。
FTGLDemo.cppを開き、
# define FONT_FILE "C:\\WINNT\\Fonts\\arial.ttf"
このファイルパスを使用したいフォントのパスに書き換えてビルドします。
FTGL のデモで日本語文字を表示する
上記のデモの文章を修正して適当な日本語の文章(後半はWikipediaのOpenGLのページからのコピー)をMSゴシックで表示させてみました。
プログラムをバイナリエディタで開いてみると、コンパイルされた状態で既に文字化けしているのでVC++側の問題なのだと思います。試しにソースコード中の文字化けした文字列をエスケープ文字列にしたらちゃんと表示されます。
ソースコードがエスケープ文字列だらけになってしまうのが困りものですが:-(
この問題を検索してみると、VC++.NET と UTF-8 -C++ で書いたソースコードに UTF-8 エンコーディン- C言語・C++・C# | 教えて!gooのようにUTF-8のファイルを使うとおかしくなるようです。OSのロケールを変えなければならない、って単なるIDE(or コンパイラ)のバグなのでは??
D言語からは使えないのが困った
FTGLはC++言語で記述されているため、DLLを変更せずに直接使うことはできません(参考:C++とのインターフェイス)。ということで私はFTGLは使わないことにします。ここまで書いておいてひどいオチだ;-)
(追記) FTGL付随のデモを見てみたところ、C言語インターフェイスも用意されているようです。早とちりしてごめんなさい。
(さらに追記) D言語から使ってみました。