FONTX2形式をESP32のmicropythonで扱う
JUGEMテーマ:電子工作
前の記事
https://ameblo.jp/fc2miha/entry-12837059330.html
http://miha.jugem.cc/?eid=366
前の記事でarduinoで日本語表示の準備を書いてましたが、
フォントファイルを扱うという前提で考えた場合、
esp32のマイクロパイソンであれば、ファイルシステムが使えるので、
ファイルの転送も楽ですし、まずは、ESP32のmicropythonでフォントファイルを
使えた方が良いので、そちらから進めることにします。
前回の記事をpythonで書き換えた感じになります。
■フォントファイルの準備
以下のファイル名でFONTをESPのファイル領域に入れておくこと
ILGZ32XF.FNT SJIS
ILGZ16XF.FNT SJIS
ILGH32XF.FNT ANSI
ILGH16XB.FNT ANSI
フォントの入れかたは
ampy -p com4 -d 1 put ILGZ32XF.FNT
とか、com4の所とファイル名の所は書き換えてください。
■実行結果
■プログラム
https://drive.google.com/file/d/1xYPl0iTGT3D7YbjvGF4faPrTCdUnjJCk/view?usp=sharing
以下は抜粋
・ファイルを読み込んでフォントのパラメータを変数に確保
f = open(FONT_FILE, 'rb')
f_sig = f.read(6) #FONTX2と入る
f_name = f.read(8) #フォント名
f_width = f.read(1) #フォント幅 ドット
f_height = f.read(1) #フォント高 ドット
f_code = f.read(1) #文字コード 1=SJIS
f_block_num = f.read(1) #ブロック数
・バイナリのままだと扱いづらいのでintに変換
パイソンはここらへんがメンドクサイ。
width = int.from_bytes(f_width, 'little')
height = int.from_bytes(f_height, 'little')
・フォントファイルがSJISの場合はテーブル作成
block_num = int.from_bytes(f_block_num, 'little')
for i in range(block_num):
f_start = f.read(2)
bs = f_start[1] * 256 + f_start[0]
#
f_end = f.read(2)
be = f_end[1] * 256 + f_end[0]
#
block_start.append(bs);
block_end.append(be);
for i in range(block_num):
print(hex(block_start[i])+"-"+hex(block_end[i]))
・フォントファイル中のフォントの位置を特定
char_count = 0
exist_flag = 0
for i in range(block_num):
if block_start[i] <= code and code <= block_end[i] :
char_count = char_count + (code - block_start[i])
exist_flag = 1
break
else :
char_count = char_count + (block_end[i] - block_start[i]) + 1;
font_size = int((width + 7) / 8) * height
seek_point = 18 + 4 * block_num + char_count * font_size
print(font_size)
print(seek_point)
・再オープンしてseekし1フォント読み込み
f = open(FONT_FILE, 'rb')
f.seek(seek_point)
font_buf = f.read(font_size)
f.close()
・フォントのビット列を判定して表示
str = ""
for i in range(font_size):
bit = font_buf[i];
for b in range(8) :
if bit & 128:
str = str + "■"
else :
str = str + " "
bit = bit << 1;
if ((i+1) % int((width + 7) / 8) == 0) :
print(str)
str = ""