Ondersteuning voor Syrisch / Mongools / Devanagari-vorming

Meertalige capabilitylagen (v2.119.53 - v2.119.55)

 

Arabische vorming  Automatische vormingspijplijn  GSUB-engine

HotPDF biedt capabilitylagen voor joining-class, positionele analyse en Indic-syllabic-category voor drie complexe schriften naast Arabisch: Syriac (U+0700-U+074F), Mongools (U+1800-U+18AF) en Devanagari (U+0900-U+097F). Elke capability laat aanroepers het schrift aansturen via de bestaande OpenType GSUB-engine voor correcte vorming, terwijl het zware werk (detectie van clustergrenzen, BiDi-resolutie, GPOS-positionering) buiten HotPDF blijft

 

Syriac-vormingscapability (v2.119.53)

Twee nieuwe methoden maken het joining-gedrag van Syriac beschikbaar:

 

function GetSyriacJoiningClass(CP: Cardinal): TJoiningClass;

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

 

Syriac volgt hetzelfde vierklassenframework voor Right-Joining / Dual-Joining / Transparent / Non-Joining als Arabisch; GetSyriacJoiningClass classificeert elk codepoint in het U+0700-U+074F-blok volgens de Unicode joining property. GetSyriacPosition loopt door een Syriac-run en zet elk teken om naar zijn geïsoleerde / initiële / mediale / finale positie op basis van de joining classes van de directe buren

 

In tegenstelling tot Arabisch heeft het Syriac-blok geen presentatievormen die al in Unicode zijn gecodeerd - er bestaat geen Syriac-equivalent van de Arabische Presentation Forms-blokken U+FB50-FDFF / U+FE70-FEFC. Aanroepers moeten Syriac-vorming daarom via door het lettertype gedefinieerde GSUB-lookups aansturen (meestal init / medi / fina / isol + rlig) in plaats van codepoint-herschrijving. De capabilitylaag hierboven geeft aanroepers de positielabels die nodig zijn om voor elk glyph de juiste GSUB-feature op te vragen

 

Mongoolse vormingscapability (v2.119.54)

Twee parallelle methoden voor Mongools:

 

function GetMongolianJoiningClass(CP: Cardinal): TJoiningClass;

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

 

De dekking omvat basis-Mongools (U+1820-U+1842), Todo (U+1843-U+1877), Sibe (U+1880-U+18A8), Manchu en Ali Gali-uitbreidingen. Variation Selectors FVS1 / FVS2 / FVS3 (U+180B-U+180D), de zachte streep NIRUGU (U+180A) en Ali Gali-klinkertekens worden allemaal geclassificeerd als Transparent (T-klasse) zodat ze meedoen aan het joining-proces zonder de loop te onderbreken

 

Net als Syriac heeft Mongools geen presentievormen die al in Unicode zijn gecodeerd. De traditionele verticale lay-out van Mongools, complexe regels voor variatie in lettervormen en FVS-gestuurde vormselectie worden allemaal verwacht via door het lettertype gedefinieerde GSUB-lookups te verlopen (meestal init / medi / fina / isol + ccmp / rlig / locl); de capabilitylaag geeft aanroepers de positielabels die nodig zijn om die features op te vragen

 

Devanagari-Indic-vormingscapability (v2.119.55)

Devanagari verschilt fundamenteel van Arabisch / Syriac / Mongools - het is een Indic abugidaschrift waarin de betekenisvolle eenheid een syllabecluster (akshara) is, niet een losse letter, en de gerenderde volgorde van glyphs binnen een cluster vaak afwijkt van de logische Unicode-volgorde. Twee methoden stellen de Indic-capabilitylaag van Devanagari beschikbaar:

 

function GetDevanagariCategory(CP: Cardinal): TIndicCategory;

procedure ApplyDevanagariReorder(var Run: array of Cardinal);

 

GetDevanagariCategory classificeert elk codepoint in U+0900-U+097F in een van 13 Indic-syllabische categorieën (Base / Consonant / Vowel / Independent Vowel / Vowel Mark / Pre-base Matra / Above-base Matra / Below-base Matra / Halant Virama / Repha / Anusvara / Visarga / Other) zodat aanroepers syllabegrenzen kunnen detecteren en kunnen zien welke posities binnen elk cluster herschikking nodig hebben

 

ApplyDevanagariReorder is een pre-pass die de invoerreeks doorloopt en de twee hoofdregels voor Devanagari-herschikking toepast: (1) Repha (Ra + Halant aan het begin van een syllabecluster) wordt verplaatst naar de positie na de basisconsonant van het cluster zodat het als superscript-haak wordt gerenderd; (2) Pre-base I-matra (U+093F DEVANAGARI VOWEL SIGN I) wordt vóór de basisconsonant van het cluster gezet zodat het als linkerhaak wordt gerenderd. Andere Indic-herschikkingen (above-base matra, below-base matra, conjunctvorming) worden aan de GSUB-engine van het lettertype overgelaten omdat daarvoor letterspecifieke lookup-tabellen nodig zijn

 

Automatische integratie (v2.119.67): wanneer sfIndicShaping in PDF.ShapingFeatures staat, wordt ApplyDevanagariReorder automatisch als voorstap toegepast binnen de drie helpers BuildUnicode*FieldContent. De GSUB-engine van de lezer pakt de syllabe daarna in de juiste volgorde op en past de eigen contextuele vormingsregels toe. Zie Automatische vormingspijplijn

 

Typische 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;

 

Typische workflow (Devanagari met automatische herschikking)

 

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- en extractiehulpen

RegisterToUnicodeReverseMapping registreert bron-codepoints voor gevormde of synthetische glyphuitvoer. ClearToUnicodeReverseMappings zet de tabel terug, ToUnicodeReverseMappingCount rapporteert de grootte, GetUnicodeGlyphForCodepoint geeft de geregistreerde font-glyph-ID voor een Unicode-codepoint terug, en EnableShapingFeatureForSubset markeert vervangende glyphs uit een GSUB-feature voor opname in de ingebedde subset

 

Bereik en beperkingen

Huidige producer-side-integratie

Syriac-, Mongools-, Tibetaans- en Indic-vorming hebben nu expliciete API-referentiepagina’s. Syriac kan via AutoShapeSyriac worden ingeschakeld, Mongools via sfMongolianShaping, Tibetaans via sfTibetanShaping, Indic-herschikking via sfIndicShaping en volledige Indic GSUB-vorming via sfIndicGSUB. De gedetailleerde ingangen zijn beschreven in Tibetan/Mongolian/Syriac-vormingsmethoden en Indic-vormingsmethoden

De huidige scope omvat ook N'Ko en Adlam als RTL-cursieve schriften, Thai/Lao voor SARA AM en toonmarkeringen, Hebreeuws voor niqqud-volgorde en Javaans voor pre-base-tekens. Deze paden zijn beschreven in voorverwerkingsmethoden voor scriptvorming

 

 

Zie ook: Ondersteuning voor Arabische / Perzische / Urdu-vorming, Automatische vormingspijplijn (fase 8), OpenType GSUB-vervangingsengine, THotPDF.AssignSyntheticCodepointForGID