FreeType2 と iconv と wcstombs
ビットマップフォントを作るために必要なので、表題のものを使ってみた。
FreeType は SDL_ttf 経由でしか使ったことなかったが、使い方自体はあんまり変わらない感じだった。
一応、チュートリアルのリンクだけ貼っとこう。
http://freetype.sourceforge.net/freetype2/documentation.html
wcstombs を使う前に、下記のように setlocale を呼ばないと日本語の変換ができない。
私の環境(Fedora 10)では、ja_JP.utf8 を使う。
例)
setlocale(LC_CTYPE, "ja_JP.utf8");
if (wcstombs(s, ws, sizeof(s)) == -1)
{
// error
}
半角英数字だけなら setlocale を呼ばなくても別に良いのだが、日本語環境で使いたいときに呼び忘れると、残念な結果になる。
iconv は使用エンコーディングさえ間違えなければOKなのだが、使い方をよく忘れるので、コードを貼り付けとく。
iconv_t cd;
cd = iconv_open("SHIFT_JIS", "UTF-8");
if (cd == (iconv_t)-1)
{
// error
}
char* ps1 = &s1[0];
char* ps2 = &s2[0];
size_t inbufleft = strlen(ps1);
size_t outbufleft = sizeof(s2);
if (iconv(cd, &ps1, &inbufleft, &ps2, &outbufleft) == -1)
{
// error
}
iconv_close(cd);
・iconv 対応のエンコーディング
[jaianism@localhost ~]$ iconv --list
・wcstombs 対応のロケール
[jaianism@localhost ~]$ locale -a
【追記】
生の FreeType は日本語周りの制御が面倒臭くなるようだ。
マルチバイト文字が UTF-8 で固定されてしまうが、やっぱり SDL_ttf を使うことにして、Windows 環境では iconv で変換をかけることにしよう。
そっちのほうが簡単だ。
↓何バイト文字か判別する処理(UTF-8)
if (text[n] <= -0x09 && text[n] >= -0x10)
{
// 4バイト文字
}
else if (text[n] <= -0x11 && text[n] >= -0x20)
{
// 3バイト文字
}
else if (text[n] <= -0x21 && text[n] >= -0x40)
{
// 2バイト文字
}
else
{
// 1バイト文字
}