Støtte for syrisk / mongolsk / devanagari-forming

Funksjonsflater for flere skriftsystemer (v2.119.53 - v2.119.55)

 

Arabisk forming  Automatisk formings-pipeline  GSUB-motoren

HotPDF eksponerer funksjonsflater for koblingsklasse, posisjonsanalyse og indik-syllabisk kategori for tre komplekse skriftsystemer utover arabisk: syrisk (U+0700-U+074F), mongolsk (U+1800-U+18AF) og devanagari (U+0900-U+097F). Hver funksjon lar kallere styre skriptet gjennom den eksisterende OpenType GSUB-motoren for korrekt forming, mens tungløftet (klyngegrense-deteksjon, BiDi-løsning, GPOS-posisjonering) holdes utenfor HotPDFs ansvarsområde

 

Syrisk formingsfunksjon (v2.119.53)

To nye metoder eksponerer syrisk koblingsadferd:

 

function GetSyriacJoiningClass(CP: Cardinal): TJoiningClass;

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

 

Syrisk følger samme firedelte rammeverk for Right-Joining / Dual-Joining / Transparent / Non-Joining som arabisk; GetSyriacJoiningClass klassifiserer hvert kodepunkt i U+0700-U+074F-blokken i henhold til Unicode-tilknytnings-egenskapen. GetSyriacPosition går gjennom en syrisk sekvens og løser hvert tegn til isolert / innledende / medial / final posisjon basert på koblingsklassene til de nærmeste naboene

 

I motsetning til arabisk har den syriske blokken ingen forhåndskodede presentasjonsformer i Unicode - det finnes ingen syrisk ekvivalent til de arabiske blokkene U+FB50-FDFF / U+FE70-FEFC. Konsumenter må derfor styre syrisk forming gjennom fontdefinerte GSUB-oppslag (typisk init / medi / fina / isol + rlig) i stedet for omskriving av kodepunkter. Funksjonslaget over gir kallere posisjonsmerkene de trenger for å slå opp riktig GSUB-funksjon for hver glyf

 

Mongolsk formingsfunksjon (v2.119.54)

To parallelle metoder for mongolsk:

 

function GetMongolianJoiningClass(CP: Cardinal): TJoiningClass;

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

 

Dekningen omfatter grunnleggende mongolsk (U+1820-U+1842), Todo (U+1843-U+1877), Sibe (U+1880-U+18A8), mandju og Ali Gali-utvidelser. Variasjonsvelgerne FVS1 / FVS2 / FVS3 (U+180B-U+180D), det myke bindestreket NIRUGU (U+180A) og Ali Gali-vokaltegn klassifiseres alle som Transparent (T-klasse) slik at de deltar i koblingen uten å bryte gjennomgangen

 

Som syrisk har mongolsk ingen forhåndskodede presentasjonsformer i Unicode. Mongolsk tradisjonell vertikal layout, komplekse regler for variasjon i bokstavformer og FVS-styrt valg av form forventes alle å styres av fontdefinerte GSUB-oppslag (typisk init / medi / fina / isol + ccmp / rlig / locl); funksjonslaget gir kallere posisjonsmerkene som trengs for å slå opp disse funksjonene

 

Indic-formingsfunksjon for devanagari (v2.119.55)

Devanagari er grunnleggende annerledes enn arabisk / syrisk / mongolsk - det er et indik abugida-skriftsystem der den meningsbærende enheten er en stavelsesklase (akshara), ikke en enkelt bokstav, og den gjengitte rekkefølgen av glyfer inne i en klasse er ofte annerledes enn den logiske Unicode-rekkefølgen. To metoder eksponerer Devangari sitt indik-funksjonslag:

 

function GetDevanagariCategory(CP: Cardinal): TIndicCategory;

procedure ApplyDevanagariReorder(var Run: array of Cardinal);

 

GetDevanagariCategory klassifiserer hvert kodepunkt i U+0900-U+097F i en av 13 indik-syllabiske kategorier (Base / Consonant / Vowel / Independent Vowel / Vowel Mark / Pre-base Matra / Above-base Matra / Below-base Matra / Halant Virama / Repha / Anusvara / Visarga / Other) slik at kallere kan oppdage stavelsesgrenser og identifisere hvilke posisjoner inne i hver klasse som trenger omstokking

 

ApplyDevanagariReorder er et forbehandlingssteg som går gjennom inndata-sekvensen og bruker de to viktigste omleggingsreglene for devanagari: (1) Repha (Ra + Halant i begynnelsen av en stavelsesklase) flyttes til posisjonen etter klassens basekonsonant slik at den rendres som en hevet krok; (2) Pre-base I-matra (U+093F DEVANAGARI VOWEL SIGN I) flyttes foran klassens basekonsonant slik at den rendres som en venstresidig krok. Andre indik-omlegginger (matra over basen, matra under basen, konjunktdannelse) overlates til fontens GSUB-motor siden de krever fontspesifikke oppslagstabeller

 

Automatisk integrasjon (v2.119.67): når sfIndicShaping in PDF.ShapingFeatures, brukes ApplyDevanagariReorder automatisk som et forbehandlingssteg inne i de tre hjelperne BuildUnicode*FieldContent. Konsumentleserens GSUB-motor plukker deretter opp stavelsen i riktig rekkefølge og bruker sine egne kontekstuelle formingsregler. Se Automatisk formings-pipeline

 

Typisk arbeidsflyt (syrisk)

 

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;

 

Typisk arbeidsflyt (devanagari med automatisk omlegging)

 

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"

 

Hjelpere for Unicode-underinndeling og uthenting

RegisterToUnicodeReverseMapping registrerer kildens kodepunkter for formet eller syntetisk glyfutdata. ClearToUnicodeReverseMappings nullstiller tabellen, ToUnicodeReverseMappingCount rapporterer størrelsen, GetUnicodeGlyphForCodepoint returnerer det registrerte glyf-ID-et for et Unicode-kodepunkt, og EnableShapingFeatureForSubset markerer erstatningsglyfer fra en GSUB-funksjon for inkludering i den innebygde underinndelingen

 

Omfang og begrensninger

Gjeldende produsentsideintegrasjon

Syrisk, mongolsk, tibetansk og indik-forming har nå egne API-referansesider. Syrisk kan aktiveres gjennom AutoShapeSyriac, mongolsk gjennom sfMongolianShaping, tibetansk gjennom sfTibetanShaping, indik-omlegging gjennom sfIndicShaping og full indik-GSUB-forming gjennom sfIndicGSUB. De detaljerte inngangspunktene er dokumentert i tibetansk/mongolsk/syrisk-formingsmetoder og indiske formingsmetoder

Gjeldende omfang dekker også N'Ko og Adlam som RTL-kursive skriftsystemer, rekkefølgen for Thai/Lao SARA AM og tonemerker, rekkefølgen for hebraisk niqqud og Javanesisk pre-base-tegn. Disse banene er dokumentert i preprosesseringsmetodene for skriptforming

 

 

Se også: Støtte for arabisk / persisk / urdu-forming, Automatisk formings-pipeline (fase 8), OpenType GSUB-erstatningsmotor, THotPDF.AssignSyntheticCodepointForGID