Automatisk shaping-pipeline (fase 8)

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

 

Arabic Shaping  Multi-Script Shaping  GSUB Engine

Den automatiske shaping-pipelinen løfter OpenType GSUB-motoren fra en ren oppslagsside til en produsentsidefunksjon som brukes automatisk når tekst skrives til PDF-innholdsstrømmer. Kallere aktiverer bestemte GSUB-funksjoner gjennom et typet sett (ShapingFeatures: THPDFShapingFeatures), og HotPDF tar seg av å kjøre de riktige substitusjonene, merke substituttglypher i den innebygde fontunderinndelingen og skrive ToUnicode CMap-omvendte kartoppføringer som trengs for tilgjengelighet

 

Valgfritt rammeverk (v2.119.59 / fase 8a)

En ny enum og egenskap styrer hvilke automatiske substitusjoner som kjøres under tekstutskrift:

 

type

  THPDFShapingFeature = (

    sfArabicGSUB,    // native arabisk init / medi / fina / isol + rlig / calt / rclt

    sfStandardLigatures, // latin 'liga' (ff / fi / fl / ffi / ffl / sft / st)

    sfContextualLigatures,// latin 'clig' (kontekstuelle ligaturer)

    sfContextualAlternates,// 'rclt' (påkrevde kontekstuelle alternativer)

    sfIndicShaping); // Devanagari Repha + omlegging av I-matra foran basen

  THPDFShapingFeatures = set of THPDFShapingFeature;

 

property ShapingFeatures: THPDFShapingFeatures read ... write ...;

 

Standard er [] (tomt sett), som bevarer byte-identisk utdata for kallere som er avhengige av den statiske post-pass-shaperen fra v2.119.32-58. Å sette ett eller flere flagg løfter motoren til automatisk modus for de tilsvarende funksjonene

 

sfArabicGSUB - naturlig arabisk GSUB-forming (v2.185.0)

Når sfArabicGSUB er satt, mapper HotPDF en logisk arabisk sekvens til base glyf-ID-er, bruker den registrerte fontens posisjonsoppslag init, medi, fina og isol på koblingsposisjonene som er valgt for hver bokstav, og bruker deretter rlig, calt og rclt over den formede sekvensen. Erstatningsglyfer som ikke har noe Unicode-kodepunkt sendes ut gjennom den syntetiske kodepunktbanen med ToUnicode-reverse-mappinger, slik at fonter der de kontekstuelle arabiske glyfene ligger utenfor cmap fortsatt kan bygges inn og kopieres riktig

 

Å sette sfArabicGSUB omgår implisitt den statiske 4-posisjoners shaperen for arabisk fra v2.85.0 - kallere som trenger at den statiske shaperen fortsetter å håndtere kodepunkter utenfor det fontens GSUB deklarerer, bør la sfArabicGSUB stå av

 

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

Når sfStandardLigatures er satt, foldes latinske standardligaturer automatisk ved hjelp av fontens liga-funksjon. ApplyLatinLigatureRefinement retter seg mot blokken Alphabetic Presentation Forms (U+FB00-FB4F) - typisk FB00 ff, FB01 fi, FB02 fl, FB03 ffi, FB04 ffl, FB05 long-s + t, FB06 st. sfContextualLigatures legger til en andre passering for fontens clig-funksjon. Begge passeringene bruker samme reverse-cmap-mekanisme som sfArabicGSUB og sender ut 7 nye ToUnicode CMap reverse-mapping-oppføringer (FB00-FB06) slik at kopier / lim inn på lesersiden løser ligaturen tilbake til kildebokstavene

 

sfContextualAlternates - GSUB 'rclt' (v2.119.66)

Når sfContextualAlternates er satt, brukes fontens rclt-funksjon (Required Contextual Alternates). ApplyArabicGSUBContextualRefinement bruker v2.119.47-inngangspunktet ApplyContextualSubst og håndterer N-til-M-utdata med variabel lengde (substitusjonen forpliktes bare når hver erstatnings-GID kan nås gjennom reverse cmap). Reverse cmap-området utvides til FB00-FDFF + FE70-FEFF for å dekke latinske, arabiske og hebraiske Presentation Forms

 

Typiske brukere av rclt: arabisk init / medi / fina / isol når fonten driver posisjonell forming gjennom GSUB i stedet for gjennom Unicode Presentation Forms-kodepunkter; visse regler for disambiguering av latinske sekvenser; indik-formingens pres / blws / psts / half / pstf / cjct-funksjoner når de er registrert som rclt av fontdesigneren

 

sfIndicShaping - fase 8e (v2.119.67)

Når sfIndicShaping er satt, løftes devanagari-funksjonen ApplyDevanagariReorder fra en manuell metode til en automatisk pre-pass som brukes inne i de tre hjelperne BuildUnicode*FieldContent. Devanagari-sekvenser får Repha (Ra + Halant i starten av en klasse) flyttet til post-base-posisjonen, og pre-base I-matra (U+093F) flyttet foran klassens basekonsonant, slik at konsumentleserens GSUB-motor plukker opp stavelsen i riktig renderingsrekkefølge. Andre indik-omlegginger (matra over basen / under basen, konjunktdannelse) blir liggende i fontens GSUB

 

Støtte for advance-oppslag (v2.119.64 / fase 8c.5)

En tilhørende API eksponerer den bufrede /W-em-fraksjonen slik at kallere kan beregne ordombryting korrekt når GSUB-substituerte glyfer sendes ut:

 

function GetCodepointAdvance(CP: Cardinal): Single;

 

Returnerer den hmtx-avledede advance-bredden som en brøkdel av em for glyfen ved CP som er løst gjennom cmap. Den samme utgivelsen rettet også CodeUnitAdvance slik at Arabic Presentation Forms (U+FB50-FDFF + U+FE70-FEFF) klassifiseres som NARROW i stedet for WIDE (heuristikk-fallbacken var feil før v2.65)

 

Typisk arbeidsflyt (full automatisk arabisk forming)

 

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;

 

Typisk arbeidsflyt (latinske standardligaturer + devanagari-omlegging)

 

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

 

Ferdigstilling av fase 8-veikartet

Fase 8a (v2.119.59) valgfritt rammeverk + arabisk funksjon; fase 8b (v2.119.65) latinske standardligaturer; fase 8c.1 (v2.119.60) Allah; fase 8c.2 (v2.119.63) GID-nivå GSUB rlig; fase 8c.3 (v2.119.61) ToUnicode reverse mapping; fase 8c.4 (v2.119.62) Bismillah; fase 8c.5 (v2.119.64) advance-oppslag + heuristisk retting; fase 8c.6 (v2.119.68) utsending av syntetiske kodepunkt fra PUA; fase 8d ble rullet inn i 8c-underfasene; fase 8e (v2.119.67) automatisk devanagari-omlegging. Med v2.119.68 er fase 8s funksjonsmatrise lukket; videre forbedringer (flere Indic-skrifter, OpenType GPOS-posisjonering, BiDi-løsning) spores som egne veikartpunkter

 

Omfang og begrensninger

Den valgfrie pipelinen er bevisst additiv oppå den statiske post-pass-shaperen - eksisterende kallere ser ingen endring i oppførsel med mindre de velger den inn. Standardsettet [] er det sikre valget for byte-stabil regresjon. Fonter uten de forespurte GSUB-funktabellene produserer trygg no-op-utdata (kallere ser ingen substitusjon, ingen unntak blir kastet)

 

Gjeldende kart over formings-API-er

Den nåværende pipelinen er ikke lenger bare substitusjonsbasert: sfKerning bruker GPOS-parkerning, sfMarkPositioning bruker Mark-to-Base- og Mark-to-Mark-forskyvninger, sfMarkToLigature bruker Mark-to-Ligature-plassering, sfCursiveAttachment bruker kursiv inn-/utgangsankerjustering, sfTibetanShaping bruker tibetansk GSUB-forming, sfMongolianShaping bruker mongolske posisjonsformer, og sfIndicGSUB bruker den indik-GSUB-funksjonskjeden etter stavelsesomlegging. Se ShapingFeatures, GPOS-metoder og Indic-formingsmetoder

Nye tillegg inkluderer sfLocalizedForms for locl, calt gjennom ApplyGSUBContextualFeature, kontekstuell og vertikal GPOS-kerning, naturlig arabisk GSUB-kontekstuell glyphutskrift, og baner for N'Ko, Adlam, Thai/Lao, hebraisk og Javanesisk. Se forbehandlingsmetoder for skriptforming

 

Se også: OpenType GSUB-erstatningsmotor, Støtte for arabisk / persisk / urdu-forming, Støtte for syrisk / mongolsk / devanagari-forming, THotPDF.AssignSyntheticCodepointForGID, CFF / OpenType-fontunderinndeling