Satoshi Yoneda 972006f390 add jpfont_2_lcd 3 주 전
..
.vscode aabbbf42d3 add jpfont_test 4 주 전
image aabbbf42d3 add jpfont_test 4 주 전
.gitignore aabbbf42d3 add jpfont_test 4 주 전
CMakeLists.txt aabbbf42d3 add jpfont_test 4 주 전
README.md aabbbf42d3 add jpfont_test 4 주 전
jpfont_test.cpp aabbbf42d3 add jpfont_test 4 주 전
pfnfont.cpp 972006f390 add jpfont_2_lcd 3 주 전
pfnfont.h 972006f390 add jpfont_2_lcd 3 주 전
pico_sdk_import.cmake aabbbf42d3 add jpfont_test 4 주 전
shnmk12u.pfn aabbbf42d3 add jpfont_test 4 주 전
shnmk14u.pfn aabbbf42d3 add jpfont_test 4 주 전
shnmk16u.pfn aabbbf42d3 add jpfont_test 4 주 전

README.md

Pinot Font (PFN) フォントライブラリ

書籍に掲載する予定でしたが、時間切れで掲載できなかったコードです。これは日本語フォントファイルであるPinot Font(PFN)フォーマットのフォントを使って日本語文字描画を行うためのライブラリpfnfont.h/pfnfont.cppと、そのテスト用コードで構成されています。

Pinot Font(PFN)フォーマットについてはリンク先に説明がありますが、フォントグリフをUTF-32コードポイント並びに変換した日本語ビットマップフォントです。従来の日本語フォントは文字コードにJISなどが使われていて扱いが少々厄介ですが、PFNフォントは現在主流のUTF-8環境で簡単かつ高速に扱うことができ、Picoシリーズで日本語を表示させるのにも便利です。ご本家はMicroPython向けですが、C++でPFNフォントを扱うライブラリを作成しました。

Picoでデバッグ実行すると、次のようにコンソールに「Picoで日本語表示」という文字列がアスキーアートで表示されます。

1755325635472

PFNFontクラスを使うには、何らかの方法でメモリに読み込んだPFNフォントと、コールバック関数が必要です。このサンプルでは.incbinを使って14ドットフォントをメモリ中に置いています。

コールバック関数は3つの引数を取り、渡された1文字のフォントグリフを描画する関数を作成します。描画する先は通常はLCDやOLEDになるでしょう。

void your_callback(font_gryph_t font, int x, int y);

フォントのビットマップはfont_gryph_t fontに次のように格納されています。

typedef struct __attribute__((packed)) {
    uint8_t     width;          // フォントの幅
    uint8_t     height;         // フォントの高さ
    uint8_t     *bitmap;        // フォントのビットマップ
} font_gryph_t;

xおよびyは必要に応じて利用するディスプレイ上でのフォントの描画座標が格納されています。

PFNFont *pfn = new PFNFont(フォントデータの先頭アドレス, フォントデータのサイズ, コールバック関数);

次のようにdraw_string()を呼ぶと1文字ごとに(ここまでの例なら)your_callback()が呼ばれます。your_callback()を利用したい表示デバイスに合わせて記述すれば、どんなディスプレイにも日本語が表示できます。

pfn->draw_string("Picoで日本語表示!", 0, 0);