LCD用ビットマップデータ変換

LCD などを使った機器では、文字や、グラフィックスなど比較的小さい物を扱う事が出来れば便利です。
AVR マイコンなどに LCD を繋いだ場合は、小さな絵をデータ化して、プログラム領域に置いておき、描画したいものです。

そんな時、手頃な変換ツールがあれば便利なので、OpenGL(GLFW3)の一環として作ってみました。
※OpenGL はプレビューの描画にしか使っていないので、通常動作では、コマンドラインで行い、GUI は簡単なプレビューを助ける程度しかありません。

また、「漢字」を表示させたい用途もあります、自分のライブラリーは、FreeType2 を持っているので、TrueType フォントの描画も出来ますが、ライセンスの問題や、LCD のような低解像度で単色では、フリーで流通している BDF 形式を扱えたら便利です、そこで、BDF フォントファイルを読み込んで、変換する機能も入れてみました。
SJIS の漢字コードをおおよそいれると、12ピクセルのフォントでも156キロバイト必要です、通常は外部にEEPROM(2メガビット必要)を接続して、そこにデータを置く必要がありますが、SD-CARD のインターフェースがあれば、そこから必要なフォントをキャッシュすれば、かなり実用的な速度で描画する事も可能です。

※ビットマップの絵や自分フォントなどをデザインする場合には、自分は「edge」と言うフリーソフトを使っています、小回りが利いて、ドット絵をデザインするには便利なソフトです。

--

この変換ツールは、画像ファイルとして以下のフォーマットをサポートしています。
bmp,png,jpeg,jpeg2000,tga
※gif はあえてサポートしていません。

ファイル出力は、バイナリーか、C ソース用のテキスト出力を選択出来ます。
他に細かいオプションがあります。

出力は、ビットストリームで、行われます、展開する場合は、単純にLSBから1ビットづつアクセスして、順番に描画すればよく、サイズと速度で合理的と思えます。
出力はバイト単位で行われる為、余ったビットは0で埋められます。
※ AVR の描画サンプルが github にあります。

ソースコード、実行ファイルをgithubで公開しています。
※DLL は player/build からコピーして下さい。

コマンドを実行すると、以下のように簡単なヘルプが表示されます。

BitMap Converter
Copyright (C) 2013, Hiramatsu Kunihito
Version 0.50
usage:
    bmc.exe [options] in-file [out-file]
    -preview,-pre     preview image (OpenGL)
    -header size      output header
    -text             text base output
    -c-style symbol   C style table output
    -offset x,y       offset location
    -clip       x,y        clipping area
    -bdf              BDF file input
    -append           append file
    -inverse          inverse mono color
    -dither           ditherring
    -verbose          verbose

※英語表記がかなりいい加減です・・・

・「-preview」は、変換後に画像をプレビューします。
・「-no-header」は、通常画像のサイズ、又は切り出した場合、そのサイズを、横、縦2バイト出力しますが、それを抑止します、サイズが同じ物を連続して出力する場合などに使います。
※サイズが256バイトを超えると問題が起こります、ソースコードもありますから必要なら機能追加して下さい。

・「-header size」は、ヘッダー情報としてサイズを出力します、「size」は、ビット幅です。
・「-text」は、ソースコードに取り込めるようにした16進形式の羅列です。
・「-c-style symbol」は、uint8_t の配列として、シンボル名を含めて出力します。
・「offset x,y」はソース画像を切り出す場合のオフセットです。
・「clip x,y」は、ソース画像を切り出すサイズを指定します。
※これら、「x,y」のパラメーターは、一般的な数値計算を受け付けます。(Ex: 16*5,24*3)
・「-bdf」は、BDF 形式のファイルを入力する場合です。
※BDF 形式でのプレビューは限定的ですが、これは仕様です。
・「-append」は、出力ファイルに追加で出力する場合に指定します。
・「-inverse」はピクセルを反転します。
・「-dither」はディザリング処理を行います。
・「-verbose」は、内部情報を出力します。

※PNGファイルの変換とプレビュー

bmc -pre images/matrix_font.png out

bmc00

※BDFフォント(warabi12 フォント)の変換とプレビュー

/bmc -pre -bdf bdf/warabi12-0.19a/warabi12-1.bdf kfont12.bin

bmc_02

BDF の漢字ビットマップの出力では、SJIS並びとなっています、合理的に並べられ、SJISコードから漢字のビットマップをアドレスするのが容易な為ですが、文字コードはUTF8 を使う必要もあり、結局相互に変換を行う必要性は免れません・・・

また、SJIS をリニアアドレスに変換する場合は、以下のコードを参考にして下さい。

    // sjis コードをリニア表に変換するサンプル。
    // 上位バイト: 0x81 to 0x9f, 0xe0 to 0xef
    // 下位バイト: 0x40 to 0x7e, 0x80 to 0xfc
    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;
        }
        int 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;
    }

※ディザリング処理の場合(2013年11月21日機能追加)
DitherTest

※BDF フォントの読み込み時、プレビューを修正(2013年11月24日)
bmc_03