M5EPD 内に FreeType のライブラリが含まれていることが判明したので、
LovyanGFX の IFace のサブクラスを作って TrueType フォントが使えるんじゃない? と思い立ちました。
FreeType のチュートリアルを読んでフォントの読み込み処理を書き始めたら、
もそも M5EPD 自体におんなじコードがあることに気がついて、それどころかズバリ
Function: load TTF font file from file system, support SPIFFS and SD*.
esp_err_t loadFont(String path, fs::FS &ffs)
というメソッドがあることに気がついたのでした。
そういうわけでイケダム時計用の TrueType フォントを作ることに。
作ると言っても文字を起こすわけではなく、既存の TrueType フォントから時計で使う文字だけのサブセットを作るということです。
Google フォントの Noto Mono を使えば、もともと英数字記号だけでファイルサイズも小さくて良さそうだったのだけれど、気温用の「℃」が含まれていないので、Noto Sans CJK JP からサブセットを作ることとしました。
紆余曲折ありながらも、 fontforge を使ってスクリプトでサブセットを作成。
* Noto Mono は ttf ファイルなのに、 NotoSans CJK JP は otf ファイルだった。なぜだ。
* otf ファイルを読み込むと fontforge が大量の警告を出す。なぜだ。
* fontforge が多バイト文字列をちゃんと扱ってくれない。「℃」をバイトごとに扱ってしまう。fontforge の独自スクリプト (pe) じゃなくて、 Python で書いたほうがマシだったかなあ…と思い始めたところで、Ucs4() 関数でちゃんと扱えると判明して解決。
* フォント名を変えようとするも、 SetTTFName() の引数に指定するべき値が分からない。リンク先がリンク切れ。とりあえず SetTTFName() でググって見様見真似で書いてみる。
出来上がったのがこちら:
https://github.com/ikedam/m5paper-ikedamclock/blob/main/font/makesubset.pe