Dukungan Shaping Arabic / Persian / Urdu

Pipeline shaping sisi produsen (v2.85.0 - v2.119.68)

 

OpenType GSUB Engine  CFF / OpenType Subsetting

HotPDF menjalankan pipeline shaping sisi produsen yang melipat run input Unicode Arabic, Persian, dan Urdu ke Arabic Presentation Forms saat emisi teks PDF, sehingga reader konsumen menerima glyph posisi / ligature yang siap dirender tanpa memerlukan shaper kelas Harfbuzz sendiri

 

Apa yang dilakukan pipeline

Shaping posisional (v2.85.0): setiap huruf dasar Arabic memiliki hingga empat bentuk posisional - isolated (isol), initial (init), medial (medi), final (fina). HotPDF memeriksa kelas join setiap karakter Arabic dan kelas join dari tetangga langsungnya, lalu memetakan codepoint input ke glyph Arabic Presentation Forms-B (U+FE70 - U+FEFC) yang sesuai sebelum emisi. Huruf non-joining, joiner, karakter transparan (tanda gabung), dan kashida Tatweel semuanya ditangani menurut algoritma Unicode Arabic Shaping

 

Ligature wajib LAM-ALEF (v2.119.32): spesifikasi Arabic Unicode Shaping mewajibkan bahwa setiap LAM (U+0644) yang langsung diikuti ALEF (U+0627 plain, U+0622 dengan madda di atas, U+0623 dengan hamza di atas, U+0625 dengan hamza di bawah) dilipat menjadi satu glyph ligature (U+FEFB - U+FEFC bentuk isolated / final dengan varian hamza / madda yang sesuai). Ini adalah salah satu dari sangat sedikit ligature non-opsional dalam tipografi Arabic dan diperlukan demi ketepatan; merendernya sebagai glyph terpisah menghasilkan teks yang segera dikenali reader native sebagai salah bentuk. HotPDF melakukan pelipatan saat emisi sehingga pemanggil tidak perlu shaper kelas Harfbuzz di jalur kode mereka sendiri

 

9 huruf inti Persian / Urdu (v2.119.35): Persian dan Urdu memperluas Arabic dengan huruf yang tidak ada di blok Arabic Presentation Forms-B (U+FE70 - U+FEFC). Sembilan huruf yang paling sering dipakai - termasuk PEH (U+067E), TCHEH (U+0686), JEH (U+0698), KEH (U+06A9 / U+06AF), GAF (U+06AF), NOON GHUNNA (U+06BA), HEH DOACHASHMEE (U+06BE), YEH BARREE (U+06D2), dan HEH GOAL (U+06C1) - memiliki bentuk presentasi di Arabic Presentation Forms-A (U+FB50 - U+FDFF). HotPDF kini memetakan huruf-huruf ini ke glyph Forms-A yang sesuai selama shaping posisional, sehingga teks Persian dan Urdu dirender dengan bentuk init / medi / fina / isol yang benar di reader mana pun

 

Arabic Extended-A + Supplement (v2.119.52, v2.119.56): tabel joining-class kini mencakup karakter Arabic Extended-A yang tersisa (ALEF WASLA / NOON GHUNNA / varian HEH), Arabic Supplement U+0750-U+077F, dan rentang Arabic Extended-A yang lebih tinggi U+08A0-U+08FF. Karakter yang memiliki encoding statis Presentation Forms-A dipetakan melalui shaper 4-posisi yang sudah ada; karakter yang tidak memilikinya (sebagian besar Extended-A) hanya mendapat klasifikasi joining-class sehingga tetangga tetap di-shape dengan benar meskipun karakter itu sendiri diteruskan tanpa perubahan. v2.119.56 memperbaiki dua pemetaan Forms-A yang salah yang diperkenalkan v2.119.52 (U+06C2 / U+06C3)

 

Cakupan penuh Persian / Urdu Form-B (v2.119.57): tabel joining-class diperluas untuk mencakup rentang penuh U+0672-U+06D5 (sekitar 80 karakter yang meliputi varian REH / DAL / SEEN / SAD / TAH / AIN / FEH / QAF / KAF / GAF / LAM / NOON / HEH / WAW / YEH), dan 26 pemetaan Presentation Forms-A baru ditambahkan (15 bentuk 4-form kelas D + 11 bentuk 2-form kelas R). Secara khusus, HEH DOACHASHMEE standar Urdu 'h' (U+06BE → FBAA-FBAD) dan YEH BARREE akhir kata Urdu (U+06D2 → FBAE-FBAF) kini dipetakan dengan benar ke slot Forms-A yang sebelumnya dipakai sementara oleh perbaikan ALEF WASLA / NOON GHUNNA v2.119.52. Cakupan Forms-A statis kini mencakup lebih dari 40 karakter sumber

 

Ligatur pasca-pass YEH-HAMZA + vokal (v2.119.58): pasca-pass yang ditambahkan ke _ApplyArabicShaping setelah shaping posisional mencakup 8 pasangan ligatur di blok Forms-A U+FBEA-U+FBFB - YEH-HAMZA + ALEF / AE / WAW / U / OE / YU / E / ALEF MAKSURA. Setiap pasangan memancarkan bentuk isolated (FBEA / FBEC / FBEE / FBF0 / FBF2 / FBF4 / FBF6 / FBF9) plus bentuk final base+1. Slot bentuk starting / medial FBF8 / FBFB diserahkan ke engine GSUB lewat opt-in sfArabicGSUB. Dibangun di atas kerangka yang sama seperti LAM-ALEF v2.119.32

 

Ligatur Allah (v2.119.60): urutan empat karakter ALEF + LAM + LAM + HEH dilipat menjadi U+FDF2 ARABIC LIGATURE ALLAH ISOLATED FORM. Diimplementasikan sebagai static post-pass pada level codepoint setelah v2.119.32 LAM-ALEF dan v2.119.58 YEH-HAMZA di rantai _ApplyArabicShaping

 

Ligatur frasa Bismillah (v2.119.62): frasa Bismillah standar 22 codepoint "بسم الله الرحمن الرحيم" dilipat menjadi satu glyph U+FDFD ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM. Berjalan sebagai pre-pass pertama di _ApplyArabicShaping (sebelum LAM-ALEF), sehingga glyph Bismillah yang sudah dilipat mencapai sisa pipeline sebagai satu codepoint dan tidak disentuh lagi oleh substitusi berikutnya

 

Public Query Helpers

GetArabicJoiningClass mengembalikan Unicode joining class yang dipakai static Arabic shaper. GetArabicPosition menyelesaikan satu karakter dalam run menjadi posisi isolated, initial, medial, atau final sehingga pemanggil dapat memeriksa atau meniru keputusan shaping yang sama sebelum menulis teks

 

How callers invoke it

Shaping pipeline berjalan otomatis di dalam metode Unicode text emission - tidak perlu panggilan eksplisit "shape this". Kirim string Arabic / Persian / Urdu berbasis Unicode ke THPDFPage.UnicodeTextOut atau THPDFPage.RtLTextOut dan HotPDF memetakan setiap codepoint masukan ke bentuk presentation form-nya sebelum menulis operator text-showing PDF. Byte Unicode asli juga ditangkap ke FUnicodeUsedCps untuk pembuatan ToUnicode CMap, sehingga copy / paste di sisi pembaca dan screen reader tetap melihat payload Unicode asli

 

Font requirements

Font yang didaftarkan lewat RegisterUnicodeTTF harus memiliki glyph untuk blok Arabic Presentation Forms-B (U+FE70 - U+FEFC) dan, untuk Persian / Urdu, rentang Arabic Presentation Forms-A yang relevan (U+FB50 - U+FDFF). Font yang direkomendasikan dan membawa set lengkap:

 

Noto Sans Arabic (Latin + Arabic; Forms-A + Forms-B + Arabic Extended-A).

Noto Naskh Arabic, Noto Naskh Arabic UI.

Amiri (traditional Naskh, full Forms-A + Forms-B coverage).

Scheherazade New (SIL, designed for languages of the Muslim world).

Microsoft Arabic Typesetting / Tahoma / Times New Roman (Windows-bundled, full Forms-B; some have Forms-A coverage).

 

Saat font yang terdaftar tidak memiliki glyph untuk presentation form turunan, HotPDF kembali ke codepoint Unicode dasar dan mengeluarkannya tanpa perubahan; pembaca konsumen kemudian dapat mencoba shaping sendiri (Acrobat, Foxit) atau merender .notdef

 

Typical workflow

 

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

PDF.BeginDoc;

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

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

  UnicodeString(#$0645#$0631#$062D#$0628#$0627));  // "marhaba" (hello)

PDF.EndDoc;

 

Automatic Phase 8 pipeline integration (v2.119.59 - v2.119.68)

v2.119.59 memperkenalkan properti opt-in ShapingFeatures: THPDFShapingFeatures dan enum THPDFShapingFeature, yang menaikkan pipeline shaping melampaui static post-pass folding menjadi substitusi spesifik font berbasis GSUB otomatis. Set PDF.ShapingFeatures := [sfArabicGSUB] untuk menerapkan lookup Arabic asli dari font terdaftar init, medi, fina, isol, rlig, calt, dan rclt lalu memancarkan glyph ID kontekstual yang dihasilkan; tambahkan sfCursiveAttachment untuk menerapkan anchor cursive entry/exit GPOS pada run yang sudah di-shape; tambahkan sfStandardLigatures untuk Latin Standard Ligatures (FB00-FB06 ff / fi / fl / ffi / ffl / ſt / st lewat v2.119.65 ApplyLatinLigatureRefinement); tambahkan sfIndicShaping untuk mengaktifkan reorder pre-pass Devanagari (v2.119.67). Default [] mempertahankan output identik byte bagi pemanggil yang bergantung pada pipeline statis

 

Saat sfArabicGSUB diaktifkan, static Unicode Presentation Forms shaper dilewati demi aturan GSUB milik font itu sendiri. HotPDF memancarkan glyph ID kontekstual asli melalui synthetic codepoint ketika glyph tersebut tidak dapat dijangkau dari cmap font, menjaga embedded subset tetap tertutup, dan menulis pemetaan balik ToUnicode untuk copy dan paste. Pemanggil yang ingin static shaper tetap berjalan untuk cakupan codepoint di luar yang dideklarasikan GSUB font harus membiarkan sfArabicGSUB mati dan mengandalkan rantai static post-pass

 

ToUnicode CMap ligature reverse mapping (v2.119.61, v2.119.62, v2.119.65)

The Adobe-Identity-UCS ToUnicode CMap emitted by RegisterUnicodeTTF ships bfchar reverse-mapping entries for every ligature codepoint the post-pass chain can produce. v2.119.61 added 27 entries (8 LAM-ALEF + 18 YEH-HAMZA family + 1 Allah); v2.119.62 added Bismillah (U+FDFD); v2.119.65 added 7 Latin Standard Ligature entries (FB00-FB06). Consumer-reader copy / paste resolves any ligature glyph back to the source codepoint sequence, so the rendered PDF stays accessibility-friendly.

 

PUA synthetic codepoint emit (v2.119.68)

AssignSyntheticCodepointForGID(GID; out CP): Boolean + GetSyntheticCodepointForGID(GID): Word memungkinkan kode producer memancarkan GID substitusi GSUB yang tidak punya codepoint Unicode alami yang dapat dijangkau melalui cmap font. Allocator membagikan codepoint di Private Use Area (U+E000 - U+F8FF, 6400 slot) dan mencerminkan assignment itu ke FUnicodeCpToGid (agar /CIDToGIDMap menyelesaikan CP sintetis kembali ke GID target pada pembaca konsumen), FAcroFormUnicodeAdvances (agar word-wrap v2.65 menemukan em-fraction yang benar), dan tabel reverse lookup per-GID (agar permintaan assignment ulang bersifat idempoten). Gunakan ini untuk bentuk cluster Devanagari, alternatif stilistik, dan urutan variasi ideografik CJK yang diperkenalkan GSUB tetapi tidak dijangkau cmap

 

Relationship to the OpenType GSUB engine

Static post-pass shaper yang dijelaskan di atas (v2.85.0 + v2.119.32 / 58 / 60 / 62) secara default terpisah dari OpenType GSUB engine. Saat sfArabicGSUB diaktifkan melalui ShapingFeatures, GSUB engine menjadi bagian dari jalur emission sisi producer: HotPDF menelusuri cmap untuk membangun array GID dasar, menerapkan lookup GSUB Arabic posisional dan kontekstual asli pada run glyph itu, menetapkan synthetic codepoint untuk glyph ID substitusi yang tidak memiliki Unicode Presentation Form, dan memanggil MarkUnicodeGlyphUsed untuk menjaga glyph substitusi tetap berada di dalam embedded font subset

 

Untuk glyph substitusi tanpa codepoint Unicode, pemanggil menggabungkan ShapingFeatures dengan allocator synthetic-codepoint PUA v2.119.68 agar GID substitusi tetap dapat dijangkau melalui pipeline hex standar. Rantai static post-pass tetap menjadi fallback default untuk codepoint yang tidak dicakup deklarasi GSUB font

 

Cakupan dan batasan

Algoritme BiDi tetap berada di luar halaman ini: pemanggil masih perlu mengurutkan run LTR dan RTL campuran sendiri atau memakai library BiDi terpisah. Dukungan GPOS, Indic/Tibetan/Mongolian, Hebrew, N'Ko, Adlam, Thai/Lao, dan Javanese kini berada di halaman flag dan API shaping opt-in terpisah, jadi halaman ini hanya berfokus pada static Arabic shaping dan shaping berbasis GSUB

 

See also: OpenType GSUB Substitution Engine, Automatic Shaping Pipeline (Phase 8), Syriac / Mongolian / Devanagari Shaping, THotPDF.AssignSyntheticCodepointForGID, THPDFPage.RtLTextOut, THPDFPage.UnicodeTextOut, CFF / OpenType Font Subsetting