Automatic Shaping Pipeline (Phase 8)

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

 

Arabic Shaping  Multi-Script Shaping  GSUB Engine

Автоматичният конвейер за шейпинг превръща двигателя OpenType GSUB от повърхност за запитване само за възможности в производствена функция, която се прилага автоматично при извеждане на текст в PDF потоци за съдържание. Ползвателите включват конкретни GSUB функции чрез типизиран набор (ShapingFeatures: THPDFShapingFeatures) и HotPDF поема изпълнението на правилните замени, отбелязването на заместващите глифове във вградения поднабор на шрифта и изхода на записите за обратно съпоставяне в ToUnicode CMap, нужни за достъпност

 

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

 

По подразбиране е [] (празен набор), което запазва byte-identical изхода за извикващи, които разчитат на v2.119.32-58 статичния post-pass shaper. Задаването на един или повече флагове превежда engine-а в автоматичен режим за съответните функции

 

sfArabicGSUB - native Arabic GSUB shaping (v2.185.0)

Когато sfArabicGSUB е зададен, HotPDF съпоставя логически арабски пасаж с базови GID на глифове, прилага позиционните lookup-и init, medi, fina и isol на регистрирания шрифт в местата за свързване, избрани за всяка буква, а след това прилага rlig, calt и rclt върху шейпирания пасаж. Заместващите глифове без Unicode кодова точка се извеждат чрез пътя със синтетична кодова точка и обратни съпоставяния в ToUnicode, така че шрифтове, чиито контекстни арабски глифове са извън cmap, все пак могат да бъдат вградени и копирани правилно

 

Задаването на sfArabicGSUB имплицитно заобикаля v2.85.0 статичния 4-позиционен shaper за Arabic - извикващи, които искат статичният shaper да продължи да обработва codepoints извън това, което GSUB на шрифта декларира, трябва да оставят sfArabicGSUB изключен

 

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

Когато sfStandardLigatures е зададен, Latin Standard Ligatures се сгъват автоматично чрез feature-а liga на шрифта. ApplyLatinLigatureRefinement е насочен към блока Alphabetic Presentation Forms (U+FB00-FB4F) - обикновено FB00 ff, FB01 fi, FB02 fl, FB03 ffi, FB04 ffl, FB05 long-s + t, FB06 st. sfContextualLigatures добавя втори проход за feature-а clig на шрифта. И двата прохода използват същия механизъм за обратен cmap като sfArabicGSUB и издават 7 нови записа за обратно съпоставяне в ToUnicode CMap (FB00-FB06), така че копирането / поставянето от страна на четеца връща лигатурата обратно към изходните букви

 

sfContextualAlternates - GSUB 'rclt' (v2.119.66)

Когато sfContextualAlternates е зададен, се прилага feature-ът rclt (Required Contextual Alternates) на шрифта. ApplyArabicGSUBContextualRefinement използва входната точка ApplyContextualSubst от v2.119.47 и обработва изход с променлива дължина N-към-M (замяната се потвърждава само когато всеки заместителен GID е достижим през обратния cmap). Диапазонът на обратния cmap е разширен до FB00-FDFF + FE70-FEFF, за да покрие Latin + Arabic + 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)

Когато sfIndicShaping е зададен, възможността Devanagari във v2.119.55 ApplyDevanagariReorder се издига от ръчен метод до автоматичен предварителен проход, прилаган вътре в трите помощни функции BuildUnicode*FieldContent. Пасажите на Devanagari получават Repha (Ra + Halant в началото на клъстера), преместен в позиция след базата, а предбазовата I-matra (U+093F) се премества преди базовата съгласна на клъстера, така че GSUB двигателят на четеца да улови сричката в правилния ред на визуализиране. Другите Indic пренареждания (надбазови / подбазови matra, образуване на съгласни клъстери) си остават в GSUB на шрифта

 

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

Спътстващото API разкрива кеширания /W em-fraction, за да могат извикващите да изчисляват word-wrap коректно при emission на GSUB-substituted glyphs

 

function GetCodepointAdvance(CP: Cardinal): Single;

 

Връща advance width, получен от hmtx, като част от em за glyph-а, разрешен през cmap при CP. Същата версия поправя и CodeUnitAdvance, така че Arabic Presentation Forms (U+FB50-FDFF + U+FE70-FEFF) да се класифицират като NARROW вместо WIDE, тъй като heuristic fallback-ът беше грешен преди 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.

 

Обхват и ограничения

Конвейерът по избор е умишлено добавъчен спрямо статичния шейпър за следпроцесна обработка - съществуващите ползватели не виждат промяна в поведението, освен ако не го включат изрично. Празният набор [] е безопасният избор за байт-стабилна регресия. Шрифтове без исканите таблици с GSUB feature-и произвеждат безопасен изход без действие (ползвателите не виждат приложена замяна, не се вдигат изключения)

 

Текуща карта на API за шейпинг

Текущият конвейер вече не е само за замяна: sfKerning прилага GPOS pair kerning, sfMarkPositioning прилага отмествания Mark-to-Base и Mark-to-Mark, sfMarkToLigature прилага позициониране Mark-to-Ligature, sfCursiveAttachment прилага подравняване на курсивни входни / изходни котви, sfTibetanShaping прилага Tibetan GSUB шейпинг, sfMongolianShaping прилага Mongolian positional forms, а sfIndicGSUB прилага веригата от Indic GSUB feature-и след пренареждане на сричките. Вижте ShapingFeatures, GPOS methods, и Indic shaping methods

Последните допълнения добавят sfLocalizedForms за locl, calt чрез ApplyGSUBContextualFeature, contextual и vertical GPOS kerning, native Arabic GSUB contextual glyph emission и пътищата за N'Ko, Adlam, Thai/Lao, Hebrew и Javanese. Вижте 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