以前よりマイコン液晶で使うフォントを美しく表示してみたかったのでアンチエイリアスについて調べてみました。

S2GPうにフォント
48ピクセルのフォントを4x4でオーバーサンプリングして12ピクセルで表示しています。
去年マイコンにFreeTypeというフォント表示ライブラリを移植しました。
どうしてもTTFやOTFといったアウトラインフォントをマイコン液晶で表示してみたかったのです。
ところがSTM32規模のマイコンには重い処理であったり、大量のメモリを消費するので外付けのSRAMを増設しないといけないものでした。この規模だとやはりビットマップでないと厳しいものがあります。
しかしネットで手に入るマイコン液晶に適したビットマップフォントはそれほど種類が多いわけではなく選択肢が限られてくるので自分でTrueTypeやOpenTypeのフォントをビットマップ形式のものに変換できたらいいなと思っていました。
ありがたいことにそういったツールがありました。
OpenType to BDF Converter(otf2bdf)
http://sofia.nmsu.edu/~mleisher/Software/otf2bdf/
↑TrueTypeやOpenTypeフォントをBDF形式に変換するツール
bdftopcf
http://xjman.dsl.gr.jp/man/man1/bdftopcf.1x.html
http://sourceforge.jp/projects/sfnet_mywolfe/downloads/trunk/bdftopcf-1.0.3.tar.bz2/
↑BDF形式をPCF形式に変換するツール
手順としては、
TTFまたはOTFフォントをotf2bdfを使って一度UnicodeのBDFに変換し、
bdftopcfでBDFからPCFを書き出す。
BDF形式はASCII文字列で構成されているためマイコンで読むには少し不都合なのでバイナリ形式のPCFを使うことにしました。
X11のPCFビットマップフォントファイルのフォーマット
http://fontforge.sourceforge.net/ja/pcf-format.html
↑PCFファイルの読込みはこちらのページが参考になりました。
無事PCFファイルが読み込めるようになったので本題のアンチエイリアスについて。
アンチエイリアスが簡単にできる方法はないかなぁ?と思いぐぐってみるとオーバーサンプリング法というものをみつけました。
どんなものかというとビットマップデータを4x4ピクセルとか8x8ピクセルのサブピクセルで分割し、その中に入っているドットの数で色に濃淡をつけるというものです。

上の画像の例だと8x8のサブピクセルに赤枠で囲まれた部分のドット数を数えてその枠一個分の濃淡レベルを割り出します。(例 9ドットあったら濃淡レベルは9/64)
元のビットマップデータが48x48ピクセルならばこれを上下左右36回サンプリングを繰り返し、それぞれの枠の濃淡レベルから色をつけると縮小されて6x6ピクセルのアンチエイリアスがかかったデータができあがります。
この方法は元のビットマップデータを縮小することで効果を得るため、実際に表示したい大きさより数倍のビットマップフォントを用意します。
下の画像は実際にLCDに描画したものをマイコンからXMODEMで転送して拡大したものです。
LCDはQVGAでRGB565の16ビット色表現です。

元のフォントのビットマップサイズは48x48で、一度内蔵RAMの2次元配列に展開して4x4のサブピクセルでオーバーサンプリングしました。
なので濃淡色は16階調で文字の大きさは12pxです。
結果うまくアンチエイリアスがかかっているようです(^ω^)
ひま字
S2G 殴り書き

S2GPうにフォント
48ピクセルのフォントを4x4でオーバーサンプリングして12ピクセルで表示しています。
去年マイコンにFreeTypeというフォント表示ライブラリを移植しました。
どうしてもTTFやOTFといったアウトラインフォントをマイコン液晶で表示してみたかったのです。
ところがSTM32規模のマイコンには重い処理であったり、大量のメモリを消費するので外付けのSRAMを増設しないといけないものでした。この規模だとやはりビットマップでないと厳しいものがあります。
しかしネットで手に入るマイコン液晶に適したビットマップフォントはそれほど種類が多いわけではなく選択肢が限られてくるので自分でTrueTypeやOpenTypeのフォントをビットマップ形式のものに変換できたらいいなと思っていました。
ありがたいことにそういったツールがありました。
OpenType to BDF Converter(otf2bdf)
http://sofia.nmsu.edu/~mleisher/Software/otf2bdf/
↑TrueTypeやOpenTypeフォントをBDF形式に変換するツール
bdftopcf
http://xjman.dsl.gr.jp/man/man1/bdftopcf.1x.html
http://sourceforge.jp/projects/sfnet_mywolfe/downloads/trunk/bdftopcf-1.0.3.tar.bz2/
↑BDF形式をPCF形式に変換するツール
手順としては、
TTFまたはOTFフォントをotf2bdfを使って一度UnicodeのBDFに変換し、
bdftopcfでBDFからPCFを書き出す。
BDF形式はASCII文字列で構成されているためマイコンで読むには少し不都合なのでバイナリ形式のPCFを使うことにしました。
X11のPCFビットマップフォントファイルのフォーマット
http://fontforge.sourceforge.net/ja/pcf-format.html
↑PCFファイルの読込みはこちらのページが参考になりました。
無事PCFファイルが読み込めるようになったので本題のアンチエイリアスについて。
アンチエイリアスが簡単にできる方法はないかなぁ?と思いぐぐってみるとオーバーサンプリング法というものをみつけました。
どんなものかというとビットマップデータを4x4ピクセルとか8x8ピクセルのサブピクセルで分割し、その中に入っているドットの数で色に濃淡をつけるというものです。

上の画像の例だと8x8のサブピクセルに赤枠で囲まれた部分のドット数を数えてその枠一個分の濃淡レベルを割り出します。(例 9ドットあったら濃淡レベルは9/64)
元のビットマップデータが48x48ピクセルならばこれを上下左右36回サンプリングを繰り返し、それぞれの枠の濃淡レベルから色をつけると縮小されて6x6ピクセルのアンチエイリアスがかかったデータができあがります。
この方法は元のビットマップデータを縮小することで効果を得るため、実際に表示したい大きさより数倍のビットマップフォントを用意します。
下の画像は実際にLCDに描画したものをマイコンからXMODEMで転送して拡大したものです。
LCDはQVGAでRGB565の16ビット色表現です。

元のフォントのビットマップサイズは48x48で、一度内蔵RAMの2次元配列に展開して4x4のサブピクセルでオーバーサンプリングしました。
なので濃淡色は16階調で文字の大きさは12pxです。
結果うまくアンチエイリアスがかかっているようです(^ω^)
いくつかのフォントを表示してみた↓
手書き文字がかわいいです(*´ω`*)
なかなか綺麗にアンチエイリアスがかかったのと思ったり高速で描画できたのでどんどん使っていきたいとおもいます(`・ω・´)ゞ
ひま字
S2G 殴り書き





