KIT-RX65N、漢字表示

「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,>

RXマイコン・グラフィックス関係

アスキーフォントは、ビットマップの実態が必要なので、必要なフォントのソースをリンクする必要がある。
アスキーフォントも「東雲16」だが、プロポーショナル表示用に幅テーブルを用意してあり、それなりに表示出来る。
ただ、元々「等幅」用にデザインされているので、幅の調整は、
「I: -1, i: -2, l: -2」
だけになっているが、無いよりは「マシ」だと思える。

Renesas ENVISION KIT-RX65N 漢字表示サンプル