|
4 주 전 | |
---|---|---|
.. | ||
.vscode | 4 주 전 | |
image | 4 주 전 | |
.gitignore | 4 주 전 | |
CMakeLists.txt | 4 주 전 | |
README.md | 4 주 전 | |
jpfont_test.cpp | 4 주 전 | |
pfnfont.cpp | 4 주 전 | |
pfnfont.h | 4 주 전 | |
pico_sdk_import.cmake | 4 주 전 | |
shnmk12u.pfn | 4 주 전 | |
shnmk14u.pfn | 4 주 전 | |
shnmk16u.pfn | 4 주 전 |
書籍に掲載する予定でしたが、時間切れで掲載できなかったコードです。これは日本語フォントファイルであるPinot Font(PFN)フォーマットのフォントを使って日本語文字描画を行うためのライブラリpfnfont.h/pfnfont.cppと、そのテスト用コードで構成されています。
Pinot Font(PFN)フォーマットについてはリンク先に説明がありますが、フォントグリフをUTF-32コードポイント並びに変換した日本語ビットマップフォントです。従来の日本語フォントは文字コードにJISなどが使われていて扱いが少々厄介ですが、PFNフォントは現在主流のUTF-8環境で簡単かつ高速に扱うことができ、Picoシリーズで日本語を表示させるのにも便利です。ご本家はMicroPython向けですが、C++でPFNフォントを扱うライブラリを作成しました。
Picoでデバッグ実行すると、次のようにコンソールに「Picoで日本語表示」という文字列がアスキーアートで表示されます。
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);