Arabic / Persian / Urdu Shaping Support

Producer-side shaping pipeline (v2.85.0 - v2.119.68)

 

OpenType GSUB Engine  CFF / OpenType Subsetting

HotPDF pokreće pipeline za oblikovanje sa strane proizvođača koji sklapа Unicode-input nizove arapskog, persijskog i urdu u njihove Arabic Presentation Forms prilikom emitovanja PDF teksta, tako da potrošački čitači dobiju spremne / ligature glifove sa tačnim položajem bez sopstvenog Harfbuzz-class shaper-a

 

What the pipeline does

Poziciono oblikovanje (v2.85.0): svako osnovno arapsko slovo ima do četiri poziciona oblika - isolated (isol), initial (init), medial (medi), final (fina). HotPDF ispituje klasu povezivanja svakog arapskog znaka i klase povezivanja njegovih neposrednih suseda, zatim mapira ulazni kodpoent na odgovarajući Arabic Presentation Forms-B (U+FE70 - U+FEFC) glif pre emitovanja. Nepovezujuća slova, spojnice, transparentni znakovi (kombinacione oznake) i Tatweel kashida obrađuju se prema Unicode Arabic Shaping algoritmu

 

Obavezna LAM-ALEF ligatura (v2.119.32): arapska Unicode Shaping specifikacija zahteva da se svaki LAM (U+0644) odmah praćen ALEF-om (U+0627 plain, U+0622 sa madda iznad, U+0623 sa hamza iznad, U+0625 sa hamza ispod) spoji u jedan ligaturni glif (U+FEFB - U+FEFC izolovani / završni oblici sa odgovarajućim hamza / madda varijantama). Ovo je jedna od vrlo malobrojnih neobaveznih ligatura u arapskoj tipografiji i potrebna je za ispravnost; prikazivanje kao odvojenih glifova proizvodi tekst koji izvorni čitači odmah prepoznaju kao neispravan. HotPDF obavlja spajanje tokom emitovanja tako da pozivaocima nije potreban Harfbuzz-klasni oblikovač u sopstvenoj putanji koda

 

Persijski / urdu jezgro od 9 slova (v2.119.35): persijski i urdu proširuju arapski slovima koja nisu u bloku Arabic Presentation Forms-B (U+FE70 - U+FEFC). Devet najčešće korišćenih takvih slova - uključujući 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) i HEH GOAL (U+06C1) - imaju prezentacione oblike u Arabic Presentation Forms-A (U+FB50 - U+FDFF). HotPDF sada ta slova mapira na odgovarajući Forms-A glif tokom pozicionog oblikovanja, pa se persijski i urdu tekst prikazuje sa ispravnim init / medi / fina / isol oblicima u bilo kom čitaču

 

Arabic Extended-A + Supplement (v2.119.52, v2.119.56): tabela klasa povezivanja sada pokriva preostale Arabic Extended-A znakove (ALEF WASLA / NOON GHUNNA / varijante HEH), Arabic Supplement U+0750-U+077F i viši opseg Arabic Extended-A U+08A0-U+08FF. Znakovi sa statičkim Presentation Forms-A kodiranjem mapiraju se kroz postojeći 4-pozicioni oblikovač; znakovi bez tog kodiranja (većina Extended-A) dobijaju samo klasifikaciju klase povezivanja tako da susedi budu pravilno oblikovani čak i kada sam znak prođe neizmenjen. v2.119.56 ispravlja dve pogrešne Forms-A mape uvedene u v2.119.52 (U+06C2 / U+06C3)

 

Persian / Urdu potpuna pokrivenost Form-B (v2.119.57): tabela klasa povezivanja proširena je da obuhvati ceo opseg U+0672-U+06D5 (oko 80 znakova koji pokrivaju varijante REH / DAL / SEEN / SAD / TAH / AIN / FEH / QAF / KAF / GAF / LAM / NOON / HEH / WAW / YEH), a dodato je 26 novih mape za Presentation Forms-A (15 D-klasa sa 4 oblika + 11 R-klasa sa 2 oblika). Posebno, urdu standardno 'h' HEH DOACHASHMEE (U+06BE → FBAA-FBAD) i urdu reč-završno yeh YEH BARREE (U+06D2 → FBAE-FBAF) sada se pravilno mapiraju na Forms-A slotove koje je pogrešno koristio privremeni popravak v2.119.52 za ALEF WASLA / NOON GHUNNA. Statička Forms-A pokrivenost sada obuhvata više od 40 izvorskih znakova

 

YEH-HAMZA + samoglasnička ligatura post-pass (v2.119.58): post-pass dodat u _ApplyArabicShaping posle pozicionog oblikovanja pokriva 8 ligaturnih parova u Forms-A bloku U+FBEA-U+FBFB - YEH-HAMZA + ALEF / AE / WAW / U / OE / YU / E / ALEF MAKSURA. Svaki par emituje izolovani oblik (FBEA / FBEC / FBEE / FBF0 / FBF2 / FBF4 / FBF6 / FBF9) plus završni oblik baza+1. Početni / srednji slotovi FBF8 / FBFB prepuštaju se GSUB mehanizmu preko sfArabicGSUB opcije. Zasnovano na istoj šemi kao v2.119.32 LAM-ALEF

 

Allah ligatura (v2.119.60): četvoroznakovni niz ALEF + LAM + LAM + HEH spaja se u U+FDF2 ARABIC LIGATURE ALLAH ISOLATED FORM. Implementirano je kao statički post-pass na nivou kodpoenta posle v2.119.32 LAM-ALEF i v2.119.58 YEH-HAMZA u lancu _ApplyArabicShaping

 

Bismillah frazna ligatura (v2.119.62): standardna fraza Bismillah od 22 kodpoenta "بسم الله الرحمن الرحيم" spaja se u jedan glif U+FDFD ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM. Pokreće se kao prvi pre-pass u _ApplyArabicShaping (pre LAM-ALEF), tako da složeni Bismillah glif stiže do ostatka linije kao jedan kodpoent i downstream zamene ga ne dotiču

 

Public Query Helpers

GetArabicJoiningClass vraća Unicode klasu povezivanja koju koristi statički arapski oblikovač. GetArabicPosition razrešava jedan znak u nizu u izolovani, početni, srednji ili završni položaj tako da pozivaoci mogu da pregledaju ili preslikaju iste odluke oblikovanja pre emitovanja teksta

 

How callers invoke it

Pipelajn oblikovanja radi automatski unutar metoda za emitovanje Unicode teksta - nije potreban eksplicitan poziv "shape this". Prosledite Unicode-ulazne Arabic / Persian / Urdu nizove u THPDFPage.UnicodeTextOut ili THPDFPage.RtLTextOut i HotPDF mapira svaki ulazni kodpoen u njegov oblik prezentacije pre nego što upiše PDF tekstualni operator za prikaz. Originalni Unicode bajtovi se takođe hvataju u FUnicodeUsedCps za generisanje ToUnicode CMap-a, tako da kopiranje / lepljenje na strani čitača i čitači ekrana i dalje vide originalni Unicode payload

 

Font requirements

Font registrovan preko RegisterUnicodeTTF mora da sadrži glifove i za blok Arabic Presentation Forms-B (U+FE70 - U+FEFC) i, za persijski / urdu, za odgovarajući opseg Arabic Presentation Forms-A (U+FB50 - U+FDFF). Preporučeni fontovi koji dolaze sa kompletnim skupom:

 

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

 

Kada registrovanom fontu nedostaje glif za izvedeni oblik prezentacije, HotPDF se vraća na osnovni Unicode codepoint i emituje ga nepromenjenog; čitači potom mogu pokušati sopstveno oblikovanje (Acrobat, Foxit) ili prikazati .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 introduced the opt-in ShapingFeatures: THPDFShapingFeatures property and the THPDFShapingFeature enum, which elevates the shaping pipeline beyond static post-pass folding into automatic GSUB-driven font-specific substitution. Set PDF.ShapingFeatures := [sfArabicGSUB] to apply the registered font's native Arabic init, medi, fina, isol, rlig, calt, and rclt lookups and emit the resulting contextual glyph IDs; add sfCursiveAttachment to apply GPOS cursive entry/exit anchors to that shaped run; add sfStandardLigatures for Latin Standard Ligatures (FB00-FB06 ff / fi / fl / ffi / ffl / ſt / st via v2.119.65 ApplyLatinLigatureRefinement); add sfIndicShaping to enable the Devanagari pre-pass reorder (v2.119.67). Default [] preserves byte-identical output for callers who depend on the static pipeline.

 

Kada je sfArabicGSUB postavljen, statički Unicode Presentation Forms oblikovalac se zaobilazi u korist sopstvenih GSUB pravila fonta. HotPDF ispisuje izvorne kontekstualne ID-eve glifova preko sintetičkih codepointova kada ti glifovi nisu dostupni iz font cmap-a, čuva ugrađeni podskup zatvorenim i upisuje obrnuta ToUnicode mapiranja za kopiranje i lepljenje. Pozivaoci koji žele da statički oblikovalac i dalje radi za pokrivenost codepointova izvan onoga što fontov GSUB navodi treba da ostave sfArabicGSUB isključen i da se oslone na statički lanac post-procesiranja

 

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

Adobe-Identity-UCS ToUnicode CMap koji emituje RegisterUnicodeTTF isporučuje bfchar unose za obrnuto mapiranje za svaki codepoint ligature koji lanac post-prolaza može da proizvede. v2.119.61 dodao je 27 unosa (8 LAM-ALEF + 18 iz porodice YEH-HAMZA + 1 Allah); v2.119.62 dodao je Bismillah (U+FDFD); v2.119.65 dodao je 7 unosa za Latin Standard Ligature (FB00-FB06). Kopiranje / lepljenje na strani čitača razrešava bilo koji glif ligature nazad u izvorni niz codepointa, pa prikazani PDF ostaje pristupačan

 

PUA synthetic codepoint emit (v2.119.68)

AssignSyntheticCodepointForGID(GID; out CP): Boolean + GetSyntheticCodepointForGID(GID): Word omogućavaju da proizvođački kod emituje GSUB zamenske GID-ove koji nemaju prirodan Unicode kodpoent dostupan kroz fontov cmap. Dodeljivač izdaje kodpoente u Private Use Area (U+E000 - U+F8FF, 6400 slotova) i preslikava dodelu u FUnicodeCpToGid (tako da /CIDToGIDMap vraća sintetički CP nazad na ciljnu GID vrednost kod čitača), FAcroFormUnicodeAdvances (tako da v2.65 prelamanje reda pronađe ispravnu em-fraction) i u tabelu povratnog traženja po GID-u (tako da su ponovljeni zahtevi za dodelu idempotentni). Koristite ovo za oblike devanagari klastera, stilističke alternative i CJK ideografske varijacije koje GSUB uvodi, ali cmap ne doseže

 

Relationship to the OpenType GSUB engine

Statički post-pass oblikovač opisan iznad (v2.85.0 + v2.119.32 / 58 / 60 / 62) po podrazumevanju je nezavisan od OpenType GSUB engine-a. Kada je sfArabicGSUB omogućen preko ShapingFeatures, GSUB engine postaje deo puta emitovanja na strani proizvođača: HotPDF konsultuje cmap da izgradi niz osnovnih GID-ova, primenjuje izvorne Arabic pozicione i kontekstualne GSUB pretrage na taj niz glifova, dodeljuje sintetičke codepointe za zamenske glif IDs koji nemaju Unicode Presentation Form i poziva MarkUnicodeGlyphUsed da bi zamenski glifovi ostali unutar ugrađenog font skupa

 

Za zamenske glifove bez Unicode codepointa, pozivaoci kombinuju ShapingFeatures sa v2.119.68 PUA alokatorom sintetičkih codepointa tako da je zamenski GID i dalje dostupan kroz standardni hex pipeline. Statički lanac post-prolaza ostaje podrazumevani rezervni put za codepointe koje deklaracije GSUB fonta ne pokrivaju

 

Scope and limitations

BiDi algoritam ostaje van ove stranice: pozivaoci i dalje moraju sami da poređaju mešane LTR i RTL nizove ili da koriste zasebnu BiDi biblioteku. GPOS, Indic/Tibetan/Mongolian, Hebrew, N'Ko, Adlam, Thai/Lao i Javanese podrška sada živi na zasebnim opt-in stranicama sa zastavicama i API-jima oblikovanja, pa se ova stranica fokusira samo na statičko i GSUB-zasnovano Arabic oblikovanje

 

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