Pipeline Shaping Otomatis (Phase 8)

Pipeline GSUB sisi produsen yang opsional (v2.119.59 - v2.120.10)

 

Arabic Shaping  Multi-Script Shaping  GSUB Engine

Pipeline shaping otomatis mengangkat OpenType GSUB engine dari permukaan query yang hanya berisi kapabilitas menjadi fitur sisi produsen yang diterapkan otomatis saat teks di-emit ke PDF content stream. Pemanggil mengaktifkan fitur GSUB tertentu melalui typed set (ShapingFeatures: THPDFShapingFeatures) dan HotPDF menangani substitusi yang tepat, menandai glyph pengganti ke subset font tertanam, serta mengeluarkan entri reverse-mapping ToUnicode CMap yang dibutuhkan untuk aksesibilitas

 

Kerangka opsional (v2.119.59 / Phase 8a)

Sebuah enum dan properti baru mengontrol substitusi otomatis mana yang berjalan selama emisi teks:

 

type

  THPDFShapingFeature = (

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

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

    sfContextualLigatures,// Latin 'clig' (ligature kontekstual)

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

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

  THPDFShapingFeatures = set of THPDFShapingFeature;

 

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

 

Default adalah [] (set kosong), yang mempertahankan output byte-identical bagi pemanggil yang bergantung pada static post-pass shaper v2.119.32-58. Menetapkan satu atau lebih flag menaikkan engine ke mode otomatis untuk fitur yang bersangkutan

 

sfArabicGSUB - shaping GSUB Arabic native (v2.185.0)

Saat sfArabicGSUB diset, HotPDF memetakan run Arabic logis ke base glyph ID, menerapkan lookup posisi init, medi, fina, dan isol dari font terdaftar pada posisi joining yang dipilih untuk setiap huruf, lalu menerapkan rlig, calt, dan rclt pada run yang telah di-shape. Glyph pengganti yang tidak memiliki codepoint Unicode dikeluarkan lewat jalur synthetic-codepoint dengan reverse mapping ToUnicode, sehingga font yang glyph Arabic kontekstualnya berada di luar cmap tetap bisa disematkan dan disalin dengan benar

 

Menetapkan sfArabicGSUB secara implisit melewati static shaper 4-posisi Arabic v2.85.0 - pemanggil yang membutuhkan static shaper untuk tetap menangani codepoint di luar deklarasi GSUB font harus membiarkan sfArabicGSUB mati

 

sfStandardLigatures / sfContextualLigatures - Phase 8b (v2.119.65)

Saat sfStandardLigatures diset, Latin Standard Ligatures dilipat otomatis memakai fitur liga font. ApplyLatinLigatureRefinement menargetkan blok Alphabetic Presentation Forms (U+FB00-FB4F) - biasanya FB00 ff, FB01 fi, FB02 fl, FB03 ffi, FB04 ffl, FB05 long-s + t, FB06 st. sfContextualLigatures menambahkan lintasan kedua untuk fitur clig font. Kedua lintasan memakai mekanisme reverse-cmap yang sama seperti sfArabicGSUB dan mengeluarkan 7 entri reverse-mapping ToUnicode CMap baru (FB00-FB06) sehingga copy / paste di reader konsumen memecah ligature kembali ke huruf sumber

 

sfContextualAlternates - GSUB 'rclt' (v2.119.66)

Saat sfContextualAlternates diset, fitur rclt (Required Contextual Alternates) dari font diterapkan. ApplyArabicGSUBContextualRefinement memakai titik masuk ApplyContextualSubst v2.119.47 dan menangani output N-ke-M dengan panjang variabel (substitusi hanya dikomit ketika setiap GID pengganti dapat dijangkau melalui reverse cmap). Rentang reverse cmap diperluas ke FB00-FDFF + FE70-FEFF untuk mencakup Presentation Forms Latin + Arabic + Hebrew

 

Pengguna kanonik rclt: bentuk posisional Arabic init / medi / fina / isol ketika font menggerakkan shaping posisional melalui GSUB alih-alih melalui codepoint Unicode Presentation Forms; aturan disambiguasi urutan Latin tertentu; fitur shaping Indic pres / blws / psts / half / pstf / cjct ketika oleh perancang font didaftarkan sebagai rclt

 

sfIndicShaping - Phase 8e (v2.119.67)

Saat sfIndicShaping diset, kapabilitas Devanagari v2.119.55 ApplyDevanagariReorder dipromosikan dari metode manual menjadi pre-pass otomatis yang diterapkan di dalam tiga helper BuildUnicode*FieldContent. Run Devanagari mendapat Repha (Ra + Halant di awal cluster) dipindahkan ke posisi post-base, dan I-matra pre-base (U+093F) dipindahkan sebelum konsonan dasar cluster, sehingga engine GSUB milik reader konsumen menangkap suku kata dalam urutan render yang benar. Reorder Indic lain (matra above-base / below-base, pembentukan conjunct) tetap berada di GSUB font

 

Dukungan query advance (v2.119.64 / Phase 8c.5)

Sebuah API pendamping mengekspos pecahan em /W yang dicache sehingga pemanggil dapat menghitung word-wrap dengan benar saat mengeluarkan glyph yang disubstitusi GSUB:

 

function GetCodepointAdvance(CP: Cardinal): Single;

 

Mengembalikan lebar advance turunan hmtx sebagai pecahan em untuk glyph yang diselesaikan cmap pada CP. Rilis yang sama juga memperbaiki CodeUnitAdvance agar mengklasifikasikan Arabic Presentation Forms (U+FB50-FDFF + U+FE70-FEFF) sebagai NARROW alih-alih WIDE (fallback heuristik sebelumnya salah sebelum v2.65)

 

Typical workflow (full Arabic auto-shaping)

 

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;

 

Typical workflow (Latin standard ligatures + Devanagari reorder)

 

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

 

Phase 8 roadmap closure

Phase 8a (v2.119.59) opt-in framework + Arabic capability; Phase 8b (v2.119.65) Latin standard ligatures; Phase 8c.1 (v2.119.60) Allah; Phase 8c.2 (v2.119.63) GID-level GSUB rlig; Phase 8c.3 (v2.119.61) ToUnicode reverse mapping; Phase 8c.4 (v2.119.62) Bismillah; Phase 8c.5 (v2.119.64) advance query + heuristic fix; Phase 8c.6 (v2.119.68) PUA synthetic codepoint emit; Phase 8d was rolled into 8c sub-phases; Phase 8e (v2.119.67) Devanagari auto-reorder. With v2.119.68 the Phase 8 capability matrix is closed; further refinements (additional Indic scripts, OpenType GPOS positioning, BiDi resolution) are tracked under separate roadmap items.

 

Cakupan dan batasan

Pipeline opt-in ini memang dirancang aditif terhadap static post-pass shaper - pemanggil yang sudah ada tidak melihat perubahan perilaku kecuali mereka memilih ikut. Set default [] adalah pilihan aman untuk regresi yang byte-stable. Font tanpa tabel fitur GSUB yang diminta menghasilkan output no-op yang aman (pemanggil melihat tidak ada substitusi yang diterapkan, tidak ada exception yang muncul)

 

Peta API shaping saat ini

Pipeline saat ini tidak lagi hanya substitusi: sfKerning menerapkan pair kerning GPOS, sfMarkPositioning menerapkan offset Mark-to-Base dan Mark-to-Mark, sfMarkToLigature menerapkan penempatan Mark-to-Ligature, sfCursiveAttachment menerapkan penyelarasan anchor entry/exit cursive, sfTibetanShaping menerapkan shaping Tibetan GSUB, sfMongolianShaping menerapkan bentuk posisional Mongolian, dan sfIndicGSUB menerapkan rantai fitur Indic GSUB setelah reorder suku kata. Lihat ShapingFeatures, GPOS methods, dan Indic shaping methods

Penambahan terbaru menambahkan sfLocalizedForms untuk locl, calt melalui ApplyGSUBContextualFeature, contextual dan vertical GPOS kerning, emisi glyph kontekstual Arabic GSUB asli, serta jalur N'Ko, Adlam, Thai/Lao, Hebrew, dan Javanese. Lihat script shaping preprocess methods

 

See also: OpenType GSUB Substitution Engine, Arabic / Persian / Urdu Shaping Support, Syriac / Mongolian / Devanagari Shaping, THotPDF.AssignSyntheticCodepointForGID, CFF / OpenType Font Subsetting