Syriac / Mongolian / Devanagari Shaping Support

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

 

Arabic Shaping  Auto Shaping Pipeline  GSUB Engine

HotPDF pateikia jungimo klasės, pozicinės analizės ir Indic skiemenų kategorijų galimybes trims sudėtingiems raštams be arabų: Syriac (U+0700-U+074F), Mongolian (U+1800-U+18AF) ir Devanagari (U+0900-U+097F). Kiekviena galimybė leidžia kviestinėms pusėms nukreipti raštą per esamą OpenType GSUB variklį teisingam formavimui, o sunkesnius darbus (klasterių ribų nustatymą, BiDi sprendimą, GPOS pozicionavimą) paliekant už HotPDF ribų

 

Syriac shaping capability (v2.119.53)

Du nauji metodai atskleidžia Syriac jungimo elgseną:

 

function GetSyriacJoiningClass(CP: Cardinal): TJoiningClass;

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

 

Syriac seka tą pačią Right-Joining / Dual-Joining / Transparent / Non-Joining keturių klasių sistemą kaip arabų raštas; GetSyriacJoiningClass klasifikuoja kiekvieną U+0700-U+074F bloko kodo tašką pagal Unicode jungimo savybę. GetSyriacPosition pereina Syriac seką ir kiekvieną simbolį priskiria isolated / initial / medial / final padėčiai pagal jo tiesioginių kaimynų jungimo klases

 

Skirtingai nuo arabų rašto, Syriac bloke nėra į Unicode iš anksto užkoduotų Presentation Forms - nėra Syriac atitikmens arabų U+FB50-FDFF / U+FE70-FEFC Presentation Forms blokams. Todėl kviestinės pusės Syriac formavimą turi valdyti per šrifto GSUB lookup'us (dažniausiai init / medi / fina / isol + rlig), o ne per kodo taškų perrašymą. Aukščiau esantis galimybių sluoksnis suteikia kviestinėms pusėms padėties žymas, kurių reikia tinkamai GSUB funkcijai kiekvienam glifui užklausti

 

Mongolian shaping capability (v2.119.54)

Du lygiagretūs metodai Mongolian raštui:

 

function GetMongolianJoiningClass(CP: Cardinal): TJoiningClass;

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

 

Aprėptis apima pagrindinį Mongolian (U+1820-U+1842), Todo (U+1843-U+1877), Sibe (U+1880-U+18A8), Manchu ir Ali Gali plėtinius. Variation Selectors FVS1 / FVS2 / FVS3 (U+180B-U+180D), minkštasis brūkšnys NIRUGU (U+180A) ir Ali Gali balsių ženklai visi priskiriami Transparent (T-class), todėl dalyvauja jungime nepertraukdami sekos

 

Kaip ir Syriac, Mongolian neturi į Unicode iš anksto užkoduotų Presentation Forms. Tradicinis vertikalus Mongolian išdėstymas, sudėtingos raidžių formų variacijos taisyklės ir FVS pagrįstas formos pasirinkimas turi būti valdomi šrifto GSUB lookup'ais (dažniausiai init / medi / fina / isol + ccmp / rlig / locl); galimybių sluoksnis suteikia kviestinėms pusėms padėties žymas, kurių reikia šioms funkcijoms užklausti

 

Devanagari Indic shaping capability (v2.119.55)

Devanagari iš esmės skiriasi nuo arabų, Syriac ir Mongolian - tai Indic abugida raštas, kuriame prasmingas vienetas yra skiemenų klasteris (akshara), o ne viena raidė, ir glifų išvedimo tvarka klasterio viduje dažnai skiriasi nuo loginės Unicode tvarkos. Du metodai atskleidžia Devanagari Indic galimybių sluoksnį:

 

function GetDevanagariCategory(CP: Cardinal): TIndicCategory;

procedure ApplyDevanagariReorder(var Run: array of Cardinal);

 

GetDevanagariCategory klasifikuoja kiekvieną U+0900-U+097F kodo tašką į vieną iš 13 Indic skiemenų kategorijų (Base / Consonant / Vowel / Independent Vowel / Vowel Mark / Pre-base Matra / Above-base Matra / Below-base Matra / Halant Virama / Repha / Anusvara / Visarga / Other), kad kviestinės pusės galėtų aptikti skiemenų ribas ir nustatyti, kurias pozicijas kiekvieno klasterio viduje reikia pertvarkyti

 

ApplyDevanagariReorder yra priešpaskutinis etapas, kuris pereina įvesties seką ir taiko dvi pagrindines Devanagari pertvarkymo taisykles: (1) Repha (Ra + Halant skiemens klasterio pradžioje) perkeliamas į poziciją po klasterio pagrindinio priebalsio, kad būtų atvaizduotas kaip viršutinis kabliukas; (2) prieš pagrindinį I-matra (U+093F DEVANAGARI VOWEL SIGN I) perkeliamas prieš klasterio pagrindinį priebalsį, kad būtų atvaizduotas kaip kairės pusės kabliukas. Kiti indiški pertvarkymai (virš bazės esanti matra, po baze esanti matra, junginių sudarymas) paliekami šrifto GSUB varikliui, nes jiems reikia konkretaus šrifto lookup lentelių

 

Automatic integration (v2.119.67): kai sfIndicShaping in PDF.ShapingFeatures, ApplyDevanagariReorder automatiškai taikomas kaip pre-pasas trijų BuildUnicode*FieldContent pagalbinių funkcijų viduje. Tada vartotojo skaitytuvo GSUB variklis paima skiemenį teisinga tvarka ir taiko savo kontekstines formavimo taisykles. Žr. 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 užregistruoja šaltinio kodo taškus suformuotai arba sintetinių glifų išvesčiai. ClearToUnicodeReverseMappings išvalo lentelę, ToUnicodeReverseMappingCount grąžina jos dydį, GetUnicodeGlyphForCodepoint grąžina registruotą šrifto glifo ID Unicode kodo taškui, o EnableShapingFeatureForSubset pažymi GSUB funkcijos pakaitinius glifus įtraukimui į įterptą pogrupį

 

Scope and limitations

Dabartinė gamintojo pusės integracija

Syriac, Mongolian, Tibetan ir Indic formavimas dabar turi atskirus API informacinius puslapius. Syriac galima įjungti per AutoShapeSyriac, Mongolian per sfMongolianShaping, Tibetan per sfTibetanShaping, Indic pertvarkymą per sfIndicShaping, o visą Indic GSUB formavimą per sfIndicGSUB. Išsamesni įėjimo taškai aprašyti Tibetan/Mongolian/Syriac shaping methods ir Indic shaping methods

Dabartinė apimtis taip pat apima N'Ko ir Adlam kaip RTL kursyvinius rašmenis, Thai/Lao SARA AM ir tono ženklų tvarką, Hebrew niqqud tvarką ir Javanese priešbazinius ženklus. Šie keliai aprašyti skriptų formavimo išankstinio apdorojimo metoduose

 

 

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