|
Syriac / Mongolian / Devanagari Shaping Support Multi-script capability surfaces (v2.119.53 - v2.119.55)
|
Arabic Shaping Auto Shaping Pipeline GSUB Engine |
|
HotPDF 为 Arabic 之外的三种复杂脚本公开 joining-class / positional-analysis / Indic syllabic-category capability surfaces:Syriac(U+0700-U+074F)、Mongolian(U+1800-U+18AF)和 Devanagari(U+0900-U+097F)。每个 capability 都让调用方通过现有 OpenType GSUB engine 驱动脚本以获得正确成形,同时将 cluster boundary detection、BiDi resolution 和 GPOS positioning 等重工作保留在 HotPDF 范围之外
Syriac shaping capability (v2.119.53) Two new methods expose Syriac's joining behaviour:
function GetSyriacJoiningClass(CP: Cardinal): TJoiningClass; function GetSyriacPosition(const Run: array of Cardinal; Index: Integer): TPosition;
Syriac 遵循与 Arabic 相同的 Right-Joining / Dual-Joining / Transparent / Non-Joining 四类框架;
不同于 Arabic,Syriac block 在 Unicode 中没有预编码 Presentation Forms;也没有等同于 U+FB50-FDFF / U+FE70-FEFC Arabic Presentation Forms blocks 的 Syriac 区段。因此消费端必须通过字体定义的 GSUB lookups(通常是
Mongolian shaping capability (v2.119.54) Two parallel methods for Mongolian:
function GetMongolianJoiningClass(CP: Cardinal): TJoiningClass; function GetMongolianPosition(const Run: array of Cardinal; Index: Integer): TPosition;
覆盖范围包括 basic Mongolian(U+1820-U+1842)、Todo(U+1843-U+1877)、Sibe(U+1880-U+18A8)、Manchu 和 Ali Gali 扩展。Variation Selectors FVS1 / FVS2 / FVS3(U+180B-U+180D)、soft hyphen NIRUGU(U+180A)以及 Ali Gali vowel marks 均分类为 Transparent(T-class),因此会参与连接而不会中断遍历
与 Syriac 一样,Mongolian 在 Unicode 中没有预编码 Presentation Forms。Mongolian 的传统竖排布局、复杂字形变化规则以及 FVS 驱动的形状选择都预期由字体定义的 GSUB lookups 驱动(通常为
Devanagari Indic shaping capability (v2.119.55) Devanagari 与 Arabic / Syriac / Mongolian 根本不同。它是 Indic abugida 脚本,有意义的单位是 syllable cluster(akshara)而非单个字母,cluster 内 glyph 的渲染顺序通常也不同于逻辑 Unicode 顺序。两个方法公开 Devanagari 的 Indic capability layer:
function GetDevanagariCategory(CP: Cardinal): TIndicCategory; procedure ApplyDevanagariReorder(var Run: array of Cardinal);
自动集成(v2.119.67):当
典型工作流 (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 // 查询 GSUB,取得与位置相符的替换字形 // emit + MarkUnicodeGlyphUsed end;
典型工作流 (Devanagari with automatic reorder)
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 Subset and Extraction Helpers
Scope and limitations 当前生产端集成 Syriac、Mongolian、Tibetan 和 Indic 塑形现在都有明确的 API 参考页面。Syriac 可通过 当前范围还覆盖作为 RTL 连写文字的 N'Ko 和 Adlam、处理 SARA AM 与声调标记顺序的 Thai/Lao、处理 niqqud 顺序的 Hebrew,以及处理前置基字标记的 Javanese。这些路径记录在 script shaping preprocess methods
另请参阅: Arabic / Persian / Urdu 塑形支持, Automatic Shaping Pipeline (Phase 8), OpenType GSUB Substitution Engine, THotPDF.AssignSyntheticCodepointForGID |