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