画像は Bing Image Creator より (トラブル防止のため商用利用禁止、無断転載禁止)。
ドラセナ・コンシンネの花言葉は「真実」ですが、バグ探しと回避方法の模索は孤独なものです。真実は眼の前にあるけど暗闇とベールで隠されて脱いだとしても月明かりが眩しくて見えないようです。
おかしいのは Dejavu Sans なのか fontmap.json なのか、あるいはレンダリングエンジンorコンパイラやライブラリなのかよくわからないので検証します。
まず、Meditation で使われているフォントスタイルは
- biglight (Light, 30pt)
- supersizemelight (Bold, 90pt)
- verysmall (Regular, 30pt)
の三種類のみ (カッコ内は fontmap.json の初期値として指定されている Dejavu Sans フォントの装飾とポイント数)。このうち悪さをしているのはsupersizemelight だというのは推測できます。自分の目で確かめたいならこちら。
仮説
Mudita Pureに使われている ED028TC の解像度は 480×600 です。これはモジュールのデータシート以外にも products/PurePhone/config.cmake
の CONFIG_SIMULATOR_DISPLAY_RES_X とCONFIG_SIMULATOR_DISPLAY_RES_Y になどで明記されています(この値を 1280×1024 など大きめの数値に修正してリビルトすれば応急処置はできそうな気もします)
これを超えた範囲にオブジェクトの座標を描画しようとするとオブジェクトのサイズが画面の範囲を超えてクリッピングされず 0, 0 の座標に描かれてしまう不具合なんだろうと思います。もっと商用版とオープンソース版ではフォントが違うんだから細かい部分ところで不具合起こすよねといった感じですかね。フォントが違えば同じポイント数でもピクセル数により幅や高さは変わりますからね。
ちなみに MuditaOS には、
- クリッピング関連のAPIが無いようです(Clip, Clipp, Crop でソースコート検索した限りでは)。
- ウィンドウ描画用?の共有メモリバッファ (SHM:Shared Memory Buffer) はある。
- フレームバッファやカンバスはある。
なんてのを gui-context-drawer.cpp などで見かけたような。
今回の検証方法は該当フォントのサイズを小さくしてみるか、フォールバック機構を利用して全部同じフォントにしてみるというもの。
検証内容
- CONFIG_SIMULATOR_DISPLAY_RES_X とCONFIG_SIMULATOR_DISPLAY_RES_Y の書き換え
- Meditation のソースコート書き換え
- fontmap.json - フォールバック機構の利用
- fontmap.json - フォントサイズの変更
- fontmap.json + Font Builder - カスタムフォントの導入
- システムフォントエイリアスの追加 (module-gui/gui/widgets/Style.cpp, Style.hpp?)
では、実際に検証してみましょう (次回へ続く)。