概要
組み込みデバイス上の fonts は、コンピューター上の fonts とは少し違います。このガイドではその理由を説明し、PicoPixel で fonts を作成する流れを案内します。bundled font の選択や自分の font のアップロード、Arabic や Hebrew のような right-to-left languages の扱い、Chinese、Japanese、Korean で使われる非常に大きな fonts の管理まで扱います。最後に、試行錯誤のあとに便利な整理機能も紹介します。
なぜ fonts は変換が必要?
ノート PC では、.ttf や .otf のような font file は各文字を数学的な曲線として表現します。コンピューターには十分な処理能力とメモリがあるため、任意のサイズでその曲線を滑らかに描けます。
小さなデバイス(ESP32、smartwatch chip、小型 display controller)は通常それができません。曲線をその場で再描画するメモリや処理能力が足りません。そこで LVGL は別の方法を使います。曲線ではなく、固定サイズで事前に描いた小さな画像(bitmap)として各文字を保存します。これはデバイスにとってずっと軽い方法です。
PicoPixel はこの変換を行います。font を作成すると、元の font file を取得し、LVGL が必要とする bitmap format に変換します。必要な letters と sizes だけを選びます。
各文字は固定サイズで事前描画されるため、変換済みの LVGL font は選んだサイズに固定されます。16px font を 32px に引き伸ばしてもシャープには見えません。2 つのサイズで文字が必要なら、両方のサイズで font を作成します(下の Creating a font では複数 sizes を一度に選べます)。
このため fonts にはデバイス上で実際のコストがあります。各文字、各サイズが少しずつメモリを使います。このガイドの多くは、そのコストを小さく保つこと、つまり実際に使う characters と sizes だけを含めることについてです。
Bundled fonts と自分の fonts
font を作成するとき、開始点は 2 つあります。
- Bundled、人気があり、よくテストされた fonts の厳選セットです。Noto Sans、Roboto、Open Sans、Montserrat、Poppins、Inter、Lato、Nunito、Source Sans 3 などがすぐ使えます。安全で良いデフォルトです。
- Upload、自分の
.ttfまたは.otfファイルを持ち込みます。特定の brand font がある場合や、bundled fonts が対応しない言語を扱う場合に使います。
自分の font をアップロードする場合は、Roboto-VariableFont.ttf のような "variable" font file ではなく、Roboto-Regular.ttf のような static font file を使ってください。static files の方がはるかに安定して変換できます。通常の .ttf ファイルが最も扱いやすいです。
どちらを選んでも live preview があり、自分の文字を入力して作成前に見た目を確認できます。
font を作成する
Create Font panel を開くと短いフォームがあります。各部分の役割は次の通りです。
- Pick your font、Bundled font(Regular や Bold などの weight も)を選ぶか、Upload tab に切り替えて自分のファイルを選択します。
- Font Name、プロジェクトの font list に表示される名前です。複数使うなら特に、覚えやすい名前を付けます。
- Size (px)、font の pixel size です。複数サイズを一度に選べます(16、22、32 などの便利な presets があります)。各 size は別々に生成されるので、本当に使うものだけ選びます。
- Letters、含める character set を選びます。Standard(basic English)、Latin、Greek、Cyrillic、Hebrew、Arabic、Thai などです。必要な言語の letters を PicoPixel に伝える場所です。
- Asian、Chinese、Japanese、Korean 用の別オプションです。特殊な扱いが必要で、下の its own section で説明します。
細かな調整用の Advanced エリアもあります。Bits per Pixel(各文字に使う灰色の階調数。高いほど滑らかですが容量を使います。4 が良いデフォルト)や、正確な character ranges または symbols を手入力する fields があります。ほとんどの人は触る必要がありません。
すべての font がすべての言語を含むわけではありません。non-Latin script を選んで preview に文字ではなく空の箱が表示される場合、その font は対応していません。その script 用に作られた Bundled font に切り替えるか、対応する font をアップロードしてください。すべての fonts が対応しない script を選ぶと、PicoPixel が警告します。
Right-to-left scripts:Arabic & Hebrew
Arabic や Hebrew のような言語は右から左に読み、文字にも特殊な処理が必要です。幸い、Create Font panel で直接設定できます。手作業の設定は不要です。
- Letters dropdown で Arabic または Hebrew を選びます。これが重要な手順です。その script に必要な正しい character set を含めるよう PicoPixel に伝えます(basic English letters も一緒に含まれるため、numbers や Latin text も使えます)。
- PicoPixel はその script 向けに作られた font、たとえば Noto Sans Arabic を提案します。普通の Latin font では文字が含まれないため、提案されたもの(または script-aware font)を使ってください。
- live preview を確認します。そこで文字が正しく表示されれば問題ありません。箱が見える場合は、その font が script に対応していないので別のものを選びます。
Arabic letters は単語内の位置によって形が変わり、行全体も右から左に流れます。プロジェクトを書き出すと、PicoPixel は Arabic、Persian、Hebrew text の使用を自動検出し、接続文字形に必要な LVGL 設定をオンにします。デバイスで正しく見せるために設定ファイルを掘る必要はありません。
覚えておくべき重要点は、font 作成時に Letters dropdown で Arabic または Hebrew を選ぶことで、その characters が含まれるということです。先に plain font を作り、後から right-to-left text を追加しても文字は入りません。最初から正しい script を選んで font を作成してください。
Chinese, Japanese & Korean
CJK は Chinese、Japanese、Korean の略です。これらの言語は characters が非常に多いため特別です。Korean は約 11,000、Chinese は 20,000 を大きく超えます。各 character は事前に描画され、デバイスに保存されることを思い出してください。CJK font 全体を含めると数メガバイトになり、多くの組み込みデバイスには入りません。
解決策は、実際に使う characters だけを含めることです。一般的なインターフェースでは、表示する異なる characters は 100 個前後で済むことが多く、比較すると非常に小さくなります。
手順は次の通りです。
- Asian dropdown で Korean、Chinese、または Japanese を選びます。
- Symbols field(Advanced エリア内)を見つけ、インターフェースに実際に表示される文字を貼り付けます。すべての label、button、message を含めてください。PicoPixel はそこに見つけた各 character だけに glyph を含めます。
- 始めやすいように、PicoPixel は選択した言語の一般的な UI 用語("Settings"、"Confirm"、"Cancel" など)をこの field に事前入力します。自分の文字を追加してください。
これにより、数メガバイトになり得た font が、数百キロバイトで済むことがあります。
Symbols に列挙した characters だけが含まれます。後でインターフェースが追加していない character を表示すると、空の箱になります。テキストが変わったら Symbols field を更新し、font を作り直してください。
CJK では、汎用 font に頼るより、使いたい specific font をアップロードすると最も制御できます。インターフェース全文の完成版を貼り付けると、漏れを防げます。
整理:未使用 fonts を削除する
Fonts は容量を使い、試しているうちに不要なものが溜まりがちです。たとえば 16px と 22px のどちらがよいか分からず両方作って試すことがあります。決めた後、もう一方は余分な重みです。
PicoPixel ではこれが簡単です。assets の Fonts エリアに Delete Unused Fonts ボタンがあります。プロジェクト内のすべての widget をスキャンし、実際に何も使っていない fonts を見つけて、ワンクリックで削除します。不要なものを片付け、必要な fonts のための容量を空けられます。
サイズを試す簡単な方法です。いくつか sizes を作り、デザインに合うものを確認し、Delete Unused Fonts を押して残りを整理します。リストの各 font には size と quality settings が表示されるので、何があるか一目で分かります。
"Delete Unused Fonts" はどの widget からも参照されていない fonts だけを削除するため、デザインは変わりません。リストで単一の font を右クリックして自分で削除することもできます。誤って削除しても undo ですぐ戻せます。