|
THotPDF.AssignSyntheticCodepointForGID / GetSyntheticCodepointForGID THotPDF allokerare för syntetiska PUA-kodpunkter (v2.119.68)
|
GSUB Engine Auto Shaping Pipeline Arabic Shaping |
|
Allokerar och frågar syntetiska kodpunkter i Private Use Area (U+E000 - U+F8FF) för OpenType GSUB-ersättnings-GID:er som saknar en naturlig Unicode-kodpunkt som kan nås via fontens cmap. Stänger emissionsluckan på GID-nivå på producentsidan som lämnades av GSUB-fråge- och förfinings-API:erna i v2.119.43-66
Delphi syntax: function AssignSyntheticCodepointForGID(GID: Word; out SyntheticCP: Word): Boolean; function GetSyntheticCodepointForGID(GID: Word): Word;
Varför API:t finns Den automatiska shaping-pipelinen på producentsidan i v2.119.32-67 (Arabic / Latin / Devanagari) kräver att ersättnings-GID:er som returneras av GSUB-motorn kan nås via en Unicode-kodpunkt - den befintliga hexkodade textpipelinen emitterar kodpunkter, inte GID:er, och konsumentläsaren löser tillbaka kodpunkten till ett GID via den inbäddade
Men fontspecifika ersättningar som landar på fontinterna GID:er - de flesta Devanagari-klusterformer, stilistiska alternativ som fontdesignern bara levererar som numrerade GID:er, CJK-ideografiska variationssekvenser (IVS), diskretionära ligaturer utan motsvarande Presentation Form - har ingen kodpunkt alls i fontens cmap. Före v2.119.68 var dessa GID:er onåbara via hexpipelinen på producentsidan; v2.119.68 stänger luckan genom att låta anropare allokera en syntetisk kodpunkt i Private Use Area för valfritt GID
Semantik för AssignSyntheticCodepointForGID Allokerar nästa tillgängliga PUA-kodpunkt (med start vid U+E000) för angivet GID och speglar tilldelningen till varje cache som den befintliga hexpipelinen på producentsidan + konsumentläsarens upplösningskedja beror på:
1. 2. 3.
Returnerar
Semantik för GetSyntheticCodepointForGID Ren funktionsfråga mot en befintlig tilldelning. Returnerar den syntetiska kodpunkt som allokerats för
Livscykel för allokerartillstånd
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)
Konsumentläsarens beteende Konsumentläsaren ser PUA-kodpunkten i textvisningsoperatorn och löser den via dokumentets inbäddade
Kopiera / klistra in-beteende: PUA-kodpunkter går runt som sig själva genom kopiera / klistra in när ToUnicode CMap deklarerar dem som identitetsmappningar. Anropare som i stället vill att källans Unicode-tecken ska gå runt kan registrera en omvänd mappning med
Avslutning av Phase 8-färdplanen v2.119.68 / Phase 8c.6 stänger färdplanen för Phase 8 GSUB-motorn: varje LookupType 1-8-fråge-API (Phase 1-6), API:t för Script / LangSys-val (Phase 7), TTF-subsetterns closure-ingångspunkt (Phase 9), statisk post-pass-ligaturvikning (v2.119.32 / 58 / 60 / 62), den opt-in automatiska pipelinen (v2.119.59), automatisk emission av Arabic
Se även: OpenType GSUB Substitution Engine, Automatic Shaping Pipeline (Phase 8), Arabic / Persian / Urdu Shaping Support, Syriac / Mongolian / Devanagari Shaping, THotPDF.BeginTaggedContent |