マイコン工作実験日記

Microcontroller を用いての工作、実験記録

アンチ・エイリアス表示してみる

2009-08-07 22:45:49 | LCD
MP3での日本語での再生データ表示に向けて、フォントのアンチ・エイリアス表示の実験をしてみました。以前から一度、実験しようと思いつつも、先延ばしにしていたので、ようやくとやってみたという感じです。

これまで、フォントはモノクロのビットマップを使っての表示しかしていませんでした。現在使用しているLCDはRGB565の16bit、65536色での表示が可能なので、中間色を使ってのアンチ・エイリアス表示ができるはずであり、メモリもCPUパワーもあるLPC2388でこれを使わないのももったいないだろうというわけです。FreeType2を使ってIPAフォントを展開していますが、もともとFreeType2はディフォルトで256階調のビットマップを生成してくれるようになっています。これまでは、わざわざモノクロ指定をして使っていたのですが、生成されるビットマップの線が細く感じられたので、さらにボールド指定をして使っていました。

まずはアンチ・エイリアスの効果がどのくらいあるのをかをLinux上で事前に調べておきましょう。FreeType2のパッケージにはftviewというプログラムが付属しており、これを使うことで指定したフォントでの表示のプレビューができます。まずは、アンチ・エイリアスを施さない場合の表示です。対象フォントはIPA GUIでありサイズは13ptです。



次にアンチ・エイリアスを施した場合の表示です。階調表示の効果で全体的にぼやけて柔らかくなった印象を受けますね。



それでは次にLPC2388につなげたLCDに表示しての実験に進みます。モノクロのビットマップでは1ピクセルにつき1ビットのデータ量ですみましたが、アンチ・エイリアスのために256階調のビットマップを生成すると、当然ながらデータ量は8倍に増えます。今回は実験で表示する文字列に相当するビットマップデータだけを生成して、フラッシュに格納することにします。

文字表示の際には前景色と背景色を指定して文字表示をおこないますが、フォントのピクセルデータが0xFFであれば前景色、0x00であれば背景色、それ以外の値であれば階調に応じて前景色と背景色の中間色を計算して表示することになります。フォントデータとしては256階調ありますが、そんなに細かくなくてもいいだろうと思い実際には16階調分の処理しかしないことにしてみました。文字列の表示ルーチンの最初で中間色を計算してテーブルに格納しておきます。各文字を描画する際には、このテーブルを参照してピクセル描画してゆきます。文字列表示ルーチンでは、前回呼ばれた時と前景色/背景色の指定が同じであれば、テーブルのデータが有効であるので、再計算を省きます。

と、まぁ、こんな処理を入れて、LCDに表示した結果がコレ↓です。文字サイズは13ptならびに10ptで、上半分がアンチ・エイリアス無しの場合、下側がありの場合です。