[実験] Arduino(M5StickC)でefont Unicodeフォント表示 PROGMEM版

/efont/さんのUnicode Fontを利用して、Arduino用のフォントライブラリを作ってみました。

注意

こちらは実験ですので、実際に使う場合には以下のページを参考にしてください。

利用フォント

http://openlab.ring.gr.jp/efont/unicode/

上記のf16.bdfとb16.bdfを利用させていただき、16ピクセルフォントを作成しました。

作成物

https://github.com/tanakamasayuki/efontUTF16progmem

上記にとりあえず置いてみました。

フォントサイズ

対象フォントファイル名フォント容量
UNICODE(BMP)全部1,441,792
フォント無しefontUTF16DisableAll.h0
漢字以外efontUTF16DisableCJK.h507,904
ハングル以外efontUTF16DisableHang.h1,081,344
漢字のみefontUTF16OnlyCJK.h1,007,616
常用漢字のみefontUTF16OnlyMiniJapanese.h753,664

全部入れたところ、1.4Mぐらいになりましたので、少し減らすオプションを作りました。指定ファイルを事前に読み込むことで、対象フォントを絞り込むことができます。

256文字単位で管理しているので、ざっくりとしか間引けませんので常用漢字など飛び飛びでいろんな場所に分散しているものは、1文字単位で読み込んだ方が良さそうです。

実行結果

サンプルコード

#include <M5StickC.h>
#include "efontUTF16progmemM5StickC.h"

void setup() {
  M5.begin();
  M5.Lcd.setRotation(0);
  M5.Lcd.setCursor(0, 0);

  printEfont("Hello", 0, 16*0);
  printEfont("こんにちは", 0, 16*1);
  printEfont("你好", 0, 16*2);
  printEfont("안녕하세요", 0, 16*3);
  printEfont("Доброе утро", 0, 16*4);
  printEfont("Päivää", 0, 16*6);
  printEfont("Здравствуйте", 0, 16*7);
}

void loop() {
}

上記でUNICODE(BMP)全部が読み込まれます。描画部分は端末依存なのでM5StickC以外の端末で使う場合にはefontUTF16progmemM5StickC.h相当の処理を自作してください。

#include <M5StickC.h>
#include "efontUTF16progmemOnlyMiniJapanese.h"
#include "efontUTF16progmemM5StickC.h"

void setup() {
  M5.begin();
  M5.Lcd.setRotation(0);
  M5.Lcd.setCursor(0, 0);

  printEfont("Hello", 0, 16*0);
  printEfont("こんにちは", 0, 16*1);
}

void loop() {
}

常用漢字しか使わないのであれば、上記のようにすればプログラムサイズを減らすことができます。

容量的にはSPIFFSで1.4Mのフォントデータを転送して使うのが楽そうな気がしますのでSPIFFSを使ったバージョンも作ってみたいと思います。

コメントする

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

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