|
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. 2. 3.
Sėkmės atveju grąžinama
GetSyntheticCodepointForGID semantics Gryna užklausa apie bet kurį esantį paskyrimą. Grąžinamas sintetinį kodopunktą skirtas
Allocator state lifecycle
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
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ų
See also: OpenType GSUB Substitution Engine, Automatic Shaping Pipeline (Phase 8), Arabic / Persian / Urdu Shaping Support, Syriac / Mongolian / Devanagari Shaping, THotPDF.BeginTaggedContent |