Unicode shaping rules

shaping (文字)

OpenType と shaping

[14] OpenType Layout では shaping によってフォントから探索する文字や適用するべき機能を決定するという想定になっています。 >>13

[15] OpenType で扱うのは低水準 (low-level) 機能だけで、 shaping の詳細は仕様書適用範囲外とされています。 >>13

[20] OpenType は多数の機能を利用可能としていますが、 それら (の lookup) は同時適用もできますし、分けて適用もできます。 どの機能 (の lookup) をどのタイミングで適用するか、 その適用と適用の合間にグリフ列を入れ替える等の操作をするかは、 OpenType 仕様としては定めない (が多くの用字系ではそのような操作が必要となる)、 とされています。 >>19

[16] OpenType フォントファイルに格納されるのは shaping された結果からグリフへの対応関係なので、 外部から与えられたUnicode文字列から shaping された結果への変換方法 (つまり shaping の方法) が決められないことにはフォント相互運用性は保証されないと言わざるを得ません。 つまり OpenType 仕様は相互運用性を半ば放棄しているようです。

[21] OpenType Layout では特定のフォントグリフ固有の情報を機能 / lookup として格納し、言語用字系の共通の情報はフォントに入れずに実装側で持つ、 としています。 >>19 妥当な設計方針でしょう。問題はそれが文字のレンダリングの実装にもフォント開発にも必須の情報なのに仕様外とされていることです。

[17] WindowsUniscribeshaping を実装しています。 Uniscribe独占ソフトウェアですが、その処理の概要は公式サイトに載っていますし、 おおむね The Unicode Standard に従っているようなことが書かれています。 その情報と実在のフォントファイル、それに Windows その他の実装から挙動を推測するしかありません。

Uniscribe の処理モデル

[2] Uniscribe用字系ごとに shaping engine を持っています。 >>1, >>3

[6] また, 特別に対応していない用字系用の OpenType Layout shaping engine も持っています。 >>1

[4] Uniscribe は入力の文字列項目群, 連なり群, クラスター群の3階層に分割します。 連なり

[5] クラスター用字系によって決まる、文字群の基本的な要素です。 >>3 Unicode でいう書記素クラスターに近い単位と思われますが、 同じかどうかは不明。

[7] Uniscribe文字の前処理 (character preprocessing) も行います。 入力 (Unicode文字列) は論理順になっていますが、 前処理でグリフ処理に都合の良い順序に並べ替えます。 具体的には Unicode の規定によります。 >>3

[8] 例えば基底文字の左右に結合文字が表示されるような場合でも Unicode では必ず基底文字が先になりますが、 ここで左、基底文字、右の順序に並べ替えたりすることがあります。

[11] GSUB を駆使すれば文字前処理の並べ替えをしなくてもフォント側でグリフ決定をすべて行うこともできるのでしょうが、 それではフォント開発が大変になるようです。 文字前処理があるのでフォント開発で複雑な条件をたくさん記述しなくてもよいのです >>3

[12] そのかわり Uniscribe 相当の shaping をしていなかった古い実装で shaping 前提のフォントを使っても正しく表示されないのです。

[9] 結果得られたUnicode文字の列が OTLS に渡されます。 適宜機能を適用します。 >>3

[10] 例えばアラビア文字の場合は単語の単位を検出して、 語頭形語中形などを表す機能を各クラスターに適宜指定することになります。

用字系との関係

[26] shaping用字系単位で実装されるようです。 連なり

歴史

[58] タグ文字による指定を character shaping に影響する指定に使える可能性があるとされていました。

メモ

[18] HarfBuzz Manual: HarfBuzz Manual, , https://harfbuzz.github.io/

[24] GitHub - harfbuzz/harfbuzzjs: Providing HarfBuzz shaping library for client/server side JavaScript projects, https://github.com/harfbuzz/harfbuzzjs

[22] GitHub - prezi/harfbuzz-js: JavaScript port of the HarfBuzz OpenType text shaping engine, https://github.com/prezi/harfbuzz-js

[23] GitHub - simoncozens/crowbar: A text shaping debugger, https://github.com/simoncozens/crowbar

[25] Crowbar, , http://www.corvelsoftware.co.uk/crowbar/

[27] GitHub - n8willis/opentype-shaping-documents: Documentation of OpenType shaping behavior, https://github.com/n8willis/opentype-shaping-documents/tree/master