ImGui で日本語と記号♥と絵文字😺の表示
Windows/VC++ にてUTF8設定で ImGui のデモを触ってみて日本語表示。
example_win32_directx??/main.c で、
//ImFont* font = io.Fonts->AddFontFromFileTTF("c:\Windows\Fonts\ArialUni.ttf", 18.0f, NULL, io.Fonts->GetGlyphRangesJapanese());
コメント外して、ArialUni.ttf がなかったから meiryo.ttc にしてみたら日本語表示できたけれど、♥とかを使うと?になります。
♥は JIS全角範囲外の UNICODE 文字(0x2665)ですが、UNICODE な表示環境なのに何故に?
と、 io.Fonts->GetGlyphRangesJapanese() の指定で、JIS 範囲に制限されている模様。
お試しでざっくり文字範囲を増やして、[1]
static ImWchar const glyph_ranges[] = {
0x0020, 0xfffd,
0,
};
ImFont* font = io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\meiryo.ttc", 18.0f, NULL, glyph_ranges);
などとすると♥も表示されるようになりました。
しかし、0x10000,0x1fffe, のような 0x10000 以上の範囲を追加しても、𐌀とか😺とか 0x10000 台の文字が表示されません。
絵文字はともかく 𐌀も meiryo に入っていないのかな?
ImGui は stb_truetype.h で os api 使わず処理しているようで、Windows のように勝手に交代フォント表示しないでしょうし……
よくみると、設定すれば別フォントを混ぜることが出来るみたいで、
ImFontConfig imFontConfig;
imFontConfig.OversampleH = 1;
imFontConfig.OversampleV = 1;
imFontConfig.PixelSnapH = true;
imFontConfig.SizePixels = 18;
imFontConfig.MergeMode = true; // ★
static ImWchar const glyph_ranges2[] = {
0x10000, 0x1ffff,
0,
};
font = io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\seguiemj.ttf", 18.0f, &imFontConfig, glyph_ranges2);
のように絵文字フォントファイルの設定を追加、ImFontConfig引数をデフォルトに任せず設定で MergeMode=true にしてフォントのマージを有効にすると、ちゃんと 😺 は表示されるようになりました。
𐌀の文字は?のままですが、meiryo に 0x10000 以降の文字がなくて表示されないだけなのでしょう。ImGui 側で文字コード 0x10000 以上は駄目とかの制限は無さそうです。
ということで、容量は使いますが、表示したい文字の入ったフォントファイルを一通り AddFontFromFileTTF で登録すればよさそうなのでした。[2] [3]
Discussion