😺

ImGui で日本語と記号♥と絵文字😺の表示

2022/07/19に公開

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]


脚注
  1. glyph_ranges の範囲指定は存在しないフォントは無視されるので、あまり綿密にしなくてもよさそうな感じです。 ↩︎

  2. 同じフォントサイズを指定してもフォントファイルごとに実際の大きさは違ったりするので、そのへんの調整は必要になります。 ↩︎

  3. 2つ目以降のフォントファイルの範囲が重なるとき、同じ文字があると先に登録したフォントが採用されるので、一部を変えたい場合は glpyh_range を細かく設定すればよさそうです。 ↩︎

Discussion