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 は変更される可能性があります。