「ENVISION KIT-RX65N」の液晶は480×272サイズもある。
これだけ大きいと、フォントもある程度の大きさが必要だ。
以前は、128×64の白黒液晶用として、6×12、12×12のフォントを使っていたが、480×272の液晶には小さすぎなので、8×16、16×16のフォントを用意した。
※8x12アスキーフォントは自分でデザインしたもの、12×12は東雲12。
用意したのは、「東雲(しののめ)16」フォントで、フリーなビットマップフォントとして知名度が高い。
ただ、BDF形式で配布されている為、組み込み系で使うには、何らかの加工が必要となる。
これらの目的で、「bmc」(ビットマップコンバーター)を公開しているが、コンパイルするには、MSYS2 に色々とツールをインストールしなければならない為、ハードルが高いかもしれない。
※コンパイルの方法は、GitHub のREADME を参照。
※「bmc」は基本、コマンドラインだが、「-pre」オプションを付けるとプレビュー表示できる。
変換は以下のように行う。
(1) 「東雲16フォント」をダウンロード
(2) ASCII フォントのテキストへの変換:
./bmc -bdf -text fonts/japanese-bitmap-fonts-0.4.5/shinonome16/shnm8x16a.bdf fonts.txt
(3) 漢字フォントのバイナリー変換:
./bmc -bdf fonts/japanese-bitmap-fonts-0.4.5/shinonome16/shnmk16.bdf kfont.bin
変換したバイナリーコードへのアクセスは以下のコードを使って行える。
static uint16_t sjis_to_liner_(uint16_t sjis) { uint16_t code; uint8_t up = sjis >> 8; uint8_t lo = sjis & 0xff; if(0x81 <= up && up <= 0x9f) { code = up - 0x81; } else if(0xe0 <= up && up <= 0xef) { code = (0x9f + 1 - 0x81) + up - 0xe0; } else { return 0xffff; } uint16_t loa = (0x7e + 1 - 0x40) + (0xfc + 1 - 0x80); if(0x40 <= lo && lo <= 0x7e) { code *= loa; code += lo - 0x40; } else if(0x80 <= lo && lo <= 0xfc) { code *= loa; code += 0x7e + 1 - 0x40; code += lo - 0x80; } else { return 0xffff; } return code; }
※返った値は正規化されているので、16×16フォントなら32倍すれば、アドレスを得る事が出来る。
※-1(0xffff)が返った場合は範囲外のコード
アスキーフォントは、容量も大きく無いので、コード上に展開しているものの、漢字フォントは16ピクセルだと255Kもあるので、SDカード上に置き、キャッシュしながら描画するようにしている。
※将来的には、ボード上の EEPROM(32Mバイト)に置いておくのが良いだろう。
また、fatfs には、SJIS と UTF-16 の変換テーブルを内臓しているので、通常のコード体系は UTF-8 を使って統一している。
※昨今、SJIS のコード体系を使うのは色々な意味で痛い。
しかしながら、漢字フォントを扱うには SJIS コードの方が、都合が良い部分もある、SJIS だと、フォントをリニアに並べて、アクセスしやすい特性がある。
SJIS のコードを正規化して、簡単に目的のアドレスを計算出来る。
※これが UTF-16 とかだと、広範囲に散っているので、難しい。
とりあえず、東雲16フォントを SJIS 並びにしてまとめたバイナリーファイルを用意してあり、アスキーフォントは、ソースコードに直接展開してある。
※これらは、GitHub にプッシュ済み。
漢字フォントは、テンプレートライブラリになっていて、「typedef」する必要がある。
typedef graphics::kfont<16, 16, 64> KFONT; KFONT kfont_;
※「64」は、キャッシュ数
現在、フォントの描画はソフトで行っているが、RX65N の場合、将来的には、drw2d を使う事になると思うが、ソフトの描画は簡単(速度を気にしなければ)なので、一応必要そうな物をまとめてある。
typedef graphics::font8x16 AFONT; typedef graphics::kfont<16, 16, 64> KFONT; KFONT kfont_; typedef graphics::base<uint16_t, 480,="" 272,="" afont,="" kfont=""> GRAPH; GRAPH graph_(reinterpret_cast<uint16_t*>(0x00000000), kfont_);</uint16_t*></uint16_t,>
アスキーフォントは、ビットマップの実態が必要なので、必要なフォントのソースをリンクする必要がある。
アスキーフォントも「東雲16」だが、プロポーショナル表示用に幅テーブルを用意してあり、それなりに表示出来る。
ただ、元々「等幅」用にデザインされているので、幅の調整は、
「I: -1, i: -2, l: -2」
だけになっているが、無いよりは「マシ」だと思える。