Syriac / Mongolian / Devanagari Shaping – podpora

Rozhraní schopností pro více písem (v2.119.53 - v2.119.55)

 

Arabic Shaping  Auto Shaping Pipeline  GSUB Engine

HotPDF zpřístupňuje rozhraní schopností pro spojovací třídy, poziční analýzu a indické slabičné kategorie pro tři složitá písma mimo arabštinu: Syriac (U+0700-U+074F), Mongolian (U+1800-U+18AF) a Devanagari (U+0900-U+097F). Každá schopnost umožňuje volajícím řídit písmo přes existující engine OpenType GSUB pro správné tvarování, zatímco těžká práce (detekce hranic clusterů, řešení BiDi, polohování GPOS) zůstává mimo rozsah HotPDF

 

Schopnost tvarování Syriac (v2.119.53)

Dvě nové metody zpřístupňují spojovací chování Syriac:

 

function GetSyriacJoiningClass(CP: Cardinal): TJoiningClass;

function GetSyriacPosition(const Run: array of Cardinal; Index: Integer): TPosition;

 

Syriac používá stejný čtyřtřídní framework Right-Joining / Dual-Joining / Transparent / Non-Joining jako arabština; GetSyriacJoiningClass klasifikuje každý codepoint v bloku U+0700-U+074F podle vlastnosti Unicode joining. GetSyriacPosition projde běh Syriac a vyhodnotí každý znak na jeho izolovanou / počáteční / středovou / koncovou pozici podle spojovacích tříd bezprostředních sousedů

 

Na rozdíl od arabštiny nemá blok Syriac žádné Presentation Forms předkódované v Unicode - neexistuje syrský ekvivalent bloků Arabic Presentation Forms U+FB50-FDFF / U+FE70-FEFC. Konzumenti proto musí tvarování Syriac řídit přes GSUB lookupy definované fontem (typicky init / medi / fina / isol + rlig) místo přepisování codepointů. Vrstva schopností výše dává volajícím poziční štítky potřebné k dotazu na správnou funkci GSUB pro každý glyph

 

Schopnost tvarování Mongolian (v2.119.54)

Dvě paralelní metody pro Mongolian:

 

function GetMongolianJoiningClass(CP: Cardinal): TJoiningClass;

function GetMongolianPosition(const Run: array of Cardinal; Index: Integer): TPosition;

 

Pokrytí zahrnuje základní Mongolian (U+1820-U+1842), Todo (U+1843-U+1877), Sibe (U+1880-U+18A8), Manchu a rozšíření 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 jsou klasifikované jako Transparent (třída T), takže se účastní spojování bez přerušení průchodu

 

Stejně jako Syriac nemá Mongolian žádné Presentation Forms předkódované v Unicode. Tradiční svislé rozložení mongolštiny, složitá pravidla variant tvaru písmen a výběr tvarů řízený FVS se očekávají přes GSUB lookupy definované fontem (typicky init / medi / fina / isol + ccmp / rlig / locl); vrstva schopností dává volajícím poziční štítky potřebné k dotazu na tyto funkce

 

Indická schopnost tvarování Devanagari (v2.119.55)

Devanagari se zásadně liší od Arabic / Syriac / Mongolian - je to indické abugida písmo, kde významovou jednotkou je slabičný cluster (akshara), ne jednotlivé písmeno, a vykreslené pořadí glyphů uvnitř clusteru se často liší od logického pořadí Unicode. Dvě metody zpřístupňují indickou 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 jedné ze 13 indických slabičných kategorií (Base / Consonant / Vowel / Independent Vowel / Vowel Mark / Pre-base Matra / Above-base Matra / Below-base Matra / Halant Virama / Repha / Anusvara / Visarga / Other), aby volající mohli detekovat hranice slabik a určit, které pozice uvnitř každého clusteru potřebují reorder

 

ApplyDevanagariReorder je pre-pass, který projde vstupní běh a aplikuje dvě hlavní pravidla reorderu Devanagari: (1) Repha (Ra + Halant na začátku slabičného clusteru) se přesune na pozici za základní souhlásku clusteru, aby se vykreslila jako horní háček; (2) pre-base I-matra (U+093F DEVANAGARI VOWEL SIGN I) se přesune před základní souhlásku clusteru, aby se vykreslila jako levostranný háček. Ostatní indické reordery (above-base matra, below-base matra, tvorba konjunktů) jsou ponechány GSUB enginu fontu, protože vyžadují tabulky lookupů specifické pro font

 

Automatická integrace (v2.119.67): když platí sfIndicShaping in PDF.ShapingFeatures, ApplyDevanagariReorder se automaticky aplikuje jako pre-pass uvnitř tří pomocných funkcí BuildUnicode*FieldContent. GSUB engine čtečky dokumentů pak zachytí slabiku ve správném pořadí a aplikuje vlastní kontextová pravidla tvarování. Viz Automatická pipeline tvarování

 

Typický pracovní postup (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;

 

Typický pracovní postup (Devanagari s automatickým reorderem)

 

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"

 

Pomocné funkce subsetu a extrakce Unicode

RegisterToUnicodeReverseMapping zaznamenává zdrojové codepointy pro vytvarovaný nebo syntetický výstup glyphů. ClearToUnicodeReverseMappings resetuje tabulku, ToUnicodeReverseMappingCount hlásí její velikost, GetUnicodeGlyphForCodepoint vrací ID glyphu registrovaného fontu pro Unicode codepoint a EnableShapingFeatureForSubset označuje náhradní glyfy z funkce GSUB pro zahrnutí do vloženého subsetu

 

Rozsah a omezení

Aktuální integrace na straně producenta

Syriac, Mongolian, Tibetan a Indic shaping nyní mají explicitní referenční stránky API. Syriac lze zapnout přes AutoShapeSyriac, Mongolian přes sfMongolianShaping, Tibetan přes sfTibetanShaping, indický reorder přes sfIndicShaping a plné indické GSUB tvarování přes sfIndicGSUB. Detailní vstupní body jsou dokumentovány v metodách tvarování Tibetan/Mongolian/Syriac a metodách indického tvarování

Aktuální rozsah pokrývá také N'Ko a Adlam jako kurzivní písma RTL, řazení SARA AM a tónových značek Thai/Lao, řazení Hebrew niqqud a pre-base značky Javanese. Tyto cesty jsou dokumentovány v metodách předzpracování tvarování písem

 

 

Viz také: Podpora Arabic / Persian / Urdu Shaping, Automatická pipeline tvarování (Phase 8), Substituční engine OpenType GSUB, THotPDF.AssignSyntheticCodepointForGID