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

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

 

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

HotPDF は、アラビア語以外の 3 つの複雑スクリプト、Syriac(U+0700-U+074F)、Mongolian(U+1800-U+18AF)、Devanagari(U+0900-U+097F)に対して、接合クラス / 位置解析 / インディック音節カテゴリのケイパビリティサーフェスを公開します。各ケイパビリティにより、呼び出し側は既存の OpenType GSUB エンジンを通じて正しくシェイピングされたスクリプトを駆動でき、重い処理(クラスタ境界検出、BiDi 解決、GPOS ポジショニング)は HotPDF の守備範囲の外に保たれます

 

Syriac シェイピングケイパビリティ (v2.119.53)

Syriac の接合挙動を公開する 2 つのメソッド:

 

function GetSyriacJoiningClass(CP: Cardinal): TJoiningClass;

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

 

Syriac はアラビア語と同じ Right-Joining / Dual-Joining / Transparent / Non-Joining の 4 クラス枠組みに従います。GetSyriacJoiningClass は U+0700-U+074F ブロックの各コードポイントを Unicode の接合プロパティに従って分類します。GetSyriacPosition は Syriac のランをたどり、隣接文字の接合クラスに基づいて各文字を isolated / initial / medial / final の位置へ解決します

 

アラビア語と異なり、Syriac ブロックにはUnicode にプレエンコードされた Presentation Forms がありません。U+FB50-FDFF / U+FE70-FEFC の Arabic Presentation Forms ブロックに相当する Syriac のものは存在しないのです。したがって、Syriac のシェイピングはコードポイント書き換えではなく、フォント定義の GSUB ルックアップ(通常 init / medi / fina / isol + rlig)を通じて駆動する必要があります。上記のケイパビリティ層が、グリフごとに適切な GSUB フィーチャーを照会するために必要な位置ラベルを呼び出し側に与えます

 

Mongolian シェイピングケイパビリティ (v2.119.54)

Mongolian 向けの対になる 2 つのメソッド:

 

function GetMongolianJoiningClass(CP: Cardinal): TJoiningClass;

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

 

カバレッジには、基本モンゴル文字(U+1820-U+1842)、Todo(U+1843-U+1877)、Sibe(U+1880-U+18A8)、満州文字、アリガリ拡張が含まれます。異体字セレクタ FVS1 / FVS2 / FVS3(U+180B-U+180D)、ソフトハイフン相当の NIRUGU(U+180A)、アリガリの母音記号はすべて Transparent(T クラス)として分類され、探索を壊さずに接合に参加します

 

Syriac と同様に、Mongolian にも Unicode にプレエンコードされた Presentation Forms はありません。モンゴル文字の伝統的な縦書きレイアウト、複雑な字形変化規則、FVS による字形選択は、すべてフォント定義の GSUB ルックアップ(通常 init / medi / fina / isol + ccmp / rlig / locl)で駆動することが想定されています。ケイパビリティ層は、それらのフィーチャーを照会するために必要な位置ラベルを呼び出し側に与えます

 

Devanagari インディックシェイピングケイパビリティ (v2.119.55)

Devanagari はアラビア語 / Syriac / Mongolian とは根本的に異なります。意味のある単位が単一の文字ではなく音節クラスタ(アクシャラ)であるインド系アブギダ文字で、クラスタ内グリフの描画順序は論理的な Unicode 順としばしば異なります。Devanagari のインディックケイパビリティ層を公開する 2 つのメソッド:

 

function GetDevanagariCategory(CP: Cardinal): TIndicCategory;

procedure ApplyDevanagariReorder(var Run: array of Cardinal);

 

GetDevanagariCategory は U+0900-U+097F の各コードポイントを 13 のインディック音節カテゴリ(Base / Consonant / Vowel / Independent Vowel / Vowel Mark / Pre-base Matra / Above-base Matra / Below-base Matra / Halant Virama / Repha / Anusvara / Visarga / Other)のいずれかに分類します。呼び出し側はこれで音節境界を検出し、クラスタ内のどの位置を並べ替える必要があるかを特定できます

 

ApplyDevanagariReorder は入力ランをたどって Devanagari の主要な 2 つの並べ替え規則を適用するプリパスです。(1) Repha(音節クラスタ先頭の Ra + Halant)は、上付きフックとして描画されるよう、クラスタの基底子音の直後の位置へ移動します。(2) 前置 I-matra(U+093F DEVANAGARI VOWEL SIGN I)は、左側フックとして描画されるよう、クラスタの基底子音の前に移動します。その他のインディック並べ替え(上付け / 下付け matra、合字形成)はフォント固有のルックアップテーブルを必要とするため、フォントの GSUB エンジンに委ねられます

 

自動統合 (v2.119.67): sfIndicShaping in PDF.ShapingFeatures のとき、ApplyDevanagariReorder は 3 つの BuildUnicode*FieldContent ヘルパー内でプリパスとして自動適用されます。その後、コンシューマーリーダーの GSUB エンジンが正しい順序で音節を拾い、独自の文脈依存シェイピング規則を適用します。Automatic Shaping Pipeline を参照してください

 

典型的なワークフロー (Syriac)

 

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;

 

典型的なワークフロー (自動並べ替え付き Devanagari)

 

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 のシェイピングには、明示的な API リファレンスページがあります。Syriac は AutoShapeSyriac で、Mongolian は sfMongolianShaping で、Tibetan は sfTibetanShaping で、Indic 並べ替えは sfIndicShaping で、フルインディック GSUB シェイピングは sfIndicGSUB で有効化できます。詳細なエントリポイントは Tibetan/Mongolian/Syriac shaping methods と Indic shaping methods に文書化されています

現在の守備範囲は、RTL 筆記体スクリプトとしての N'Ko と Adlam、タイ語 / ラーオ語の SARA AM と声調記号の順序、ヘブライ語のニクダー順序、ジャワ語の前置記号もカバーします。これらのパスは script shaping preprocess methods に文書化されています

 

 

関連項目: Arabic / Persian / Urdu Shaping Support, Automatic Shaping Pipeline (Phase 8), OpenType GSUB Substitution Engine, THotPDF.AssignSyntheticCodepointForGID