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 = ""