|
THotPDF.AssignSyntheticCodepointForGID / GetSyntheticCodepointForGID THotPDF dodeljevalnik sintetičnih kodnih točk PUA (v2.119.68)
|
GSUB Engine Auto Shaping Pipeline Arabic Shaping |
|
Dodeljuje in poizveduje sintetične kodne točke Private Use Area (U+E000 - U+F8FF) za nadomestne GID-je OpenType GSUB, ki prek fontovega cmap nimajo naravne Unicode kodne točke. Zapolnjuje vrzel pri izpisu na strani proizvajalca na ravni GID, ki je ostala po API-jih GSUB query in refinement iz v2.119.43-66
Delphi syntax: function AssignSyntheticCodepointForGID(GID: Word; out SyntheticCP: Word): Boolean; function GetSyntheticCodepointForGID(GID: Word): Word;
Zakaj obstaja ta API Cevovod samodejnega oblikovanja na strani proizvajalca v v2.119.32-67 (arabski / latinski / devanagarski) zahteva, da so nadomestni GID-ji, ki jih vrne pogon GSUB, dosegljivi prek kodne točke Unicode - obstoječi cevovod besedila z hex-encoded izpisom izpisuje kodne točke, ne GID-jev, odjemalski bralnik pa kodno točko razreši nazaj v GID prek vdelanega
Toda nadomestki, vezani na posamezno pisavo, ki pristanejo v notranjih GID-jih pisave - večina Devanagarskih grozdnih oblik, slogovne alternative, ki jih oblikovalec pisave ponuja le kot oštevilčene GID-je, zaporedja ideografskih različic CJK (IVS) in diskrecijske ligature brez ustrezne Presentation Form - v pisavi cmap sploh nimajo kodne točke. Pred v2.119.68 so bili ti GID-ji prek proizvajalčevega heksadecimalnega cevovoda nedosegljivi; v2.119.68 to vrzel zapira tako, da klicatelju dovoli dodeliti sintetično kodno točko v območju Private Use Area za katerikoli GID
Semantika AssignSyntheticCodepointForGID Dodeli naslednjo prosto kodno točko PUA (začetek pri U+E000) za podani GID in dodelitev zrcali v vse predpomnilnike, od katerih je odvisna obstoječa veriga proizvajalčevega heksadecimalnega cevovoda + razreševanja pri odjemalcu
1. 2. 3.
Vrne True ob uspehu, pri čemer SyntheticCP dobi dodeljeno kodno točko. Vrne False (in SyntheticCP pusti pri 0) ob katerem koli od teh varnostnih pogojev: pisava ni registrirana (RegisterUnicodeTTF ni bil nikoli klican ali je bil klican z praznimi argumenti za ponastavitev stanja), neveljaven GID (0 ali prek števila glifov v cmap), območje PUA je izčrpano (vseh 6400 mest U+E000 - U+F8FF je zasedenih), predpomnilnik ob vstopu ni inicializiran
Semantika GetSyntheticCodepointForGID Čisto funkcionalno poizvedovanje po obstoječi dodelitvi. Vrne sintetično kodno točko, dodeljeno GID, če je bil AssignSyntheticCodepointForGID(GID, ...) že klican; sicer vrne 0 (kar ni veljavna kodna točka PUA, zato deluje tudi kot oznaka »brez dodelitve«). Ne dodeljuje ničesar. Varno za klic pred katerimkoli zagonom AssignSyntheticCodepointForGID
Življenjski cikel stanja dodeljevalnika FUnicodeSyntheticCpForGID in kazalec na naslednjo prosto kodno točko PUA (FUnicodeNextSyntheticCp) se ob prvem klicu AssignSyntheticCodepointForGID dodelita leno. Kazalec se začne pri 0 (neinicializiran) in se ob prvi dodelitvi premakne na $E000; naslednje dodelitve ga premikajo skozi $E001, $E002, ..., $F8FF. Obe polji se ob vsakem RegisterUnicodeTTF('', nil) skupaj s preostalim stanjem podnabora po pisavi ponastavita na prazno / 0, zato klicatelji, ki ponovno uporabijo primerek THotPDF za več dokumentov, vsak dokument začnejo s svežim kazalcem PUA
Tipičen potek dela (oblika skupka Devanagari)
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;
Primer idempotentnosti
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)
Vedenje odjemalskega bralnika Odjemalski bralnik vidi kodno točko PUA v operatorju za izris besedila in jo prek dokumenta vdelanega
Obnašanje kopiraj / prilepi: kodne točke PUA se pri kopiranju / lepljenju vrnejo kot same, kadar ToUnicode CMap zanje določa identitetne preslikave. Klicatelji, ki želijo, da se namesto tega vrnejo izvorni Unicode znaki (vhodni niz, ki je ustvaril nadomestek), lahko registrirajo obratno preslikavo z RegisterToUnicodeReverseMapping ali avtorsko ustvarijo lastnosti označenega vsebinskega zaporedja ActualText prek BeginTaggedContent in sintetične kodne točke izpišejo znotraj oklepajske vsebine. HotPDF uporablja isti notranji vzorec CID samodejno za AcroForm appearance stream-e, vezane na RegisterUnicodeTTF, ki vsebujejo Unicode znake iz dodatnih ravnin
Zaključek načrta Phase 8 v2.119.68 / Faza 8c.6 zapira načrt Faze 8 za pogon GSUB: vsak API za poizvedbe LookupType 1-8 (Faza 1-6), API za izbiro Script / LangSys (Faza 7), vstopna točka za zapiranje TTF podskladnika (Faza 9), statično zlaganje ligatur v naknadnem prehodu (v2.119.32 / 58 / 60 / 62), izbirni samodejni cevovod (v2.119.59), samodejni izpis Arabic rlig + Latin liga / clig + rclt (Faza 8b / 8c.2 / 8b / GSUB 'rclt'), obratno preslikavo ToUnicode (v2.119.61 / 62 / 65), poizvedbo napredka (v2.119.64), predhodni prehod za preurejanje devanagarskega Indic (v2.119.67) in zdaj izpis sintetičnih kodnih točk PUA na ravni GID (v2.119.68) se združijo v enoten proizvajalčev oblikovalni vmesnik, ki obravnava vsak tip nadomestnega glifa, ki ga lahko ustvari pisava OpenType
See also: OpenType GSUB Substitution Engine, Automatic Shaping Pipeline (Phase 8), Arabic / Persian / Urdu Shaping Support, Syriac / Mongolian / Devanagari Shaping, THotPDF.BeginTaggedContent |