グラフィックLCD用フォントの作成

カテゴリー: ソフトウェア  タグ:

正確には、グラフィックLCDに独自フォントを埋め込むためのソースファイルをビットマップから変換するプログラムと、そのビットマップファイルを既存フォントから作成した記録をまとめたものです。

フォントを選ぶ。「RoundedM+」がカッコよい

アスキーコードで0x20から0x7fまでの英数字記号です。当然フォントには漢字も含まれるので力業で漢字も可能です。フォントをドットマトリクス化する段階で原形は崩れていきますが、縦48ドットにもなるとアウトラインが鮮明になります。フォントによって厳密なライセンスが存在するので、「SILオープンフォントライセンス」の「RoundedM+」にしました。フォントのライセンスから、


これらのフォントはフリー(自由な)ソフトウエアです。
あらゆる改変の有無に関わらず、また商業的な利用であっても、自由にご利用、
複製、再配布することができますが、全て無保証とさせていただきます。


 

Paint等でフォントをビットマップ描画し整形する

自動変換するわけではなく、サイズに収まるように手動で調整する地味な作業です。今回のフォントは縦が8ビット単位です。

1.目的の「RoundedM+」フォントをインストールし、まず「ペイント」で二値化bmp(これ大切!)にして文字挿入します。縦32ビットなら40数ピクセルサイズになるようにフォントサイズを調整します。

2.アスキーコードの0x20から「 !”#$%&’・・・」と0x7fまですべて入力して一旦大きめサイズのビットマップを作成します。「ペイント」はレイヤ操作できないので「paint.net」に移行します。たまたまペイントで始めたのでこうなりましたが、最初からpaint.netでも可能です。

3.「paint.net」で背景レイヤを薄色でフォントサイズ枠にして、描画レイヤを操作し一文字ずつ枠に収まるように編集。@やWは枠からはみ出るので苦労しますが、時間を忘れ一番楽しい作業です。

4.一通り枠に収まったら、プロポーショナル文字(iやlなど幅の狭い文字)用に一番上の行に黒ドットを入れておきます。今回、数字は値で表示幅を変えたくないので’1’も’0’も同じ幅です。

5.bmpファイルサイズは横:フォント横サイズ×16、縦:フォント縦サイズ×6にサイズ変更します(これは重要)。例えば下図の32×24フォントではbmpサイズW384H192です。

6.bmpファイルとして出力します。

paint.netで編集中。水色枠は背景レイヤ
完成した32×24サイズフォントbmpファイル

ソースデータに変換。C#で変換アプリ

AQM1248A用は自作表示ドライバ、ILI9341用はmbed用の「UniGraphic」ライブラリを使います。どちらも8bit単位のデータを並べて図形データとして文字を表示するものですが、データの順番が違います。グラフィックLCDのライブラリはいろいろ公開されていますがフォーマットはみな違うようです。

AQM1248A:横(x軸)方向はオートアドレスインクリメントが使えるので、横方向連続データ優先です。一文字あたり横ドットの連続データを縦バイト(例えば32ドットなら32/8=4)倍したデータ配列になります。

ILI9341UniGraphicライブラリ:最初に4byteのヘッダ(総byte数、横pixel、縦pixel、縦byte数)が付き、各文字の最初にプロポーショナル位置情報、続けて縦方向にデータが進みます。

アプリはVS2019で上記二種類専用に作りました。ソースも一緒にGitHubにしばらく格納します。

 

アプリイメージ

使い方は、AQM用かUniGraphic用かチェックボタンでセット後、「FileRead & Convert」ボタンでbmpファイルを読み込むと変換開始し、「textファイル書き出し」ボタンでソースを書き出します。

ビットマップ編集時、ディザリングなどで中間色が入り込んだ場合に備えて、bmpを二値化してから変換するようにしています。

書き出されたソースの一部、

AQM用

const	unsigned char	fontRoundMp_32x24[96][4][24] = {
	{
		{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
		{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
		{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
		{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}
	},
	{
		{0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xF0, 0xF8, 0xF8, 0xF8, 0xF0, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
		{0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
		{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x1F, 0x1F, 0x1F, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
		{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x1F, 0x1F, 0x1F, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}
	},
	{

・
・
・

UniGraphic用

const	unsigned char	fontRoundMp_32x24[] __attribute__((aligned (2))) = {
	97, 24, 32, 4,    // キャラクタ情報ヘッダ
	0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
	0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x07,0x00,0x00,0xF0,0xFF,0x07,0x0E,0xF8,0xFF,0x1F,0x1F,0xF8,0xFF,0x1F,0x1F,0xF8,0xFF,0x1F,0x1F,0xF0,0xFF,0x07,0x0E,0xE0,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
	0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0xFC,0x07,0x00,0x00,0xFE,0x07,0x00,0x00,0xFE,0x07,0x00,0x00,0xFC,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x03,0x00,0x00,0xFE,0x07,0x00,0x00,0xFE,0x07,0x00,0x00,0xFC,0x07,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
	0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x06,0x78,0x00,0x00,0x0F,0x78,0x0E,0x00,0x0F,0xF8,0x1F,0x00,0xCF,0xFF,0x1F,0x00,0xFF,0xFF,0x1F,0xF0,0xFF,0xFF,0x07,0xF8,0xFF,0x7F,0x00,0xF8,0xFF,0x79,0x00,0xF8,0x0F,0x78,0x00,0x10,0x0F,0x78,0x0C,0x00,0x0F,0xF8,0x1F,0x00,0xCF,0xFF,0x1F,0x00,0xFF,0xFF,0x1F,0xF0,0xFF,0xFF,0x0F,0xF8,0xFF,0x7F,0x00,0xF8,0xFF,0x7B,0x00,0xF8,0x0F,0x78,0x00,0x30,0x0F,0x30,0x00,0x00,0x0F,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
・
・
・

自前フォント(?)が思惑通り表示されると楽しいです。

お気軽にコメントをどうぞ。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)