ぷろみん

プログラミング的な内容を扱ってます

文字がレンダリングされるまで

概要

utf8が普及した昨今でも文字のレンダリングは全然簡単になりません。
その理由を日本語のレンダリングを通して学びましょう。

今回は文字列自体の複雑さにはあまり触れません。
サロゲートペアとかで検索すれば良い解説記事を見つけることができるかと思います。

日本語

日本語のレンダリングを目標とした時に、まず日本語を定義する必要があります。
定義がなければ、日本語文字の画像を全部集めることができません。

十分なプリレンダリング空間が確保できる場合はISO/IEC 8859を選択すれば良いと思います。
それ以外の選択肢はDirectX9を使う必要があり2048x2048のテクスチャしか使えない等の環境要因か、 各ロケールへの最適化等の場合に利用が考えられます。

以下に候補が列挙されています。 http://www.unicode.org/Public/MAPPINGS/

JIS X 0208

一番基礎的な文字セットです。
日本語に対応したと言うには十分ですが、~等の扱いが難しい記号、半角カタカナ、ASCIIを含めない等状況によって加工する必要があるセットです。
最低限の実装には便利ですがunicode.orgからはOBSOLETE扱いされています。

Unicodeの中のJIS X 0208に当たる文字を取得 - 強火で進め

コードページ932

マイクロソフトが使っている基準だから多分大丈夫だろうという選択です。
ただ、Windowsしか考慮していないのでutf16を扱う必要があり嬉しくないことが多いです。

Microsoftコードページ932 - Wikipedia
https://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP932.TXT

ISO/IEC 8859

unicodeで定義される全ての文字を一般的に扱う場合に便利な規格です。
全ての文字に対応していれば日本語にも対応しているだろうというアプローチです。
ただ、その分対応している文字は多岐に渡り全ての文字を簡単な方法でプリレンダリングしておくことは困難です。
日本語の表示という目標に対してのアプローチとしては基本的にオーバースペックです。

フォント

日本語を定義したことで必要なコードポイント一覧が完成しました。
画像を得るためにはコードポイントと関連付けられるデータフォーマットを選択する必要があります。

Apple Advanced Typography(AAT)

Apple Advanced Typography - Wikipedia
上記を見ると「え、もはや文字じゃないよね」って感じのサインのような画像が掲載されています。
文字は文字です。諦めてレンダリングしましょう。

しかし、複雑な文字をレンダリングするとなると複数の実装方法が存在してしまうのは仕方ないことと言えるかもしれません。
AATは文字の変形の役割を果たすシェーピングスクリプトをフォントデータに埋め込む方法をとりました。

OpenType Layout

OpenTypeフォントとも呼ばれたりします。
AATとは違って規格でシェーピングスクリプトまで決まっているようです。
なのでフォントデータは規格を通してシェーピングスクリプトを選択できるので最低限の情報を埋め込むことで目標を達成できます。

TrueType

OpenType Layoutに対応しようという動きもあったようですが、責務が複雑になることを嫌って分化したようです。
おなじみのTTFフォーマットです。
正しい位置にレンダリングするのはレイアウトエンジンの役割でTrueTypeはコードポイントを指定した位置にラスタライズする役割を担います。

レンダリングAPI

フォントのラスタライズまでできたら後はテクスチャに焼いてレンダリングするだけです。
しかし、DirectXOpenGLといったレンダリングAPIはただの出入り口でありプラットフォームとは別の問題です。
MacOSでのVulkanはMetalを使っていますし、Windows10のDirectX9はDirectX11や12を使っています。そして、その中では更にベンダーの固有取り決めを通して役割を果たしているでしょう。

よくある要望としてDirectX9に対応して欲しいというものがありますが、それはDirectX9 APIに対応して欲しいのか、DirectX9対応のデバイス全てに対応して欲しいのかはっきりさせる必要があります。
DirectX9対応のデバイスに対する動作確認環境を用意することは難しい割に対象ユーザがほとんど存在していないのでメリットが少ないです。

以下は私の推測であり、確実な情報ではありません。
動作環境としてはまずWindows Vistaを用意してもらう必要があります。また、DirectX9対応と書かれた最古のGPUも準備する必要があります。
これはXPぐらいからのDirectX9は内部的にDirectX9.1以降を使っていると私が考えているためです。
DirectX9.1/9.2/9.3は公式なバージョニングかは不明ですが、DirectX11以降に設定できるD3D_FEATURE_LEVEL_9_1と対応しています。
これらから生成できる互換スワップチェインは厳密にはDirectX9との互換性がありません。
この互換性がないことについてはMicrosoft公式が言及していたので確実だと思います。

まとめ

DirectX9で日本語表示して欲しいという要望は曖昧過ぎる。

参考

Chromeとかで使われている文字レンダリング技術の作者のサイト
http://behdad.org/text/