シリア語 / モンゴル語 / デーヴァナーガリー文字 シェーピングサポート

マルチスクリプト機能サーフェス (v2.119.53 - v2.119.55)

 

アラビア文字シェーピング  自動シェーピングパイプライン  GSUB エンジン

HotPDF は Arabic 以外の 3 つの complex scripts、Syriac (U+0700-U+074F)、Mongolian (U+1800-U+18AF)、Devanagari (U+0900-U+097F) 向けに、joining-class / positional-analysis / Indic syllabic-category capability surfaces を公開します。各 capability により、caller は既存の OpenType GSUB engine を通じて script を正しく shape できます。一方で cluster boundary detection、BiDi resolution、GPOS positioning などの heavy lifting は HotPDF の scope 外に保たれます

 

シリア語のシェーピング機能 (v2.119.53)

シリア語の結合の動作を公開する2つの新しいメソッドがあります。

 

function GetSyriacJoiningClass(CP: Cardinal): TJoiningClass;

function GetSyriacPosition(const Run: array of Cardinal; Index: Integer): TPosition;

 

シリア語はアラビア語と同じ、右結合 / 両側結合 / 透過 / 非結合 の4つのクラスのフレームワークに従います。GetSyriacJoiningClass は、Unicodeの結合プロパティに従って U+0700-U+074F ブロック内の各コードポイントを分類します。GetSyriacPosition はシリア語のランをたどり、隣接する文字の結合クラスに基づいて、各文字を独立形 / 語頭形 / 語中形 / 語尾形の位置に解決します。

 

アラビア語とは異なり、シリア語ブロックにはUnicodeに事前にエンコードされた表示形がありません - U+FB50-FDFF / U+FE70-FEFC アラビア表示形ブロックに相当するシリア語のものはありません。したがって、コンシューマーは、コードポイントの書き換えではなく、フォントで定義されたGSUBルックアップ(通常は init / medi / fina / isol + rlig)を通じてシリア語のシェーピングを推進する必要があります。上記の機能レイヤーは、呼び出し元に、各グリフに適切なGSUB機能を照会するために必要な位置ラベルを提供します。

 

モンゴル語のシェーピング機能 (v2.119.54)

モンゴル語用の2つの並行メソッドがあります。

 

function GetMongolianJoiningClass(CP: Cardinal): TJoiningClass;

function GetMongolianPosition(const Run: array of Cardinal; Index: Integer): TPosition;

 

カバレッジには、基本モンゴル文字(U+1820-U+1842)、トド文字(U+1843-U+1877)、シベ文字(U+1880-U+18A8)、満州文字、およびアリガリ拡張が含まれます。異体字セレクタ FVS1 / FVS2 / FVS3 (U+180B-U+180D)、ソフトハイフン NIRUGU (U+180A)、およびアリガリ母音記号はすべて透過 (T クラス) に分類されるため、歩みを止めることなく結合に参加します。

 

シリア語と同様に、モンゴル語にはUnicodeに事前にエンコードされた表示形がありません。モンゴル語の伝統的な縦書きレイアウト、複雑な文字形状のバリエーションのルール、およびFVSによる形状選択はすべて、フォントで定義されたGSUBルックアップ(通常は init / medi / fina / isol + ccmp / rlig / locl)によって駆動されることが期待されています。機能レイヤーは、呼び出し元に、それらの機能を照会するために必要な位置ラベルを提供します。

 

デーヴァナーガリー文字のインド系シェーピング機能 (v2.119.55)

デーヴァナーガリー文字はアラビア語 / シリア語 / モンゴル語とは根本的に異なります。これは、意味のある単位が1つの文字ではなく音節クラスター(アクシャラ)であるインド系のアブギダ文字であり、クラスター内のグリフのレンダリング順序は、論理的なUnicodeの順序とは異なることがよくあります。2つのメソッドがデーヴァナーガリー文字のインド系機能レイヤーを公開します。

 

function GetDevanagariCategory(CP: Cardinal): TIndicCategory;

procedure ApplyDevanagariReorder(var Run: array of Cardinal);

 

GetDevanagariCategory は、U+0900-U+097F 内の各コードポイントを13のインド系音節カテゴリ(ベース / 子音 / 母音 / 独立母音 / 母音記号 / 前置ベースマトラ / 上部ベースマトラ / 下部ベースマトラ / ハラント・ヴィラーマ / Repha / アヌスヴァーラ / ヴィサルガ / その他)のいずれかに分類するため、呼び出し元は音節の境界を検出し、各クラスター内のどの位置で並べ替えが必要かを特定できます。

 

ApplyDevanagariReorder は、入力ランをたどり、2つの主要なデーヴァナーガリー文字の並べ替えルールを適用するプレパスです。(1)Repha(音節クラスターの先頭にある Ra + Halant)は、クラスターのベース子音の後の位置に移動されるため、上付きのフックとしてレンダリングされます。(2)前置ベースの I-matra(U+093F DEVANAGARI VOWEL SIGN I)は、クラスターのベース子音の前に移動されるため、左側のフックとしてレンダリングされます。その他のインド系文字の並べ替え(上部ベースマトラ、下部ベースマトラ、結合文字の形成)は、フォント固有のルックアップテーブルが必要なため、フォントのGSUBエンジンに任されます。

 

自動統合 (v2.119.67): PDF.ShapingFeaturessfIndicShaping が含まれる場合、ApplyDevanagariReorder は 3 つの BuildUnicode*FieldContent helpers 内で pre-pass として自動適用されます。consumer reader の GSUB engine はその後、正しい順序の syllable を受け取り、自身の contextual shaping rules を適用します。自動シェーピングパイプライン を参照してください

 

一般的なワークフロー (シリア語)

 

PDF.RegisterUnicodeTTF('Estrangelo', 'SyrCOMEdessa.otf');

PDF.SetGSUBScript('syrc');  // see GSUB engine doc

for i := 0 to Length(Run) - 1 do

begin

  Pos := PDF.GetSyriacPosition(Run, i);  // init / medi / fina / isol

  // query GSUB for the position-appropriate substitute glyph

  // emit + MarkUnicodeGlyphUsed

end;

 

一般的なワークフロー (自動並べ替え付きのデーヴァナーガリー文字)

 

PDF.RegisterUnicodeTTF('NotoDeva', 'NotoSansDevanagari-Regular.ttf');

PDF.ShapingFeatures := [sfIndicShaping];  // auto Repha + I-matra reorder

PDF.CurrentPage.SetFont('NotoDeva', [], 14);

PDF.CurrentPage.UnicodeTextOut(50, 700, 0,

  UnicodeString(#$0939#$093F#$0928#$094D#$0926#$0940)); // "Hindi"

 

Unicode サブセットと抽出のヘルパー

RegisterToUnicodeReverseMapping は、シェーピングされた出力または合成されたグリフ出力のソースコードポイントを記録します。ClearToUnicodeReverseMappings はテーブルをリセットし、ToUnicodeReverseMappingCount はそのサイズを報告し、GetUnicodeGlyphForCodepoint は Unicode コードポイントの登録済みフォントグリフ ID を返し、EnableShapingFeatureForSubset は埋め込まれたサブセットに含めるために GSUB 機能からの置換グリフをマークします。

 

範囲と制限事項

現在のプロデューサー側の統合

Syriac、Mongolian、Tibetan、Indic shaping には明示的な API reference pages があります。Syriac は AutoShapeSyriac、Mongolian は sfMongolianShaping、Tibetan は sfTibetanShaping、Indic reorder は sfIndicShaping、full Indic GSUB shaping は sfIndicGSUB で有効にできます。詳細な entry points は チベット語/モンゴル語/シリア語のシェーピングメソッドインド系文字シェーピングメソッド に記載されています

現在の scope は、RTL cursive scripts としての N'Ko と Adlam、Thai/Lao SARA AM と tone-mark ordering、Hebrew niqqud ordering、Javanese pre-base signs も cover します。これらの paths は スクリプトシェーピング前処理メソッド に記載されています

 

 

See also: アラビア語 / ペルシア語 / ウルドゥー語 シェーピングサポート, 自動シェーピングパイプライン (フェーズ 8), Open型 GSUB 置換エンジン, THotPDF.AssignSyntheticCodepointForGID