Automatic Shaping Pipeline (Phase 8)

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

 

Arabic Shaping  Multi-Script Shaping  GSUB Engine

Automatinė formavimo grandinė OpenType GSUB variklį iš galimybių tikrinimo pavertžia gamintojo pusės funkcija, kuri automatiškai taikoma tekstui keliaujant į PDF turinio srautus. Kūrėjai konkrečias GSUB funkcijas įjungia per tipizuotą rinkinį (ShapingFeatures: THPDFShapingFeatures), o HotPDF pasirūpina tinkamais pakeitimais, pakaitinius glifus pažymi į įdėtą šrifto pogrupį ir išveda ToUnicode CMap atvirkštinio susiejimo įrašus, reikalingus prieinamumui

 

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

A new enum and property control which automatic substitutions run during text emission:

 

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

 

Numatytoji reikšmė yra [] (tuščias rinkinys), kuri išlaiko baitas į baitą identišką išvestį kviestinėms pusėms, kurios remiasi v2.119.32-58 statiniu post-paso formuotoju. Nustačius vieną ar daugiau vėliavų, variklis atitinkamoms funkcijoms pereina į automatinį režimą

 

sfArabicGSUB - native Arabic GSUB shaping (v2.185.0)

Kai nustatytas sfArabicGSUB, HotPDF logišką Arabic atkarpą susieja su baziniais glifų ID, kiekvienai raidei pasirinktose jungimo vietose taiko registruoto šrifto positional init, medi, fina ir isol paieškas, o tada pritaiko rlig, calt ir rclt visam suformuotam srautui. Pakaitiniai glifai be Unicode kodinio taško išvedami per sintetinių kodinių taškų kelią su ToUnicode atvirkštiniais susiejimais, todėl šriftai, kurių kontekstiniai Arabic glifai gyvena už cmap ribų, vis tiek gali būti įterpti ir teisingai kopijuojami

 

Nustačius sfArabicGSUB, v2.85.0 statinis 4 pozicijų arabų formuotuvas apeinamas implicitiškai - kviestinės pusės, kurioms reikia, kad statinis formuotuvas toliau tvarkytų už šrifto GSUB deklaruojamų ribų esančius kodo taškus, turėtų palikti sfArabicGSUB išjungtą

 

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

Kai nustatytas sfStandardLigatures, lotyniškos Standard Ligatures automatiškai sujungiamos naudojant šrifto liga funkciją. ApplyLatinLigatureRefinement taiko Alphabetic Presentation Forms bloką (U+FB00-FB4F) - paprastai FB00 ff, FB01 fi, FB02 fl, FB03 ffi, FB04 ffl, FB05 long-s + t, FB06 st. sfContextualLigatures prideda antrą praėjimą šrifto clig funkcijai. Abu praėjimai naudoja tą patį reverse-cmap mechanizmą kaip sfArabicGSUB ir išveda 7 naujus ToUnicode CMap atvirkštinio susiejimo įrašus (FB00-FB06), kad vartotojo skaitytuvo kopijavimas / įklijavimas susietų ligatūrą atgal su šaltinio raidėmis

 

sfContextualAlternates - GSUB 'rclt' (v2.119.66)

Kai nustatytas sfContextualAlternates, taikoma šrifto rclt (Required Contextual Alternates) funkcija. ApplyArabicGSUBContextualRefinement naudoja v2.119.47 ApplyContextualSubst įėjimo tašką ir apdoroja kintamo ilgio N-to-M išvestį (pakeitimas įtvirtinamas tik tada, kai kiekvienas pakaitinis GID yra pasiekiamas per reverse cmap). Reverse cmap diapazonas išplečiamas iki FB00-FDFF + FE70-FEFF, kad apimtų lotyniškas, Arabic ir Hebrew Presentation Forms

 

Canonical users of rclt: Arabic init / medi / fina / isol when the font drives positional shaping through GSUB instead of through Unicode Presentation Forms codepoints; certain Latin sequence disambiguation rules; Indic shaping pres / blws / psts / half / pstf / cjct features when registered as rclt by the font designer.

 

sfIndicShaping - Phase 8e (v2.119.67)

Kai nustatytas sfIndicShaping, v2.119.55 Devanagari galimybė ApplyDevanagariReorder iš rankinio metodo tampa automatiniu išankstiniu praėjimu, taikomu trijų BuildUnicode*FieldContent pagalbinių funkcijų viduje. Devanagari atkarpose Repha (Ra + Halant klasterio pradžioje) perkeliamas į post-base poziciją, o priešpriešinis I-matra (U+093F) pastumiamas prieš klasterio bazinį priebalsį, kad vartotojo skaitytuvo GSUB variklis skiemenį paimtų teisinga atvaizdavimo tvarka. Kiti Indic pertvarkymai (above-base / below-base matra, conjunct formavimas) lieka šrifto GSUB viduje

 

Advance-query support (v2.119.64 / Phase 8c.5)

Priedo API pateikia talpinamą /W em-frakciją, todėl iškvietėjai gali tiksliai apskaičiuoti žodžio laužymą generuojant GSUB pakeistus glifus

 

function GetCodepointAdvance(CP: Cardinal): Single;

 

Grąžina iš hmtx gautą poslinkio plotį kaip em dalį cmap išspręstam glifui ties CP. Ta pati laida taip pat sutvarkė CodeUnitAdvance, kad Arabic Presentation Forms (U+FB50-FDFF + U+FE70-FEFF) būtų klasifikuojami kaip NARROW, o ne WIDE (euristinis atsarginis variantas tiems blokams buvo neteisingas prieš v2.65)

 

Typical workflow (full Arabic auto-shaping)

 

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;

 

Typical workflow (Latin standard ligatures + Devanagari reorder)

 

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

 

Phase 8 roadmap closure

Phase 8a (v2.119.59) opt-in framework + Arabic capability; Phase 8b (v2.119.65) Latin standard ligatures; Phase 8c.1 (v2.119.60) Allah; Phase 8c.2 (v2.119.63) GID-level GSUB rlig; Phase 8c.3 (v2.119.61) ToUnicode reverse mapping; Phase 8c.4 (v2.119.62) Bismillah; Phase 8c.5 (v2.119.64) advance query + heuristic fix; Phase 8c.6 (v2.119.68) PUA synthetic codepoint emit; Phase 8d was rolled into 8c sub-phases; Phase 8e (v2.119.67) Devanagari auto-reorder. With v2.119.68 the Phase 8 capability matrix is closed; further refinements (additional Indic scripts, OpenType GPOS positioning, BiDi resolution) are tracked under separate roadmap items.

 

Scope and limitations

Pasirenkama grandinė sąmoningai yra priedas prie statinio post-pass formuotojo - esamiems kūrėjams elgesys nesikeičia, kol jie jos neįjungia. Numatytoji [] rinkinio būsena yra saugus pasirinkimas baitų stabilumo regresijoms. Šriftai be prašomų GSUB funkcijų lentelių išveda saugų neveikiantį rezultatą (kūrėjas nemato taikomo pakeitimo, nekyla jokių išimčių)

 

Dabartinis formavimo API žemėlapis

Dabartinė grandinė jau neapsiriboja tik pakeitimais: sfKerning taiko GPOS porinį kerningą, sfMarkPositioning taiko Mark-to-Base ir Mark-to-Mark poslinkius, sfMarkToLigature taiko Mark-to-Ligature išdėstymą, sfCursiveAttachment taiko kursyvinės įvedimo / išvedimo inkarų lygiavimą, sfTibetanShaping taiko Tibetan GSUB formavimą, sfMongolianShaping taiko Mongolian pozicines formas, o sfIndicGSUB po skiemenų pertvarkymo taiko Indic GSUB funkcijų grandinę. Žr. ShapingFeatures, GPOS metodus ir Indic formavimo metodus

Naujesni papildymai prideda sfLocalizedForms locl, calt per ApplyGSUBContextualFeature, kontekstinį ir vertikalų GPOS kerną, vietinį arabų GSUB kontekstinių glifų išvedimą ir N'Ko, Adlam, Thai/Lao, Hebrew bei Javanese kelius. Žr. script shaping preprocess methods

 

See also: OpenType GSUB Substitution Engine, Arabic / Persian / Urdu Shaping Support, Syriac / Mongolian / Devanagari Shaping, THotPDF.AssignSyntheticCodepointForGID, CFF / OpenType Font Subsetting