THotPDF.AssignSyntheticCodepointForGID / GetSyntheticCodepointForGID

THotPDF PUA synteettisen koodipisteen varaaja (v2.119.68)

GSUB-moottori Automaattinen muotoiluputki Arabian muotoilu

Varaa ja hakee Private Use Area (U+E000 - U+F8FF) synteettisiä koodipisteitä sellaisille OpenType GSUB -korvaaville GID-tunnuksille, joilla ei ole luonnollista Unicode-koodipistettä saavutettavissa fontin cmapin kautta. Sulkee tuottajapuolen GID-tason tulostusraon, jonka v2.119.43-66 GSUB-haku- ja tarkennus-API:t jättivät

Delphi syntax:

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

function GetSyntheticCodepointForGID(GID: Word): Word;

Miksi API on olemassa

Version v2.119.32-67 tuottajapuolen automaattinen muotoiluputki (arabia / latina / Devanagari) vaatii, että GSUB-moottorin palauttamat korvaavat GID:t ovat saavutettavissa Unicode-koodipisteen kautta - olemassa oleva heksakoodattu tekstiputki lähettää koodipisteitä, ei GID-tunnuksia, ja kuluttajalukija ratkaisee koodipisteen takaisin GID-tunnukseksi upotetun /CIDToGIDMap-kartan kautta. Sellaisille korvaaville GID-tunnuksille, joilla on luonnollinen Unicode-koodipiste fontin cmap-kartan kautta (arabian esitysmuodot, latinalaiset standardiligatuurit FB00-FB06), nykyinen käsittelyputki toimii hyvin

Mutta fonttikohtaisilla korvikkeilla, jotka päätyvät fontin sisäisiin GID-tunnuksiin – useimmat devanagari-tavuryhmämuodot, tyylivaihtoehdot, jotka fontin suunnittelija toimittaa vain numeroituina GID-tunnuksina, CJK-ideografiset variaatiosarjat (IVS), vapaavalintaiset ligatuurit ilman vastaavaa Presentation Form -muotoa – ei ole lainkaan koodipistettä fontin cmap-taulukossa. Ennen versiota v2.119.68 nämä GID:t eivät olleet saavutettavissa tuottajapuolen heksaputken kautta; versio v2.119.68 sulkee tämän aukon antamalla kutsujien varata synteettisen koodipisteen Private Use Area -alueelta mille tahansa GID-tunnukselle

AssignSyntheticCodepointForGID semantics

Varaa seuraavan vapaan PUA-koodipisteen (alkaen arvosta U+E000) toimitetulle GID-tunnukselle ja peilaa kohdistuksen jokaiseen välimuistiin, josta olemassa oleva tuottajapuolen heksaputki + kuluttajan lukulaitteen selvitysketju riippuu:

1. FUnicodeCpToGid[SyntheticCP] := GID – jotta tuottajapuolen heksaputki tulostaa arvon SyntheticCP tekstinnäyttöoperaattoriin ja kuluttajan lukulaite selvittää arvon SyntheticCP takaisin arvoksi GID kohteen /CIDToGIDMap kautta piirtohetkellä

2. FAcroFormUnicodeAdvances[SyntheticCP] := em-fraction – jotta version v2.65 rivityslaskin löytää oikean hmtx-etenemän synteettiselle koodipisteelle sen esiintyessä AcroForm-tekstikentän sisällössä

3. FUnicodeSyntheticCpForGID[GID] := SyntheticCP – GID-kohtainen käänteishakutaulukko, jota metodi GetSyntheticCodepointForGID käyttää tehdäkseen toistuvista AssignSyntheticCodepointForGID-kutsuista idempotentteja (toinen kutsu samalla GID:llä palauttaa jo varatun arvon SyntheticCP)

Palauttaa arvon True onnistuessa, ja muuttujaan SyntheticCP asetetaan varattu koodipiste. Palauttaa arvon False (ja jättää muuttujan SyntheticCP arvoon 0) missä tahansa seuraavista puolustuksellisista olosuhteista: fonttia ei ole rekisteröity (metodia RegisterUnicodeTTF ei ole koskaan kutsuttu tai sitä on kutsuttu tyhjillä argumenteilla tilan nollaamiseksi), virheellinen GID (nolla tai cmap-kartan glyyfimäärän ylittävä), PUA-alue lopussa (kaikki 6400 paikkaa välillä U+E000 - U+F8FF on varattu), välimuisti alustamaton kutsun yhteydessä

GetSyntheticCodepointForGID semantics

Puhtaasti funktionaalinen kysely mistä tahansa olemassa olevasta määrityksestä. Palauttaa glyyfille GID varatun synteettisen koodipisteen, jos funktiota AssignSyntheticCodepointForGID(GID, ...) on kutsuttu aiemmin; muussa tapauksessa palauttaa arvon 0 (joka ei ole kelvollinen PUA-koodipiste, joten se toimii myös "ei määritystä" -vahtina). Ei varaa tilaa. Turvallista kutsua ennen kuin mitään AssignSyntheticCodepointForGID-kutsua on ajettu

Allocator state lifecycle

Taulukko FUnicodeSyntheticCpForGID ja seuraava vapaa PUA-osoitin (FUnicodeNextSyntheticCp) varataan laiskasti ensimmäisen AssignSyntheticCodepointForGID-kutsun yhteydessä. Osoitin alkaa arvosta 0 (alustamaton) ja siirtyy arvoon $E000 ensimmäisessä varauksessa; myöhemmät varaukset siirtävät sitä arvojen $E001, $E002, ..., $F8FF kautta. Molemmat kentät nollataan tyhjiksi / arvoon 0 jokaisen RegisterUnicodeTTF('', nil) -kutsun yhteydessä yhdessä muun fonttikohtaisen alijoukkotilan kanssa, joten kutsujat, jotka käyttävät samaa THotPDF-instanssia useissa dokumenteissa, aloittavat kunkin dokumentin puhtaalla PUA-osoittimella

Typical workflow (Devanagari cluster shape)

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

PDF.ShapingFeatures := [sfIndicShaping];

PDF.SetGSUBScript('deva');

// Hae fontin sisäinen ryhmä-GID GSUB-moottorin kautta

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

if ClusterGID <> BaseGID then

begin

// Tarkista, saavuttaako cmap korvaavan - yleensä ei Indicille

// klusterit, koska klusterin GID:t ovat fontin sisäisiä

// Varaa synteettinen koodipiste, jonka tuottajapuolen

// hex pipeline can emit

if PDF.AssignSyntheticCodepointForGID(ClusterGID, SyntheticCP) then

begin

// SyntheticCP on nyt alueella U+E000-F8FF; tuota se

// UnicodeTextOutin kautta aivan kuten normaali koodipiste

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

Lukulaitteen kuluttaja näkee PUA-koodipisteen tekstinnäyttöoperaattorissa ja ratkaisee sen dokumenttiin upotetun /CIDToGIDMap-kartan kautta kohde-GID:ksi, ja hahmontaa sitten kyseisen GID:n käyttämällä upotettua fonttiohjelmaa. Lukijan näkökulmasta ei ole eroa "luonnollisella" Unicode-koodipisteellä, jonka cmap reitittää kohteeseen GID, ja synteettisellä PUA-koodipisteellä, jonka /CIDToGIDMap reitittää kohteeseen GID - molemmat tuottavat saman hahmonnetun glyyfin

Kopioi/liitä-toiminta: PUA-koodipisteet palautuvat sellaisenaan kopioinnin ja liittämisen kautta, kun ToUnicode CMap ilmoittaa ne identiteettikartoituksina. Kutsujat, jotka haluavat alkuperäisten Unicode-merkkien (korvauksen tuottaneen syötesarjan) palautuvan sen sijaan, voivat rekisteröidä käänteisen kartoituksen metodilla RegisterToUnicodeReverseMapping tai luoda ActualText-merkityn sisällön sarjaominaisuuksia metodin BeginTaggedContent kautta ja tulostaa synteettiset koodipisteet suljetun sisällön sisällä. HotPDF käyttää samaa sisäistä CID-mallia automaattisesti RegisterUnicodeTTF-pohjaisille AcroForm-ulkoasuvirroille, jotka sisältävät lisätason Unicode-merkkejä

Phase 8 roadmap closure

v2.119.68 / vaihe 8c.6 sulkee vaiheen 8 GSUB-moottorin tiekartan: jokainen LookupType 1-8 -kysely-API (vaihe 1-6), Script- / LangSys-valinta-API (vaihe 7), TTF-osittajan sulkeuman aloituspiste (vaihe 9), staattinen jälkikäsittelyn ligatuurin taitto (v2.119.32 / 58 / 60 / 62), valinnainen automaattinen käsittelyputki (v2.119.59), arabian rlig + latinan liga / clig + rclt automaattinen lähetys (vaihe 8b / 8c.2 / 8b / GSUB 'rclt'), ToUnicode-käänteiskartoitus (v2.119.61 / 62 / 65), etenemäkysely (v2.119.64), Devanagari Indic -järjestelyn esivaihe (v2.119.67) ja nyt synteettisen PUA-koodipisteen GID-tason lähetys (v2.119.68) integroituvat kaikki yhdeksi tuottajapuolen muotoilurajapinnaksi, joka käsittelee kaikentyyppiset korvaavat glyyfit, joita OpenType-fontti voi tuottaa

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