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