THotPDF.AssignSyntheticCodepointForGID / GetSyntheticCodepointForGID

THotPDF PUA synthetic codepoint allocator (v2.119.68)

 

GSUB Engine  Auto Shaping Pipeline  Arabic Shaping

Sukuria ir užklausia Private Use Area (U+E000 - U+F8FF) sintetinius kodo taškus OpenType GSUB pakaitiniams GID, kurių natūralių Unicode kodo taškų šrifto cmap nepasiekia. Užpildo gamintojo pusėje likusią GID lygio išvedimo spragą, kurią paliko v2.119.43-66 GSUB užklausų ir patikslinimo API

 

Delphi syntax:

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

function GetSyntheticCodepointForGID(GID: Word): Word;

 

Why the API exists

v2.119.32-67 gamintojo pusės automatinė formavimo grandinė (Arabic / Latin / Devanagari) reikalauja, kad GSUB variklio grąžinti pakaitiniai GID būtų pasiekiami per Unicode kodinį tašką - esamas hex koduotas teksto kelias išveda kodinius taškus, o ne GID, ir vartotojo skaitytuvas kodinį tašką per embedded /CIDToGIDMap paverčia atgal į GID. Pakaitiniams GID, kurie turi natūralų Unicode kodinį tašką per šrifto cmap (Arabic Presentation Forms, Latin Standard Ligatures FB00-FB06), esamas kelias veikia puikiai

 

Tačiau šrifto specifiniai pakaitalai, patenkantys į šrifto vidinius GID - dauguma Devanagari klasterių formų, stilistinės alternatyvos, kurias šrifto kūrėjas pateikia tik kaip sunumeruotus GID, CJK ideografinių variantų sekos (IVS), savavališkos ligatūros be atitinkamos Presentation Form - neturi jokių kodopunktų fonto cmap. Prieš versiją v2.119.68 šie GID buvo nepasiekiami per gamintojo pusės šešioliktainės skaičių konvejerį; v2.119.68 užpildo šį tarpą, nes leidžia iškvietėjams priskirti dirbtinį kodopunktą Private Use Area bet kuriam GID

 

AssignSyntheticCodepointForGID semantics

Suteikia kitą laisvą PUA kodo tašką (pradedant nuo U+E000) pateiktam GID ir atspindi priskyrimą į kiekvieną talpyklą, nuo kurios priklauso esama gamintojo pusės hex vamzdyno + skaitytojo sprendimo grandinė

 

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).

 

Sėkmės atveju grąžinama True, o SyntheticCP nustatomas į paskirtą kodopunktą. Grąžinama False (o SyntheticCP lieka 0) šiais apsaugos atvejais: neregistruotas šriftas (RegisterUnicodeTTF nebuvo iškviestas arba iškviestas su tuščiais argumentais būsenai atstatyti), neteisingas GID (0 arba didesnis už cmap glifų skaičių), PUA diapazonas išnaudotas (visi 6400 lizdų U+E000 - U+F8FF rezervuoti), talpykla neinicijuota įėjime

 

GetSyntheticCodepointForGID semantics

Gryna užklausa apie bet kurį esantį paskyrimą. Grąžinamas sintetinį kodopunktą skirtas GID, jei ankstesnis AssignSyntheticCodepointForGID(GID, ...) iškvietimas buvo įvykdytas; kitu atveju grąžinama 0 (tai nėra galiojantis PUA kodopunktas, todėl jis taip pat tarnauja kaip „nėra paskyrimo“ žymuo). Neatlieka paskyrimo. Saugus iškviesti prieš bet kurį AssignSyntheticCodepointForGID paleidimą

 

Allocator state lifecycle

FUnicodeSyntheticCpForGID ir kitas prieinamas PUA žymeklis (FUnicodeNextSyntheticCp) priskiriamas su delsimu pirmajame AssignSyntheticCodepointForGID iškvietime. Žymeklis prasideda 0 (neinicijuotas) ir pereina į $E000 pirmojo paskyrimo metu; vėlesni paskyrimai juda per $E001, $E002, ..., $F8FF. Abu laukai sugrąžinami į tuščią / 0 kiekvienu RegisterUnicodeTTF('', nil) iškvietimu kartu su kita vieno šrifto dalies būsena, todėl iškvietėjai, kurie naudoja tą patį THotPDF keliems dokumentams, pradeda kiekvieną dokumentą su šviežiu PUA žymekliu

 

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

Vartotojo skaitytuvas teksto rodymo operatoriuje mato PUA kodinį tašką ir per dokumente įterptą /CIDToGIDMap išsprendžia jį į tikslinį GID, tada tame embedded font programoje tą GID išveda. Skaitytuvo požiūriu nėra skirtumo tarp „natūralaus“ Unicode kodinio taško, kurį cmap nukreipia į GID, ir PUA sintetinio kodinio taško, kurį /CIDToGIDMap nukreipia į GID - abu pateikia tą patį atvaizduotą glifą

 

Kopijavimo / įklijavimo elgsena: PUA kodopunktai grįžta per kopijavimą / įklijavimą kaip patys, kai ToUnicode CMap juos pažymi kaip tapatybės susiejimus. Iškvietėjai, kurie nori, kad pradiniai Unicode simboliai (įvesties sekos, sukūrusios pakaitalą) taip pat grįžtų, gali registruoti atvirkštinį susiejimą su RegisterToUnicodeReverseMapping arba parengti ActualText pažymėto turinio sekos savybes per BeginTaggedContent ir pateikti sintetinį kodopunktą skliaustuose. HotPDF automatiškai naudoja tą patį vidinį CID šabloną RegisterUnicodeTTF-pagrįstiems AcroForm atvaizdo srautams, kuriuose yra papildomo plano Unicode simboliai

 

Phase 8 roadmap closure

v2.119.68 / Phase 8c.6 uždaro Phase 8 GSUB variklio planą: visos užklausos API LookupType 1-8 (Phase 1-6), Script / LangSys pasirinkimo API (Phase 7), TTF subsetter uždarymo įėjimo taško (Phase 9), statistinis post-pass ligatūrų sulankstymas (v2.119.32 / 58 / 60 / 62), pasirinktos automatinės eilės (v2.119.59), arabų rlig + lotynų liga / clig + rclt automatinis išvedimas (Phase 8b / 8c.2 / 8b / GSUB 'rclt'), ToUnicode atvirkštinis žemėlapis (v2.119.61 / 62 / 65), perėjimo užklausa (v2.119.64), Devanagari Indic perkėlimo išankstinis etapas (v2.119.67) ir dabar PUA sintetinio kodopunkto GID lygio išvedimas (v2.119.68) sujungiami į vieną gamintojo pusės formavimo paviršių, kuris apdoroja kiekvieną pakaitalų tipo glifą, kurį gali sugeneruoti OpenType šriftas

 

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