Automatic Shaping Pipeline (Phase 8)

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

 

Arabic Shaping  Multi-Script Shaping  GSUB Engine

Η αυτόματη pipeline shaping ανεβάζει το OpenType GSUB engine από επιφάνεια μόνο ερωτήσεων δυνατοτήτων σε λειτουργία παραγωγού που εφαρμόζεται αυτόματα καθώς το κείμενο εκπέμπεται σε PDF content streams. Οι callers ενεργοποιούν συγκεκριμένα GSUB features μέσω ενός typed set (ShapingFeatures: THPDFShapingFeatures) και το HotPDF αναλαμβάνει την εκτέλεση των σωστών substitutions, τη σήμανση των substitute glyphs στο embedded font subset και την εκπομπή των ToUnicode CMap reverse-mapping entries που χρειάζονται για προσβασιμότητα

 

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

 

Προεπιλογή είναι [] (κενό set), που διατηρεί byte-identical έξοδο για callers που εξαρτώνται από τον στατικό post-pass shaper της v2.119.32-58. Ορισμός μίας ή περισσότερων flags ανεβάζει το engine σε αυτόματη λειτουργία για τα αντίστοιχα features

 

sfArabicGSUB - native Arabic GSUB shaping (v2.185.0)

Όταν είναι ορισμένο το sfArabicGSUB, το HotPDF χαρτογραφεί ένα λογικό αραβικό run σε base glyph IDs, εφαρμόζει τα positional init, medi, fina και isol lookups της καταχωρισμένης γραμματοσειράς στις joining positions που επιλέγονται για κάθε γράμμα, και έπειτα εφαρμόζει rlig, calt και rclt πάνω στο shaped run. Substitute glyphs που δεν έχουν Unicode codepoint εκπέμπονται μέσω της synthetic-codepoint διαδρομής με ToUnicode reverse mappings, ώστε γραμματοσειρές των οποίων τα contextual Arabic glyphs ζουν έξω από το cmap να μπορούν ακόμη να ενσωματώνονται και να αντιγράφονται σωστά

 

Ο ορισμός sfArabicGSUB παρακάμπτει σιωπηρά τον στατικό αραβικό shaper 4 θέσεων της v2.85.0· callers που χρειάζονται ο στατικός shaper να συνεχίσει να χειρίζεται codepoints εκτός όσων δηλώνει το GSUB της γραμματοσειράς πρέπει να αφήσουν απενεργοποιημένο το sfArabicGSUB

 

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

Όταν είναι ορισμένο το sfStandardLigatures, οι Latin Standard Ligatures συγχωνεύονται αυτόματα με χρήση του feature liga της γραμματοσειράς. Το ApplyLatinLigatureRefinement στοχεύει το block Alphabetic Presentation Forms (U+FB00-FB4F) - συνήθως FB00 ff, FB01 fi, FB02 fl, FB03 ffi, FB04 ffl, FB05 long-s + t, FB06 st. Το sfContextualLigatures προσθέτει δεύτερο pass για το feature clig της γραμματοσειράς. Και τα δύο passes χρησιμοποιούν τον ίδιο μηχανισμό reverse-cmap με το sfArabicGSUB και εκπέμπουν 7 νέες ToUnicode CMap reverse-mapping entries (FB00-FB06), ώστε το copy / paste στον consumer reader να επιλύει τη ligature πίσω στα αρχικά γράμματα

 

sfContextualAlternates - GSUB 'rclt' (v2.119.66)

Όταν είναι ορισμένο το sfContextualAlternates, εφαρμόζεται το feature rclt (Required Contextual Alternates) της γραμματοσειράς. Το ApplyArabicGSUBContextualRefinement χρησιμοποιεί το entry point ApplyContextualSubst της v2.119.47 και χειρίζεται N-to-M output μεταβλητού μήκους (η substitution επιβεβαιώνεται μόνο όταν κάθε replacement GID είναι προσβάσιμο μέσω του reverse cmap). Το εύρος reverse 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 ApplyDevanagariReorder της v2.119.55 προάγεται από χειροκίνητη μέθοδο σε αυτόματο pre-pass που εφαρμόζεται μέσα στους τρεις helpers BuildUnicode*FieldContent. Τα Devanagari runs μετακινούν Repha (Ra + Halant στην αρχή cluster) στη post-base θέση και την pre-base I-matra (U+093F) πριν από το base consonant του cluster, ώστε το GSUB engine του consumer reader να λάβει τη συλλαβή στη σωστή σειρά απόδοσης. Άλλες Indic reorders (above-base / below-base matra, conjunct formation) παραμένουν στο GSUB της γραμματοσειράς

 

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

Μια συνοδευτική API εκθέτει το cached /W em-fraction, ώστε οι callers να μπορούν να υπολογίζουν σωστά word-wrap όταν εκπέμπουν 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.

 

Scope and limitations

Η opt-in pipeline είναι σκόπιμα προσθετική πάνω από τον στατικό post-pass shaper· οι υπάρχοντες callers δεν βλέπουν αλλαγή συμπεριφοράς εκτός αν την ενεργοποιήσουν. Το προεπιλεγμένο set [] είναι η ασφαλής επιλογή για byte-stable regression. Γραμματοσειρές χωρίς τα ζητούμενα GSUB feature tables παράγουν ασφαλή no-op έξοδο (οι callers δεν βλέπουν substitution και δεν σηκώνεται εξαίρεση)

 

Τρέχων χάρτης API shaping

Η τρέχουσα pipeline δεν είναι πλέον μόνο substitution: το sfKerning εφαρμόζει GPOS pair kerning, το sfMarkPositioning εφαρμόζει Mark-to-Base και Mark-to-Mark offsets, το sfMarkToLigature εφαρμόζει Mark-to-Ligature placement, το sfCursiveAttachment εφαρμόζει ευθυγράμμιση cursive entry/exit anchors, το sfTibetanShaping εφαρμόζει Tibetan GSUB shaping, το sfMongolianShaping εφαρμόζει Mongolian positional forms και το sfIndicGSUB εφαρμόζει την Indic GSUB feature chain μετά από syllable reorder. Δείτε 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