Automatická pipeline tvarování (Phase 8)

Opt-in GSUB pipeline na straně producenta (v2.119.59 - v2.120.10)

 

Arabic Shaping  Multi-Script Shaping  GSUB Engine

Automatická pipeline tvarování povyšuje engine OpenType GSUB z pouhého dotazovacího rozhraní schopností na funkci na straně producenta, která se automaticky aplikuje při emitování textu do obsahových streamů PDF. Volající zapínají konkrétní funkce GSUB přes typovanou množinu (ShapingFeatures: THPDFShapingFeatures) a HotPDF se postará o spuštění správných substitucí, označení náhradních glyphů ve vloženém subsetu fontu a emisi reverzních mapovacích položek ToUnicode CMap potřebných pro přístupnost

 

Opt-in framework (v2.119.59 / Phase 8a)

Nový výčet a vlastnost řídí, které automatické substituce se spustí během emise textu:

 

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

 

Výchozí hodnota je [] (prázdná množina), která zachovává bajtově identický výstup pro volající závislé na statickém post-pass shaperu v2.119.32-58. Nastavení jednoho nebo více flagů povýší engine do automatického režimu pro odpovídající funkce

 

sfArabicGSUB - native Arabic GSUB shaping (v2.185.0)

Když je nastaveno sfArabicGSUB, HotPDF mapuje logický arabský běh na základní ID glyphů, aplikuje poziční lookupy registrovaného fontu init, medi, fina a isol ve spojovacích pozicích vybraných pro každé písmeno a potom nad vytvarovaným během aplikuje rlig, calt a rclt. Náhradní glyfy bez Unicode codepointu se emitují přes cestu syntetických codepointů s reverzním mapováním ToUnicode, takže fonty, jejichž kontextové arabské glyfy žijí mimo cmap, lze stále správně vložit a kopírovat

 

Nastavení sfArabicGSUB implicitně obejde statický čtyřpoziční arabský shaper z v2.85.0 - volající, kteří potřebují, aby statický shaper dál zpracovával codepointy mimo to, co deklaruje GSUB fontu, by měli nechat sfArabicGSUB vypnuté

 

sfStandardLigatures / sfContextualLigatures - Phase 8b (v2.119.65)

Když je nastaveno sfStandardLigatures, latinské Standard Ligatures se automaticky skládají pomocí funkce fontu liga. ApplyLatinLigatureRefinement cílí na blok Alphabetic Presentation Forms (U+FB00-FB4F) - typicky FB00 ff, FB01 fi, FB02 fl, FB03 ffi, FB04 ffl, FB05 long-s + t, FB06 st. sfContextualLigatures přidává druhý průchod pro funkci fontu clig. Oba průchody používají stejný mechanismus reverse-cmap jako sfArabicGSUB a emitují 7 nových reverzních mapovacích položek ToUnicode CMap (FB00-FB06), takže kopírování / vložení ve čtečce dokumentů vyřeší ligaturu zpět na zdrojová písmena

 

sfContextualAlternates - GSUB 'rclt' (v2.119.66)

Když je nastaveno sfContextualAlternates, aplikuje se funkce fontu rclt (Required Contextual Alternates). ApplyArabicGSUBContextualRefinement používá vstupní bod ApplyContextualSubst z v2.119.47 a zpracovává výstup proměnné délky N-to-M (substituce se potvrdí jen tehdy, když je každé náhradní GID dosažitelné přes reverzní cmap). Rozsah reverse cmap je rozšířen na FB00-FDFF + FE70-FEFF, aby pokryl Latin + Arabic + Hebrew Presentation Forms

 

Kanonická použití rclt: arabské init / medi / fina / isol, když font řídí poziční tvarování přes GSUB místo přes codepointy Unicode Presentation Forms; některá pravidla rozlišení latinských sekvencí; funkce indického tvarování pres / blws / psts / half / pstf / cjct, pokud je návrhář fontu zaregistroval jako rclt

 

sfIndicShaping - Phase 8e (v2.119.67)

Když je nastaveno sfIndicShaping, schopnost Devanagari ApplyDevanagariReorder z v2.119.55 se povýší z ruční metody na automatický pre-pass aplikovaný uvnitř tří pomocných funkcí BuildUnicode*FieldContent. Běhy Devanagari dostanou Repha (Ra + Halant na začátku clusteru) přesunuté do post-base pozice a pre-base I-matra (U+093F) přesunuté před základní souhlásku clusteru, takže GSUB engine čtečky dokumentů zachytí slabiku ve správném pořadí vykreslení. Ostatní indické reorder operace (above-base / below-base matra, tvorba konjunktů) zůstávají v GSUB fontu

 

Podpora dotazu na advance (v2.119.64 / Phase 8c.5)

Doprovodné API zpřístupňuje cachovaný em-fraction /W, aby volající mohli správně počítat word-wrap při emitování glyphů substituovaných přes GSUB:

 

function GetCodepointAdvance(CP: Cardinal): Single;

 

Vrací advance width odvozený z hmtx jako zlomek em pro glyph vyřešený přes cmap na CP. Stejné vydání také opravilo CodeUnitAdvance, aby klasifikovalo Arabic Presentation Forms (U+FB50-FDFF + U+FE70-FEFF) jako NARROW místo WIDE (heuristický fallback byl před v2.65 chybný)

 

Typický pracovní postup (plné automatické arabské tvarování)

 

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;

 

Typický pracovní postup (latinské standardní ligatury + 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

 

Uzavření roadmap Phase 8

Phase 8a (v2.119.59) opt-in framework + arabská schopnost; Phase 8b (v2.119.65) latinské standardní ligatury; Phase 8c.1 (v2.119.60) Allah; Phase 8c.2 (v2.119.63) GSUB rlig na úrovni GID; Phase 8c.3 (v2.119.61) reverzní mapování ToUnicode; Phase 8c.4 (v2.119.62) Bismillah; Phase 8c.5 (v2.119.64) dotaz na advance + oprava heuristiky; Phase 8c.6 (v2.119.68) emise syntetického codepointu PUA; Phase 8d byla začleněna do podfází 8c; Phase 8e (v2.119.67) automatický reorder Devanagari. S v2.119.68 je matice schopností Phase 8 uzavřená; další vylepšení (další indická písma, polohování OpenType GPOS, řešení BiDi) jsou sledována v samostatných položkách roadmap

 

Rozsah a omezení

Opt-in pipeline je záměrně aditivní nad statickým post-pass shaperem - existující volající neuvidí změnu chování, pokud ji výslovně nezapnou. Výchozí množina [] je bezpečná volba pro bajtově stabilní regresi. Fonty bez požadovaných tabulek funkcí GSUB vytvoří bezpečný no-op výstup (volající neuvidí aplikovanou substituci ani vyhozené výjimky)

 

Aktuální mapa API tvarování

Aktuální pipeline už není jen substituční: sfKerning aplikuje párový kerning GPOS, sfMarkPositioning aplikuje offsety Mark-to-Base a Mark-to-Mark, sfMarkToLigature aplikuje umístění Mark-to-Ligature, sfCursiveAttachment aplikuje zarovnání kurzivních vstupních/výstupních anchorů, sfTibetanShaping aplikuje tibetské GSUB tvarování, sfMongolianShaping aplikuje mongolské poziční tvary a sfIndicGSUB aplikuje indický řetězec funkcí GSUB po reorderu slabiky. Viz ShapingFeatures, metody GPOS a metody indického tvarování

Nedávné doplňky přidávají sfLocalizedForms pro locl, calt přes ApplyGSUBContextualFeature, kontextový a vertikální kerning GPOS, nativní emisi arabských kontextových glyphů GSUB a cesty N'Ko, Adlam, Thai/Lao, Hebrew a Javanese. Viz metody předzpracování tvarování písem

 

Viz také: Substituční engine OpenType GSUB, Podpora Arabic / Persian / Urdu Shaping, Tvarování Syriac / Mongolian / Devanagari, THotPDF.AssignSyntheticCodepointForGID, Subsetování fontů CFF / OpenType