|
Pipeline-ul automat de shaping transformă motorul OpenType GSUB dintr-o suprafață de interogare doar pentru capabilități într-o funcție pe partea producătorului care se aplică automat pe măsură ce textul este emis în fluxurile de conținut PDF. Apelanții activează capabilități GSUB specifice printr-un set tipizat (ShapingFeatures: THPDFShapingFeatures), iar HotPDF se ocupă de rularea substituțiilor potrivite, marcarea glifelor de substituție în subsetul de font încorporat și emiterea intrărilor de reverse-mapping din CMap-ul ToUnicode necesare pentru accesibilitate
Cadru opt-in (v2.119.59 / Phase 8a)
Un enum și o proprietate noi controlează ce substituții automate rulează în timpul emiterii textului:
type
THPDFShapingFeature = (
sfArabicGSUB, // native Arabic init / medi / fina / isol + rlig / calt / rclt
sfStandardLigatures, // Latin 'liga' (ff / fi / fl / ffi / ffl / sft / st)
sfContextualLigatures,// Latin 'clig' (contextual ligatures)
sfContextualAlternates,// 'rclt' (Required Contextual Alternates)
sfIndicShaping); // Devanagari Repha + pre-base I-matra reorder
THPDFShapingFeatures = set of THPDFShapingFeature;
property ShapingFeatures: THPDFShapingFeatures read ... write ...;
Valoarea implicită este [] (set gol), ceea ce păstrează o ieșire identică la nivel de octeți pentru apelanții care depind de shaperul static de post-pass din v2.119.32-58. Setarea unuia sau mai multor steaguri mută motorul în modul automat pentru capabilitățile corespunzătoare
sfArabicGSUB - shaping arab nativ GSUB (v2.185.0)
Când sfArabicGSUB este setat, HotPDF mapează un șir logic arab la ID-uri de glif de bază, aplică lookup-urile poziționale init, medi, fina și isol ale fontului înregistrat la pozițiile de alipire selectate pentru fiecare literă, apoi aplică rlig, calt și rclt peste șirul format. Glifele de substituție care nu au codepoint Unicode sunt emise prin traseul de codepoint sintetic cu mapări inverse ToUnicode, astfel încât fonturile ale căror glife arabe contextuale se află în afara cmap-ului să poată fi totuși încorporate și copiate corect
Setarea sfArabicGSUB ocolește implicit shaperul static arab cu 4 poziții din v2.85.0 - apelanții care au nevoie ca shaperul static să continue să trateze codepointuri dincolo de ce declară GSUB-ul fontului ar trebui să lase sfArabicGSUB dezactivat
sfStandardLigatures / sfContextualLigatures - Phase 8b (v2.119.65)
Când sfStandardLigatures este setat, Latin Standard Ligatures sunt pliate automat folosind capabilitatea liga a fontului. ApplyLatinLigatureRefinement țintește blocul Alphabetic Presentation Forms (U+FB00-FB4F) - de regulă FB00 ff, FB01 fi, FB02 fl, FB03 ffi, FB04 ffl, FB05 long-s + t, FB06 st. sfContextualLigatures adaugă o a doua trecere pentru capabilitatea clig a fontului. Ambele treceri folosesc același mecanism reverse-cmap ca sfArabicGSUB și emit 7 noi intrări de reverse-mapping ToUnicode CMap (FB00-FB06), astfel încât copy / paste-ul din cititorul PDF să rezolve ligatura înapoi la literele sursă
sfContextualAlternates - GSUB 'rclt' (v2.119.66)
Când sfContextualAlternates este setat, este aplicată capabilitatea rclt (Required Contextual Alternates) a fontului. ApplyArabicGSUBContextualRefinement folosește punctul de intrare ApplyContextualSubst din v2.119.47 și gestionează ieșire variabilă N-to-M (substituția este confirmată doar când fiecare GID de înlocuire este accesibil prin reverse-cmap). Intervalul reverse-cmap este extins la FB00-FDFF + FE70-FEFF pentru a acoperi Latin + Arabic + Hebrew Presentation Forms
Utilizări canonice ale rclt: Arabic init / medi / fina / isol atunci când fontul conduce shapingul pozițional prin GSUB, nu prin codepointuri Unicode Presentation Forms; anumite reguli de dezambiguizare a secvențelor latine; capabilitățile Indic pres / blws / psts / half / pstf / cjct atunci când designerul fontului le înregistrează ca rclt
sfIndicShaping - Phase 8e (v2.119.67)
Când sfIndicShaping este setat, capabilitatea Devanagari ApplyDevanagariReorder din v2.119.55 este promovată din metodă manuală în pre-pass automat aplicat în cele trei helper-e BuildUnicode*FieldContent. Șirurile Devanagari primesc Repha (Ra + Halant la începutul clusterului) mutat în poziția post-base, iar I-matra pre-base (U+093F) este mutat înaintea consoanei de bază a clusterului, astfel încât motorul GSUB al cititorului consumator să preia silaba în ordinea corectă de randare. Alte reorder-uri Indic (matra deasupra / dedesubtul bazei, formarea conjunctelor) rămân în GSUB-ul fontului
Suport pentru interogarea avansului (v2.119.64 / Phase 8c.5)
Un API companion expune fracția em din /W memorată în cache, astfel încât apelanții să poată calcula corect word-wrap-ul atunci când emit glife substituite prin GSUB:
function GetCodepointAdvance(CP: Cardinal): Single;
Returnează lățimea de avans derivată din hmtx ca fracție de em pentru gliful rezolvat prin cmap la CP. Aceeași versiune a corectat și CodeUnitAdvance astfel încât să clasifice Arabic Presentation Forms (U+FB50-FDFF + U+FE70-FEFF) ca NARROW și nu WIDE (fallback-ul euristic era greșit înainte de v2.65)
Flux tipic (auto-shaping arab complet)
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;
Flux tipic (Latin Standard Ligatures + reorder Devanagari)
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
Închiderea roadmap-ului Phase 8
Phase 8a (v2.119.59) cadru opt-in + capabilitate arabă; Phase 8b (v2.119.65) ligaturi standard latine; Phase 8c.1 (v2.119.60) Allah; Phase 8c.2 (v2.119.63) GSUB rlig la nivel de GID; Phase 8c.3 (v2.119.61) mapare inversă ToUnicode; Phase 8c.4 (v2.119.62) Bismillah; Phase 8c.5 (v2.119.64) interogarea avansului + corecția euristică; Phase 8c.6 (v2.119.68) emiterea de codepointuri sintetice PUA; Phase 8d a fost înglobată în sub-fazele 8c; Phase 8e (v2.119.67) reorder automat Devanagari. Cu v2.119.68, matricea de capabilități Phase 8 este închisă; rafinamentele ulterioare (scripturi Indic suplimentare, poziționare OpenType GPOS, rezolvarea BiDi) sunt urmărite în elemente separate ale roadmap-ului
Domeniu și limitări
Pipeline-ul opt-in este intenționat aditiv față de shaperul static de post-pass - apelanții existenți nu văd nicio schimbare de comportament decât dacă activează explicit opțiunea. Setul implicit [] este alegerea sigură pentru regresii cu ieșire stabilă la nivel de octeți. Fonturile fără tabelele de capabilități GSUB cerute produc o ieșire sigură de tip no-op (apelanții nu văd nicio substituție aplicată și nu apar excepții)
Harta curentă a API-ului de shaping
Pipeline-ul curent nu mai este doar pentru substituții: sfKerning aplică kerning GPOS pe perechi, sfMarkPositioning aplică offseturi Mark-to-Base și Mark-to-Mark, sfMarkToLigature aplică poziționarea Mark-to-Ligature, sfCursiveAttachment aplică alinierea ancorelor de intrare / ieșire pentru scriere cursivă, sfTibetanShaping aplică shaping GSUB pentru tibetană, sfMongolianShaping aplică forme poziționale mongole, iar sfIndicGSUB aplică lanțul de capabilități GSUB pentru Indic după reorder-ul silabelor. Vedeți ShapingFeatures, metodele GPOS și metodele de shaping Indic
Adăugirile recente includ sfLocalizedForms pentru locl, calt prin ApplyGSUBContextualFeature, kerning GPOS contextual și vertical, emiterea nativă de glife contextuale GSUB pentru araba și rutele pentru N'Ko, Adlam, Thai/Lao, Hebrew și Javanese. Vedeți metodele de preprocesare a shapingului pentru scripturi
See also: OpenType GSUB Substitution Engine, Arabic / Persian / Urdu Shaping Support, Syriac / Mongolian / Devanagari Shaping, THotPDF.AssignSyntheticCodepointForGID, CFF / OpenType Font Subsetting
|