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

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

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

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

![1755325635472](image/README/1755325635472.png)

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

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

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

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

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

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

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

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

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