Syriac / Mongolian / Devanagari Shaping Support

Multi-script capability surfaces (v2.119.53 - v2.119.55)

 

Arabic Shaping  Auto Shaping Pipeline  GSUB Engine

HotPDF sprístupňuje plochy schopností pre joining-class / positional-analysis / Indic syllabic-category pre tri komplexné písma okrem arabčiny: Syriac (U+0700-U+074F), Mongolian (U+1800-U+18AF) a Devanagari (U+0900-U+097F). Každá schopnosť umožňuje volajúcim viesť skript cez existujúci engine OpenType GSUB pre správne tvarovanie, zatiaľ čo ťažká práca (detekcia hraníc klastrov, riešenie BiDi, umiestňovanie GPOS) zostáva mimo rozsahu 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 používa rovnaký štvortriedny rámec Right-Joining / Dual-Joining / Transparent / Non-Joining ako arabčina; GetSyriacJoiningClass klasifikuje každý codepoint v bloku U+0700-U+074F podľa vlastnosti Unicode joining. GetSyriacPosition prejde sýrske písmo v behu a priradí každý znak do izolovanej / počiatočnej / strednej / záverečnej pozície na základe tried spájania jeho bezprostredných susedov

 

Na rozdiel od arabčiny blok Syriac nemá žiadne Presentation Forms predkódované v Unicode - neexistuje sýrska obdoba blokov Arabic Presentation Forms U+FB50-FDFF / U+FE70-FEFC. Spotrebitelia preto musia tvary Syriac viesť cez GSUB lookupy definované vo fonte (zvyčajne init / medi / fina / isol + rlig) namiesto prepisovania codepointov. Vrstva schopností vyššie dáva volajúcim menovky pozícií, ktoré potrebujú na dopytovanie správnej GSUB funkcie pre každý glyf

 

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;

 

Pokrytie zahŕňa základnú mongolčinu (U+1820-U+1842), Todo (U+1843-U+1877), Sibe (U+1880-U+18A8), Manchu a rozšírenia Ali Gali. Variation Selectors FVS1 / FVS2 / FVS3 (U+180B-U+180D), mäkký spojovník NIRUGU (U+180A) a samohláskové značky Ali Gali sú všetky klasifikované ako Transparent (trieda T), takže sa zúčastňujú na spájaní bez prerušenia prechodu

 

Rovnako ako Syriac, ani Mongolian nemá žiadne Presentation Forms predkódované v Unicode. Tradičné vertikálne rozloženie Mongolian, zložité pravidlá variácie tvarov písmen a výber tvaru riadený FVS sa očakáva viesť cez GSUB lookupy definované vo fonte (zvyčajne init / medi / fina / isol + ccmp / rlig / locl); vrstva schopností dáva volajúcim menovky pozícií potrebné na dopytovanie týchto funkcií

 

Devanagari Indic shaping capability (v2.119.55)

Devanagari sa zásadne líši od arabčiny / Syriac / Mongolian - je to indicový abugida skript, kde zmysluplná jednotka je slabikový klaster (akshara), nie jedno písmeno, a vykreslené poradie glyfov v rámci klastru je často odlišné od logického poradia Unicode. Dve metódy sprístupňujú indicovú vrstvu schopností Devanagari:

 

function GetDevanagariCategory(CP: Cardinal): TIndicCategory;

procedure ApplyDevanagariReorder(var Run: array of Cardinal);

 

GetDevanagariCategory klasifikuje každý codepoint v U+0900-U+097F do jednej z 13 indicových slabikových kategórií (Base / Consonant / Vowel / Independent Vowel / Vowel Mark / Pre-base Matra / Above-base Matra / Below-base Matra / Halant Virama / Repha / Anusvara / Visarga / Other), takže volajúci môžu odhaliť hranice slabík a určiť, ktoré pozície v rámci každého klastru treba preusporiadať

 

ApplyDevanagariReorder je pre-pass, ktorý prejde vstupný beh a aplikuje dve hlavné pravidlá preusporiadania Devanagari: (1) Repha (Ra + Halant na začiatku slabikového klastru) sa presunie na pozíciu za základnú spoluhlásku klastru, aby sa vykreslila ako horný háčik; (2) Pre-base I-matra (U+093F DEVANAGARI VOWEL SIGN I) sa presunie pred základnú spoluhlásku klastru, aby sa vykreslila ako ľavostranný háčik. Ostatné indicové preusporiadania (above-base matra, below-base matra, tvorba konjunktov) sa nechávajú na engine GSUB písma, pretože vyžadujú lookup tabuľky špecifické pre font

 

Automatická integrácia (v2.119.67): keď je sfIndicShaping v PDF.ShapingFeatures, ApplyDevanagariReorder sa automaticky aplikuje ako pre-pass v troch pomocných funkciách BuildUnicode*FieldContent. GSUB engine čítača potom prevezme slabiku v správnom poradí a aplikuje vlastné kontextové pravidlá tvarovania. Pozrite 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 zaznamenáva zdrojové codepointy pre tvarovaný alebo syntetický výstup glyfov. ClearToUnicodeReverseMappings vynuluje tabuľku, ToUnicodeReverseMappingCount hlási jej veľkosť, GetUnicodeGlyphForCodepoint vracia zaregistrované ID glyfu fontu pre Unicode codepoint a EnableShapingFeatureForSubset označuje náhradné glyfy z funkcie GSUB na zaradenie do vloženej podmnožiny

 

Scope and limitations

Aktuálna integrácia na strane producenta

Syriac, Mongolian, Tibetan a indicové tvarovanie majú teraz samostatné stránky s referenciou API. Syriac sa dá zapnúť cez AutoShapeSyriac, Mongolian cez sfMongolianShaping, Tibetan cez sfTibetanShaping, indicové preusporiadanie cez sfIndicShaping a plné indicové tvarovanie GSUB cez sfIndicGSUB. Podrobné vstupné body sú zdokumentované v metódach tvarovania Tibetan/Mongolian/Syriac a v metódach indicového tvarovania

Aktuálny rozsah zahŕňa aj N'Ko a Adlam ako RTL kurzívne písma, Thai/Lao SARA AM a poradie tónových značiek, poradie hebrejských niqqud a pre-base znaky Javanese. Tieto cesty sú zdokumentované v script shaping preprocess methods

 

 

See also: Arabic / Persian / Urdu Shaping Support, Automatic Shaping Pipeline (Phase 8), OpenType GSUB Substitution Engine, THotPDF.AssignSyntheticCodepointForGID