|
Syriac / Mongolian / Devanagari Shaping Support Multi-script capability surfaces (v2.119.53 - v2.119.55)
|
Arabic Shaping Auto Shaping Pipeline GSUB Engine |
|
Το HotPDF εκθέτει επιφάνειες δυνατοτήτων joining-class / positional-analysis / Indic syllabic-category για τρία σύνθετα scripts πέρα από τα αραβικά: Syriac (U+0700-U+074F), Mongolian (U+1800-U+18AF) και Devanagari (U+0900-U+097F). Κάθε δυνατότητα επιτρέπει στους callers να οδηγήσουν το script μέσω του υπάρχοντος OpenType GSUB engine για σωστό shaping, διατηρώντας το βαρύ έργο (cluster boundary detection, BiDi resolution, GPOS positioning) εκτός του scope του HotPDF
Syriac shaping capability (v2.119.53) Two new methods expose Syriac's joining behavior:
function GetSyriacJoiningClass(CP: Cardinal): TJoiningClass; function GetSyriacPosition(const Run: array of Cardinal; Index: Integer): TPosition;
Το Syriac ακολουθεί το ίδιο πλαίσιο τεσσάρων κλάσεων Right-Joining / Dual-Joining / Transparent / Non-Joining με τα αραβικά· το GetSyriacJoiningClass ταξινομεί κάθε codepoint στο block U+0700-U+074F σύμφωνα με την Unicode joining property. Το GetSyriacPosition διατρέχει ένα Syriac run και επιλύει κάθε χαρακτήρα σε isolated / initial / medial / final position με βάση τις joining classes των άμεσων γειτόνων του
Σε αντίθεση με τα αραβικά, το Syriac block δεν έχει Presentation Forms προκωδικοποιημένα σε Unicode - δεν υπάρχει Syriac ισοδύναμο των blocks Arabic Presentation Forms U+FB50-FDFF / U+FE70-FEFC. Οι καταναλωτές πρέπει επομένως να οδηγούν Syriac shaping μέσω font-defined GSUB lookups (συνήθως init / medi / fina / isol + rlig) αντί για codepoint rewriting. Το capability layer παραπάνω δίνει στους callers τις position labels που χρειάζονται για να ερωτούν το σωστό GSUB feature για κάθε glyph
Mongolian shaping capability (v2.119.54) Two parallel methods for Mongolian:
function GetMongolianJoiningClass(CP: Cardinal): TJoiningClass; function GetMongolianPosition(const Run: array of Cardinal; Index: Integer): TPosition;
Η κάλυψη περιλαμβάνει βασικό Mongolian (U+1820-U+1842), Todo (U+1843-U+1877), Sibe (U+1880-U+18A8), Manchu και Ali Gali extensions. Οι Variation Selectors FVS1 / FVS2 / FVS3 (U+180B-U+180D), το soft hyphen NIRUGU (U+180A) και τα Ali Gali vowel marks ταξινομούνται όλα ως Transparent (T-class), ώστε να συμμετέχουν στο joining χωρίς να διακόπτουν τη διάσχιση
Όπως το Syriac, το Mongolian δεν έχει Presentation Forms προκωδικοποιημένα σε Unicode. Η παραδοσιακή κάθετη διάταξη του Mongolian, οι σύνθετοι κανόνες παραλλαγής μορφής γραμμάτων και η FVS-driven επιλογή μορφής αναμένεται να οδηγούνται από font-defined GSUB lookups (συνήθως init / medi / fina / isol + ccmp / rlig / locl)· το capability layer δίνει στους callers τις position labels που χρειάζονται για να ερωτήσουν αυτά τα features
Devanagari Indic shaping capability (v2.119.55) Το Devanagari είναι θεμελιωδώς διαφορετικό από Arabic / Syriac / Mongolian - είναι Indic abugida script όπου η ουσιαστική μονάδα είναι syllable cluster (akshara), όχι μεμονωμένο γράμμα, και η αποδιδόμενη σειρά glyphs μέσα σε ένα cluster συχνά διαφέρει από τη λογική Unicode σειρά. Δύο μέθοδοι εκθέτουν το Indic capability layer του Devanagari:
function GetDevanagariCategory(CP: Cardinal): TIndicCategory; procedure ApplyDevanagariReorder(var Run: array of Cardinal);
Το GetDevanagariCategory ταξινομεί κάθε codepoint στο U+0900-U+097F σε μία από 13 Indic syllabic categories (Base / Consonant / Vowel / Independent Vowel / Vowel Mark / Pre-base Matra / Above-base Matra / Below-base Matra / Halant Virama / Repha / Anusvara / Visarga / Other), ώστε οι callers να μπορούν να εντοπίζουν syllable boundaries και να αναγνωρίζουν ποιες θέσεις μέσα σε κάθε cluster χρειάζονται reordering
Το ApplyDevanagariReorder είναι pre-pass που διατρέχει το input run και εφαρμόζει τους δύο κύριους κανόνες reordering του Devanagari: (1) το Repha (Ra + Halant στην αρχή syllable cluster) μετακινείται στη θέση μετά το base consonant του cluster ώστε να αποδοθεί ως superscript hook· (2) η pre-base I-matra (U+093F DEVANAGARI VOWEL SIGN I) μετακινείται πριν από το base consonant του cluster ώστε να αποδοθεί ως left-side hook. Άλλα Indic reorders (above-base matra, below-base matra, conjunct formation) αφήνονται στο GSUB engine της γραμματοσειράς επειδή απαιτούν font-specific lookup tables
Αυτόματη ενσωμάτωση (v2.119.67): όταν το sfIndicShaping βρίσκεται στο PDF.ShapingFeatures, το ApplyDevanagariReorder εφαρμόζεται αυτόματα ως pre-pass μέσα στους τρεις helpers BuildUnicode*FieldContent. Το GSUB engine του consumer reader λαμβάνει έπειτα τη συλλαβή στη σωστή σειρά και εφαρμόζει τους δικούς του contextual shaping rules. Δείτε Automatic Shaping Pipeline
Typical workflow (Syriac)
PDF.RegisterUnicodeTTF('Estrangelo', 'SyrCOMEdessa.otf'); PDF.SetGSUBScript('syrc'); // see GSUB engine doc for i := 0 to Length(Run) - 1 do begin Pos := PDF.GetSyriacPosition(Run, i); // init / medi / fina / isol // query GSUB for the position-appropriate substitute glyph // emit + MarkUnicodeGlyphUsed end;
Typical workflow (Devanagari with automatic reorder)
PDF.RegisterUnicodeTTF('NotoDeva', 'NotoSansDevanagari-Regular.ttf'); PDF.ShapingFeatures := [sfIndicShaping]; // auto Repha + I-matra reorder PDF.CurrentPage.SetFont('NotoDeva', [], 14); PDF.CurrentPage.UnicodeTextOut(50, 700, 0, UnicodeString(#$0939#$093F#$0928#$094D#$0926#$0940)); // "Hindi"
Unicode Subset and Extraction Helpers Το RegisterToUnicodeReverseMapping καταγράφει source codepoints για shaped ή synthetic glyph output. Το ClearToUnicodeReverseMappings μηδενίζει τον πίνακα, το ToUnicodeReverseMappingCount αναφέρει το μέγεθός του, το GetUnicodeGlyphForCodepoint επιστρέφει το registered font glyph ID για Unicode codepoint και το EnableShapingFeatureForSubset σηματοδοτεί substitute glyphs από GSUB feature για ένταξη στο embedded subset
Scope and limitations Τρέχουσα ενσωμάτωση στην πλευρά παραγωγής Syriac, Mongolian, Tibetan και Indic shaping έχουν πλέον ρητές API reference pages. Το Syriac μπορεί να ενεργοποιηθεί μέσω AutoShapeSyriac, το Mongolian μέσω sfMongolianShaping, το Tibetan μέσω sfTibetanShaping, το Indic reorder μέσω sfIndicShaping και το πλήρες Indic GSUB shaping μέσω sfIndicGSUB. Τα αναλυτικά entry points τεκμηριώνονται στις Tibetan/Mongolian/Syriac shaping methods και Indic shaping methods Το τρέχον scope καλύπτει επίσης N'Ko και Adlam ως RTL cursive scripts, Thai/Lao SARA AM και tone-mark ordering, Hebrew niqqud ordering και Javanese pre-base signs. Αυτές οι διαδρομές τεκμηριώνονται στις script shaping preprocess methods
See also: Arabic / Persian / Urdu Shaping Support, Automatic Shaping Pipeline (Phase 8), OpenType GSUB Substitution Engine, THotPDF.AssignSyntheticCodepointForGID |