|
THotPDF.AssignSyntheticCodepointForGID / GetSyntheticCodepointForGID THotPDF PUA synthetic codepoint allocator (v2.119.68)
|
GSUB Engine Auto Shaping Pipeline Arabic Shaping |
|
Aloca e consulta codepoints sintéticos da Private Use Area (U+E000 - U+F8FF) para GIDs substitutos GSUB do OpenType que não têm qualquer codepoint Unicode natural alcançável através do cmap do tipo de letra. Fecha a lacuna de emissão ao nível do GID do lado do produtor deixada pelas APIs de consulta e refinamento GSUB v2.119.43-66
Delphi syntax: function AssignSyntheticCodepointForGID(GID: Word; out SyntheticCP: Word): Boolean; function GetSyntheticCodepointForGID(GID: Word): Word;
Why the API exists O pipeline automático de formação do lado do produtor v2.119.32-67 (árabe / latina / devanagari) exige que os GIDs substitutos devolvidos pelo motor GSUB sejam alcançáveis através de um codepoint Unicode - o pipeline de texto em hexadecimal existente emite codepoints, não GIDs, e o leitor consumidor resolve o codepoint de volta para um GID através do
Mas os substitutos específicos da fonte que caem em GIDs internos da fonte - a maioria das formas de agrupamento Devanagari, alternates estilísticos que o designer da fonte fornece apenas como GIDs numerados, sequências de variação ideográfica CJK (IVS), ligaduras discricionárias sem Presentation Form correspondente - não têm qualquer codepoint no cmap da fonte. Antes do v2.119.68 estes GIDs eram inalcançáveis através do pipeline hex do lado do produtor; o v2.119.68 fecha essa lacuna ao permitir que os chamadores aloque um codepoint sintético na Private Use Area para qualquer GID
AssignSyntheticCodepointForGID semantics Aloca o próximo codepoint PUA disponível (a começar em U+E000) para o GID fornecido e espelha a atribuição em todas as caches de que dependem o pipeline hex existente do lado do produtor + a cadeia de resolução do leitor consumidor:
1. 2. 3.
Devolve True em caso de sucesso com SyntheticCP definido para o codepoint alocado. Devolve False (e deixa SyntheticCP em 0) em qualquer uma destas condições defensivas: nenhum tipo de letra registado (RegisterUnicodeTTF nunca chamado ou chamado com argumentos vazios para repor o estado), GID inválido (zero ou além da contagem de glifos do cmap), intervalo PUA esgotado (todos os 6400 slots U+E000 - U+F8FF alocados), cache não inicializada à entrada
GetSyntheticCodepointForGID semantics Consulta puramente funcional de qualquer atribuição existente. Devolve o codepoint sintético atribuído a
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 O leitor consumidor vê o codepoint PUA no operador de apresentação de texto e resolve-o através do
Comportamento de copiar / colar: os codepoints PUA fazem round-trip como eles próprios através de copiar / colar quando o ToUnicode CMap os declara como mapeamentos de identidade. Os chamadores que pretendam que os caracteres Unicode de origem (a sequência de entrada que produziu o substituto) façam round-trip em vez disso podem registar um mapeamento inverso com
Phase 8 roadmap closure v2.119.68 / Fase 8c.6 fecha a folha de rota do motor GSUB da Fase 8: todas as APIs de consulta LookupType 1-8 (Fases 1-6), a API de selecção Script / LangSys (Fase 7), o ponto de entrada de fecho do subsetter TTF (Fase 9), o pregueamento estático pós-passagem de ligaduras (v2.119.32 / 58 / 60 / 62), o pipeline automático opcional (v2.119.59), a emissão automática de
See also: OpenType GSUB Substitution Engine, Automatic Shaping Pipeline (Phase 8), Arabic / Persian / Urdu Shaping Support, Syriac / Mongolian / Devanagari Shaping, THotPDF.BeginTaggedContent |