自動シェーピングパイプライン (フェーズ 8)

オプトイン プロデューサー側 GSUB パイプライン (v2.119.59 - v2.120.10)

 

アラビア文字シェーピング  マルチスクリプトシェーピング  GSUB エンジン

自動シェーピングパイプラインは、Open型 GSUB エンジンを機能のみのクエリサーフェスから、テキストが PDF コンテンツストリームに出力されるときに自動的に適用されるプロデューサー側の機能に昇格させます。呼び出し元は、型付きのセット (ShapingFeatures: THPDFShapingFeatures) を介して特定の GSUB 機能を有効にし、HotPDF は適切な置換の実行、埋め込まれたフォントサブセットへの置換グリフのマーキング、およびアクセシビリティに必要な ToUnicode CMap リバースマッピングエントリの出力を処理します。

 

オプトインフレームワーク (v2.119.59 / フェーズ 8a)

新しい列挙型とプロパティにより、テキスト出力中に実行される自動置換が制御されます。

 

type

  THPDFShapingFeature = (

    sfArabicGSUB,    // native Arabic init / medi / fina / isol + rlig / calt / rclt

    sfStandardLigatures, // Latin 'liga' (ff / fi / fl / ffi / ffl / sft / st)

    sfContextualLigatures,// Latin 'clig' (contextual ligatures)

    sfContextualAlternates,// 'rclt' (Required Contextual Alternates)

    sfIndicShaping); // Devanagari Repha + pre-base I-matra reorder

  THPDFShapingFeatures = set of THPDFShapingFeature;

 

property ShapingFeatures: THPDFShapingFeatures read ... write ...;

 

デフォルトは [] (空のセット) であり、v2.119.32-58 の静的ポストパスシェーパーに依存する呼び出し元のバイト単位で同一の出力を保持します。1つ以上のフラグを設定すると、対応する機能の自動モードにエンジンが昇格します。

 

sfArabicGSUB - ネイティブ アラビア文字 GSUB シェーピング (v2.185.0)

sfArabicGSUB が設定されている場合、HotPDF は論理的なアラビア語のランを基本のグリフ ID にマッピングし、各文字に選択された結合位置で登録済みフォントの位置 initmedifina、および isol ルックアップを適用してから、シェーピングされたランに対して rligcalt、および rclt を適用します。Unicode コードポイントを持たない置換グリフは、ToUnicode リバースマッピングを伴う合成コードポイントパスを介して出力されるため、コンテキストのアラビア語グリフが cmap の外部にあるフォントでも、正しく埋め込んでコピーすることができます。

 

sfArabicGSUB を設定すると、アラビア語の v2.85.0 静的 4 位置シェーパーが暗黙的にバイパスされます。フォントの GSUB が宣言している範囲外のコードポイントを引き続き処理するために静的シェーパーが必要な呼び出し元は、sfArabicGSUB をオフのままにする必要があります。

 

sfStandardLigatures / sfContextualLigatures - フェーズ 8b (v2.119.65)

sfStandardLigatures が設定されている場合、ラテン標準合字はフォントの liga 機能を使用して自動的に折りたたまれます。ApplyLatinLigatureRefinement は、アルファベット表示形ブロック (U+FB00-FB4F) を対象とします。通常は FB00 ff、FB01 fi、FB02 fl、FB03 ffi、FB04 ffl、FB05 long-s + t、FB06 st です。sfContextualLigatures は、フォントの clig 機能に 2 番目のパスを追加します。どちらのパスも sfArabicGSUB と同じリバース cmap メカニズムを使用し、コンシューマーリーダーのコピー / ペーストで合字をソース文字に解決して戻せるように、7 つの新しい ToUnicode CMap リバースマッピングエントリ (FB00-FB06) を出力します。

 

sfContextualAlternates - GSUB 'rclt' (v2.119.66)

sfContextualAlternates が設定されている場合、フォントの rclt (必須のコンテキスト代替) 機能が適用されます。ApplyArabicGSUBContextualRefinement は、v2.119.47 の ApplyContextualSubst エントリポイントを使用し、可変長の N 対 M 出力を処理します (すべての置換 GID がリバース cmap を介して到達可能である場合にのみ置換がコミットされます)。リバース cmap の範囲は、ラテン文字 + アラビア文字 + ヘブライ文字の表示形をカバーするために FB00-FDFF + FE70-FEFF に拡張されています。

 

rclt の一般的なユーザー:フォントが Unicode 表示形のコードポイントではなく GSUB を介して位置のシェーピングを推進する場合のアラビア語の init / medi / fina / isol。特定のラテン文字シーケンスの曖昧さ回避ルール。フォントデザイナーによって rclt として登録されている場合のインド系文字のシェーピング pres / blws / psts / half / pstf / cjct 機能。

 

sfIndicShaping - フェーズ 8e (v2.119.67)

sfIndicShaping が設定されている場合、v2.119.55 のデーヴァナーガリー文字の機能 ApplyDevanagariReorder は、手動メソッドから、3 つの BuildUnicode*FieldContent ヘルパー内で適用される自動プレパスに昇格します。デーヴァナーガリー文字のランは、Repha (クラスター開始時の Ra + Halant) を後置ベース位置に移動し、前置ベース I-matra (U+093F) をクラスターベース子音の前に移動するため、コンシューマーリーダーの GSUB エンジンは正しいレンダリング順序で音節を拾い上げます。その他のインド系文字の並べ替え (上部ベース / 下部ベース マトラ、結合文字の形成) はフォントの GSUB に残ります。

 

Advance クエリ サポート (v2.119.64 / フェーズ 8c.5)

コンパニオン API はキャッシュされた /W の em の割合を公開するため、呼び出し元は GSUB で置換されたグリフを出力するときにワードラップを正しく計算できます。

 

function GetCodepointAdvance(CP: Cardinal): Single;

 

CP の cmap で解決されたグリフの hmtx 派生のアドバンス幅を em の割合として返します。同じリリースで CodeユニットAdvance も修正され、アラビア表示形 (U+FB50-FDFF + U+FE70-FEFF) を WIDE ではなく NARROW として分類するようになりました (ヒューリスティック フォールバックは v2.65 以前は間違っていました)。

 

一般的なワークフロー (完全なアラビア文字自動シェーピング)

 

PDF.RegisterUnicodeTTF('NotoArab', 'NotoSansArabic-Regular.ttf');

PDF.ShapingFeatures :=

  [sfArabicGSUB,  // native Arabic GSUB contextual glyphs

   sfCursiveAttachment];  // GPOS cursive entry / exit anchors

PDF.SetGSUBScript('arab');

PDF.BeginDoc;

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

PDF.CurrentPage.RtLTextOut(100, 700, 0,

  UnicodeString(#$0628#$0633#$0645#$0020#$0627#$0644#$0644#$0647));

PDF.EndDoc;

 

一般的なワークフロー (ラテン標準合字 + デーヴァナーガリー文字並べ替え)

 

PDF.RegisterUnicodeTTF('NotoSans', 'NotoSans-Regular.ttf');

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

PDF.ShapingFeatures :=

  [sfStandardLigatures, // FB00-FB06 Latin liga

   sfContextualLigatures, // + clig

   sfIndicShaping]; // Devanagari Repha + I-matra reorder

 

フェーズ 8 ロードマップの完了

フェーズ 8a (v2.119.59) オプトインフレームワーク + アラビア文字機能。フェーズ 8b (v2.119.65) ラテン標準合字。フェーズ 8c.1 (v2.119.60) Allah。フェーズ 8c.2 (v2.119.63) GID レベル GSUB rlig。フェーズ 8c.3 (v2.119.61) ToUnicode リバースマッピング。フェーズ 8c.4 (v2.119.62) Bismillah。フェーズ 8c.5 (v2.119.64) advance クエリ + ヒューリスティック修正。フェーズ 8c.6 (v2.119.68) PUA 合成コードポイント出力。フェーズ 8d は 8c のサブフェーズに統合されました。フェーズ 8e (v2.119.67) デーヴァナーガリー文字の自動並べ替え。v2.119.68 をもってフェーズ 8 の機能マトリックスは完了しました。さらなる改良 (追加のインド系文字、Open型 GPOS の配置、BiDi の解決) は、個別のロードマップ項目として追跡されます。

 

範囲と制限事項

オプトインパイプラインは、静的ポストパスシェーパーの上に意図的に追加されています。オプトインしない限り、既存の呼び出し元で動作の変化は見られません。デフォルトの [] セットは、バイト単位で安定した回帰のための安全な選択です。要求された GSUB 機能テーブルを持たないフォントは、安全な no-op 出力を生成します (呼び出し元には置換が適用されず、例外も発生しません)。

 

現在のシェーピング API マップ

現在の pipeline は substitution-only ではありません。sfKerning は GPOS pair kerning、sfMarkPositioning は Mark-to-Base と Mark-to-Mark offsets、sfMarkToLigature は Mark-to-Ligature placement、sfCursiveAttachment は cursive entry/exit anchor alignment、sfTibetanShaping は Tibetan GSUB shaping、sfMongolianShaping は Mongolian positional forms、sfIndicGSUB は syllable reorder 後の Indic GSUB feature chain を適用します。ShapingFeaturesGPOS メソッドインド系文字シェーピングメソッド を参照してください

最近の追加では、sfLocalizedForms による loclApplyGSUBContextualFeature による calt、contextual / vertical GPOS kerning、native Arabic GSUB contextual glyph emission、N'Ko、Adlam、Thai/Lao、Hebrew、Javanese paths が加わりました。スクリプトシェーピング前処理メソッド を参照してください

 

See also: Open型 GSUB 置換エンジン, アラビア語 / ペルシア語 / ウルドゥー語 シェーピングサポート, シリア語 / モンゴル語 / デーヴァナーガリー文字のシェーピング, THotPDF.AssignSyntheticCodepointForGID, CFF / Open型 フォント サブセット化