THotPDF.AssignSyntheticCodepointForGID / GetSyntheticCodepointForGID

THotPDF PUA synthetic codepoint allocator (v2.119.68)

 

GSUB Engine  Auto Shaping Pipeline  Arabic Shaping

Dodeljuje i upituje sintetičke codepoint-e iz Private Use Area (U+E000 - U+F8FF) za OpenType GSUB zamenske GID-ove koji nemaju prirodni Unicode codepoint dostupan kroz fontov cmap. Zatvara producer-side GID-level emission gap koji je ostao od v2.119.43-66 GSUB query i refinement API-ja

 

Delphi syntax:

function AssignSyntheticCodepointForGID(GID: Word; out SyntheticCP: Word): Boolean;

function GetSyntheticCodepointForGID(GID: Word): Word;

 

Why the API exists

Automatski proizvođački pipeline za oblikovanje od v2.119.32-67 (Arabic / Latin / Devanagari) zahteva da zamenski GID-ovi koje vraća GSUB engine budu dostupni kroz Unicode codepoint - postojeći heks-enkodirani tekstualni pipeline ispisuje codepointove, a ne GID-ove, i čitač dokumenta vraća codepoint nazad u GID preko ugrađenog /CIDToGIDMap. Za zamenske GID-ove koji imaju prirodni Unicode codepoint preko cmap-a fonta (Arabic Presentation Forms, Latin Standard Ligatures FB00-FB06), postojeći pipeline radi ispravno

 

Ali font-specifične zamene koje završavaju na internim GID-ovima fonta - većina Devanagari cluster oblika, stylistic alternates koje dizajner fonta isporučuje samo kao numerisane GID-ove, CJK ideographic variation sequences (IVS), discretionary ligature bez odgovarajućeg Presentation Form - nemaju nikakav codepoint u fontovom cmap-u. Pre v2.119.68 ovi GID-ovi nisu bili dostupni kroz producer-side hex pipeline; v2.119.68 zatvara taj jaz tako što pozivaocima dozvoljava da za bilo koji GID dodele sintetički codepoint u Private Use Area

 

AssignSyntheticCodepointForGID semantics

Dodeljuje sledeći dostupan PUA codepoint (počevši od U+E000) za prosleđeni GID i preslikava dodelu u svaki keš od kojeg zavisi postojeći producer-side hex pipeline + consumer-reader resolution chain:

 

1. FUnicodeCpToGid[SyntheticCP] := GID - so the producer-side hex pipeline emits SyntheticCP into the text-showing operator and the consumer reader resolves SyntheticCP back to GID through /CIDToGIDMap at render time.

2. FAcroFormUnicodeAdvances[SyntheticCP] := em-fraction - so the v2.65 word-wrap calculator finds the correct hmtx advance for the synthetic codepoint when it appears in AcroForm text-field content.

3. FUnicodeSyntheticCpForGID[GID] := SyntheticCP - the per-GID reverse-lookup table used by GetSyntheticCodepointForGID to make repeat AssignSyntheticCodepointForGID calls idempotent (the second call with the same GID returns the already-allocated SyntheticCP).

 

Vraća True pri uspehu sa SyntheticCP postavljenim na dodeljeni codepoint. Vraća False (i ostavlja SyntheticCP na 0) pod bilo kojim od ovih odbrambenih uslova: nije registrovan font (RegisterUnicodeTTF nikada nije pozvan ili je pozvan sa praznim argumentima da resetuje stanje), nevažeći GID (nula ili izvan cmap broja glifova), iscrpljen PUA opseg (svih 6400 slotova U+E000 - U+F8FF dodeljeno), keš nije inicijalizovan pri ulazu

 

GetSyntheticCodepointForGID semantics

Čisto funkcionalni upit za bilo koju postojeću dodelu. Vraća sintetički codepoint dodeljen za GID ako je AssignSyntheticCodepointForGID(GID, ...) ranije bio pozvan; inače vraća 0 (što nije važeći PUA codepoint, pa služi i kao sentinel za "nema dodele"). Ne alocira ništa. Bezbedno je pozvati ga pre bilo kog AssignSyntheticCodepointForGID poziva

 

Allocator state lifecycle

FUnicodeSyntheticCpForGID i kursor za sledeći dostupni PUA (FUnicodeNextSyntheticCp) lenjo se alociraju pri prvom AssignSyntheticCodepointForGID pozivu. Kursor kreće od 0 (uninitialised) i pri prvoj alokaciji prelazi na $E000; naredne alokacije ga pomeraju kroz $E001, $E002, ..., $F8FF. Oba polja se resetuju na prazno / 0 pri svakom RegisterUnicodeTTF('', nil) zajedno sa ostatkom per-font subset stanja, tako da pozivaoci koji ponovo koriste THotPDF instancu kroz više dokumenata započinju svaki dokument sa svežim PUA kursorom

 

Typical workflow (Devanagari cluster shape)

 

PDF.RegisterUnicodeTTF('NotoDeva', 'NotoSansDevanagari-Regular.ttf');

PDF.ShapingFeatures := [sfIndicShaping];

PDF.SetGSUBScript('deva');

 

// Get a font-internal cluster GID through the GSUB engine

ClusterGID := PDF.GetSingleSubstituteGlyph(BaseGID, 'nukt');

if ClusterGID <> BaseGID then

begin

  // Check if cmap reaches the substitute - usually no for Indic

  // clusters, since cluster GIDs are font-internal

  // Allocate a synthetic codepoint that the producer-side

  // hex pipeline can emit

  if PDF.AssignSyntheticCodepointForGID(ClusterGID, SyntheticCP) then

  begin

    // SyntheticCP is now in the U+E000-F8FF range; emit it

    // through UnicodeTextOut just like a normal codepoint

    PDF.CurrentPage.UnicodeTextOut(X, Y, 0, UnicodeChar(SyntheticCP));

    PDF.MarkUnicodeGlyphUsed(ClusterGID);

  end;

end;

 

Idempotency example

 

PDF.AssignSyntheticCodepointForGID(150, CP1);  // CP1 = $E000

PDF.AssignSyntheticCodepointForGID(151, CP2);  // CP2 = $E001

PDF.AssignSyntheticCodepointForGID(150, CP3);  // CP3 = $E000 (idempotent)

CP4 := PDF.GetSyntheticCodepointForGID(150);  // CP4 = $E000

CP5 := PDF.GetSyntheticCodepointForGID(999);  // CP5 = 0 (no assignment)

 

Consumer-reader behavior

Čitač dokumenta vidi PUA codepoint u operatoru za prikaz teksta i rešava ga preko dokumentom ugrađenog /CIDToGIDMap do ciljanog GID-a, a zatim prikazuje taj GID koristeći ugrađeni program fonta. Iz perspektive čitača nema razlike između "prirodnog" Unicode codepoint-a koji cmap usmerava ka GID-u i PUA sintetičkog codepoint-a koji /CIDToGIDMap usmerava ka GID-u - oba proizvode isti prikazani glif

 

Copy / paste ponašanje: PUA codepoint-i prolaze kroz copy / paste kao sami sebe kada ih ToUnicode CMap deklarše kao identity mappinge. Pozivaoci koji žele da se izvorni Unicode znakovi (ulazni niz koji je proizveo zamenu) umesto toga vrate kroz round-trip mogu da registruju reverse mapping preko RegisterToUnicodeReverseMapping ili da kroz BeginTaggedContent napišu ActualText svojstva marked-content sekvence i da sintetičke codepoint-e emituju unutar sadržaja u uglastim zagradama. HotPDF automatski koristi isti internal-CID obrazac za RegisterUnicodeTTF-backed AcroForm appearance stream-ove koji sadrže Unicode znakove iz dopunskih ravni

 

Phase 8 roadmap closure

v2.119.68 / Phase 8c.6 zatvara Phase 8 GSUB engine roadmap: svaki LookupType 1-8 query API (Phase 1-6), Script / LangSys selection API (Phase 7), TTF subsetter closure ulazna tačka (Phase 9), static post-pass ligature folding (v2.119.32 / 58 / 60 / 62), opcioni automatski pipeline (v2.119.59), automatsko emitovanje Arabic rlig + Latin liga / clig + rclt (Phase 8b / 8c.2 / 8b / GSUB 'rclt'), ToUnicode reverse-mapping (v2.119.61 / 62 / 65), advance query (v2.119.64), Devanagari Indic reorder pre-pass (v2.119.67) i sada PUA synthetic codepoint GID-level emit (v2.119.68) sve se integrišu u jedinstvenu producer-side shaping površinu koja obrađuje svaku vrstu zamenskog glifa koju OpenType font može da proizvede

 

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