|
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
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. 2. 3.
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
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 |