Automatic Shaping Pipeline (Phase 8)

Opt-in producer-side GSUB pipeline (v2.119.59 - v2.120.10)

 

Arabic Shaping  Multi-Script Shaping  GSUB Engine

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