|
Syriac / Mongolian / Devanagari Shaping Support Multi-script capability surfaces (v2.119.53 - v2.119.55)
|
Arabic Shaping Auto Shaping Pipeline GSUB Engine |
|
HotPDF излага capability повърхности за joining-class / positional-analysis / Indic syllabic-category за три сложни писмености извън Arabic: Syriac (U+0700-U+074F), Mongolian (U+1800-U+18AF) и Devanagari (U+0900-U+097F). Всяка възможност позволява на извикващите да управляват писмеността през съществуващия OpenType GSUB engine за коректно шейпиране, като оставя тежката работа по определяне на граници на клъстери, BiDi resolution и GPOS позициониране извън обхвата на 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 като Arabic; GetSyriacJoiningClass класифицира всяка codepoint стойност в блока U+0700-U+074F според Unicode joining property. GetSyriacPosition обхожда Syriac пасаж и определя всяка буква в нейна isolated / initial / medial / final позиция според joining класовете на непосредствените ѝ съседи
За разлика от Arabic, блокът Syriac няма Presentation Forms, предварително кодирани в Unicode - няма Syriac еквивалент на блоковете U+FB50-FDFF / U+FE70-FEFC Arabic Presentation Forms. Потребителите трябва затова да управляват Syriac шейпирането чрез font-defined GSUB lookups (обикновено init / medi / fina / isol + rlig), а не чрез пренаписване на codepoints. Горният capability слой дава на извикващите етикетите за позициите, които им трябват, за да заявят правилната GSUB функция за всеки 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. Variation Selectors FVS1 / FVS2 / FVS3 (U+180B-U+180D), soft hyphen NIRUGU (U+180A) и Ali Gali vowel marks са всички класифицирани като Transparent (T-class), така че участват в свързването, без да прекъсват обхода
Подобно на Syriac, Mongolian няма Presentation Forms, предварително кодирани в Unicode. Традиционното вертикално оформление на Mongolian, сложните правила за вариации във формата на буквите и FVS-driven изборът на форма се очаква да се управляват от font-defined GSUB lookups (обикновено init / medi / fina / isol + ccmp / rlig / locl); capability слоят дава на извикващите етикетите на позициите, нужни за заявяване на тези функции
Devanagari Indic shaping capability (v2.119.55) Devanagari е принципно различна от Arabic / Syriac / Mongolian - това е Indic abugida писменост, при която смисловата единица е сричков клъстер (akshara), а не единична буква, и визуалният ред на glyph-овете в клъстера често е различен от логическия Unicode ред. Два метода излагат Indic capability слоя на 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), така че извикващите да могат да откриват границите на сричките и да определят кои позиции в клъстера трябва да се пренаредят
ApplyDevanagariReorder е pre-pass, който обхожда входния пасаж и прилага двете основни правила за пренареждане на Devanagari: (1) Repha (Ra + Halant в началото на сричков клъстер) се премества след базовата съгласна на клъстера, така че да се визуализира като superscript hook; (2) Pre-base I-matra (U+093F DEVANAGARI VOWEL SIGN I) се премества преди базовата съгласна на клъстера, така че да се визуализира като ляв hook. Другите Indic пренареждания (above-base matra, below-base matra, conjunct formation) се оставят на GSUB engine-а на шрифта, защото изискват lookup таблици, специфични за шрифта
Автоматична интеграция (v2.119.67): когато sfIndicShaping е в PDF.ShapingFeatures, ApplyDevanagariReorder се прилага автоматично като pre-pass вътре в трите BuildUnicode*FieldContent помощни метода. GSUB engine-ът на потребителския reader след това поема сричката в правилния ред и прилага собствените си контекстни правила за шейпиране. Вижте 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 записва изходните codepoints за оформен или синтетичен glyph изход. ClearToUnicodeReverseMappings нулира таблицата, ToUnicodeReverseMappingCount отчита нейния размер, GetUnicodeGlyphForCodepoint връща регистрирания font glyph ID за Unicode codepoint, а EnableShapingFeatureForSubset маркира заместителните glyph-ове от GSUB функция за включване във вградения subset
Обхват и ограничения Текуща интеграция от страна на производителя Syriac, Mongolian, Tibetan и Indic шейпирането вече имат отделни API reference страници. Syriac може да се включи чрез AutoShapeSyriac, Mongolian чрез sfMongolianShaping, Tibetan чрез sfTibetanShaping, Indic reorder чрез sfIndicShaping, а пълното Indic GSUB шейпиране чрез sfIndicGSUB. Подробните входни точки са документирани в Tibetan/Mongolian/Syriac shaping methods и Indic shaping methods Текущият обхват покрива още N'Ko и Adlam като RTL курсивни писмености, подредбата на SARA AM и тоновите знаци в Thai/Lao, подредбата на никуд в Hebrew и предбазовите знаци в Javanese. Тези пътища са документирани в script shaping preprocess methods
See also: Arabic / Persian / Urdu Shaping Support, Automatic Shaping Pipeline (Phase 8), OpenType GSUB Substitution Engine, THotPDF.AssignSyntheticCodepointForGID |