text/v2
がやってくる
text
パッケージの問題点
既存の text
パッケージには、次のような問題がありました。
- 一度使われた
font.Face
はキャッシュされ、リリースされない (#498)。 - アラビア語やタイ語などの複雑なレンダリングを必要とする言語をサポートしていない (#675)。
- グリフのベクターデータを取り扱えない (#1937)。
- 右寄せや中央寄せなどのテキストの配置をサポートしていない (#2143)。
- OpenType フォントのフィーチャーやバリアントをサポートしていない (#2454)。
- ハッシュ化できない
font.Face
を取り扱えない (#2669)。
text
パッケージは準標準ライブラリの golang.org/x/image/font
のみを取り扱っていました。このパッケージの Face
インターフェイスがフォントフェイスを表します。このインターフェイスは単純で、 1 コードポイントが決まった 1 グリフに対応することを仮定しています。そのため、アラビア語などの状況によってグリフが変わるような複雑なレンダリングや、 OpenType のフィーチャーなどが利用できませんでした。
text/v2
パッケージはこれらの問題を全て解決します。 text/v2
パッケージは、準標準ライブラリの font.Face
に加えて、新しく github.com/go-text/typesetting
パッケージの実装を使います。 typesetting
パッケージは内部で HarfBuzz を Go に移植したものを使用しており、複雑なレンダリングが可能になっています。また実装だけではなく text
パッケージ の API 設計を根本的に見直すことで、これまでできなかった右寄せや中央寄せを出来るようにしたり、直せなかったリソースリークのバグなどが直せるようになりました。
text/v2
のサンプル
現在開発中のサンプルをいくつか紹介します。
多言語描画
アラビア語、ヒンディー語、ミャンマー語、タイ語などの描画が複雑な言語に加えて、縦書きモンゴル語や縦書き日本語にも対応します。
ベクター
グリフのベクターデータを簡単に取得できるようになります。 vector
パッケージと組み合わせて、例えば文字の輪郭だけを描画するといったことができます。
フィーチャー
フォントフィーチャーを指定して描画することができます。例えば、リガチャの有無や文字ごとのバリエーションを指定できます。
バリアブルフォント
バリアブルフォントを描画することができます。 1 つのフォントファイルから、太さやウェイトを連続した値で指定できます。
今後の予定
既存の text
パッケージはそのままに、新しく v2
がついたパッケージが Ebitengine に追加されます。これは Go 本体の最近の提案で math/rand/v2
が加わろうとしているのと似ています。 text/v2
の正式なパッケージ名は github.com/hajimehoshi/ebiten/v2/text/v2
となり、ちょっと長めの名前です。
Ebitengine のバージョンが 2 である間は、 text
パッケージと text/v2
パッケージが併存します。既存のコードはそのまま動くはずです。新しいコードは text/v2
パッケージを使っていただくことになります。 Ebitengine がバージョン 3 になったときに、 text
パッケージは廃止される可能性があります。
text/v2
は現在鋭意開発中です。 Ebitengine v2.7.0 が出るまで text/v2
の API は変更される可能性があります。