|
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
|