Automatic Shaping Pipeline (Phase 8)

Opt-in producer-side GSUB pipeline (v2.119.59 - v2.120.10)

 

Arabic Shaping  Multi-Script Shaping  GSUB Engine

O pipeline automático de formação eleva o motor GSUB OpenType de uma superfície de consulta apenas de capacidades para uma funcionalidade do lado do produtor que é aplicada automaticamente à medida que o texto é emitido para fluxos de conteúdo PDF. Os chamadores ativam funcionalidades GSUB específicas através de um conjunto tipado (ShapingFeatures: THPDFShapingFeatures) e o HotPDF trata de executar as substituições certas, marcar glifos substitutos no subconjunto de tipo de letra incorporado e emitir as entradas de mapeamento reverso da ToUnicode CMap necessárias para acessibilidade

 

Opt-in framework (v2.119.59 / Phase 8a)

A new enum and property control which automatic substitutions run during text emission:

 

type

  THPDFShapingFeature = (

    sfArabicGSUB,    // native Arabic init / medi / fina / isol + rlig / calt / rclt

    sfStandardLigatures, // Latin 'liga' (ff / fi / fl / ffi / ffl / sft / st)

    sfContextualLigatures,// Latin 'clig' (contextual ligatures)

    sfContextualAlternates,// 'rclt' (Required Contextual Alternates)

    sfIndicShaping); // Devanagari Repha + pre-base I-matra reorder

  THPDFShapingFeatures = set of THPDFShapingFeature;

 

property ShapingFeatures: THPDFShapingFeatures read ... write ...;

 

A predefinição é [] (conjunto vazio), o que preserva saída byte a byte idêntica para chamadores que dependem do shaper estático de pós-processamento v2.119.32-58. Definir uma ou mais flags eleva o motor para o modo automático das funcionalidades correspondentes

 

sfArabicGSUB - native Arabic GSUB shaping (v2.185.0)

Quando sfArabicGSUB está ativo, o HotPDF mapeia um trecho árabe lógico para IDs de glifo base, aplica as pesquisas posicionais init, medi, fina e isol do tipo de letra registado nas posições de junção selecionadas para cada letra e depois aplica rlig, calt e rclt sobre o trecho formado. Glifos substitutos que não têm codepoint Unicode são emitidos através do caminho de codepoints sintéticos com mapeamentos reversos ToUnicode, para que tipos de letra cujos glifos árabes contextuais vivem fora da cmap ainda possam ser incorporados e copiados corretamente

 

Definir sfArabicGSUB contorna implicitamente o shaper estático de 4 posições v2.85.0 para árabe - os chamadores que precisem que o shaper estático continue a tratar codepoints fora do que a GSUB da fonte declara devem deixar sfArabicGSUB desligado

 

sfStandardLigatures / sfContextualLigatures - Phase 8b (v2.119.65)

Quando sfStandardLigatures está ativo, as Latin Standard Ligatures são fundidas automaticamente usando a funcionalidade liga do tipo de letra. ApplyLatinLigatureRefinement aponta para o bloco Alphabetic Presentation Forms (U+FB00-FB4F) - normalmente FB00 ff, FB01 fi, FB02 fl, FB03 ffi, FB04 ffl, FB05 long-s + t, FB06 st. sfContextualLigatures acrescenta uma segunda passagem para a funcionalidade clig do tipo de letra. Ambas as passagens usam o mesmo mecanismo de reverse-cmap que sfArabicGSUB e emitem 7 novas entradas de mapeamento reverso da ToUnicode CMap (FB00-FB06) para que a cópia / colagem no leitor consumidor recupere a ligadura para as letras de origem

 

sfContextualAlternates - GSUB 'rclt' (v2.119.66)

Quando sfContextualAlternates está ativo, é aplicada a funcionalidade rclt (Required Contextual Alternates) do tipo de letra. ApplyArabicGSUBContextualRefinement usa o ponto de entrada ApplyContextualSubst da v2.119.47 e trata de saída variável N-para-M (a substituição só é confirmada quando cada GID de substituição é alcançável através da reverse cmap). O intervalo da reverse cmap é alargado para FB00-FDFF + FE70-FEFF para abranger Presentation Forms latinas + árabes + hebraicas

 

Canonical users of rclt: Arabic init / medi / fina / isol when the font drives positional shaping through GSUB instead of through Unicode Presentation Forms codepoints; certain Latin sequence disambiguation rules; Indic shaping pres / blws / psts / half / pstf / cjct features when registered as rclt by the font designer.

 

sfIndicShaping - Phase 8e (v2.119.67)

Quando sfIndicShaping está ativo, a capacidade Devanagari ApplyDevanagariReorder da v2.119.55 passa de método manual a pré-passagem automática aplicada dentro dos três auxiliares BuildUnicode*FieldContent. Os trechos Devanagari recebem o Repha (Ra + Halant no início do agrupamento) deslocado para a posição pós-base e o I-matra pré-base (U+093F) deslocado para antes da consoante base do agrupamento, para que o motor GSUB do leitor consumidor apanhe a sílaba na ordem de renderização correta. Outras reordenações Indic (matra acima / abaixo da base, formação de conjuntos) continuam na GSUB do tipo de letra

 

Advance-query support (v2.119.64 / Phase 8c.5)

A API complementar expõe o valor de /W em-fraction em cache para que os chamadores possam calcular corretamente a quebra de linha ao emitir glifos substituídos por GSUB:

 

function GetCodepointAdvance(CP: Cardinal): Single;

 

Devolve a largura de avanço derivada de hmtx como fração do em para o glifo resolvido pela cmap em CP. A mesma versão também corrigiu CodeUnitAdvance para classificar as Arabic Presentation Forms (U+FB50-FDFF + U+FE70-FEFF) como NARROW em vez de WIDE (o fallback heurístico estava errado antes da v2.65)

 

Typical workflow (full Arabic auto-shaping)

 

PDF.RegisterUnicodeTTF('NotoArab', 'NotoSansArabic-Regular.ttf');

PDF.ShapingFeatures :=

  [sfArabicGSUB,  // native Arabic GSUB contextual glyphs

   sfCursiveAttachment];  // GPOS cursive entry / exit anchors

PDF.SetGSUBScript('arab');

PDF.BeginDoc;

PDF.CurrentPage.SetFont('NotoArab', [], 14);

PDF.CurrentPage.RtLTextOut(100, 700, 0,

  UnicodeString(#$0628#$0633#$0645#$0020#$0627#$0644#$0644#$0647));

PDF.EndDoc;

 

Typical workflow (Latin standard ligatures + Devanagari reorder)

 

PDF.RegisterUnicodeTTF('NotoSans', 'NotoSans-Regular.ttf');

PDF.RegisterUnicodeTTF('NotoDeva', 'NotoSansDevanagari-Regular.ttf');

PDF.ShapingFeatures :=

  [sfStandardLigatures, // FB00-FB06 Latin liga

   sfContextualLigatures, // + clig

   sfIndicShaping]; // Devanagari Repha + I-matra reorder

 

Phase 8 roadmap closure

Phase 8a (v2.119.59) opt-in framework + Arabic capability; Phase 8b (v2.119.65) Latin standard ligatures; Phase 8c.1 (v2.119.60) Allah; Phase 8c.2 (v2.119.63) GID-level GSUB rlig; Phase 8c.3 (v2.119.61) ToUnicode reverse mapping; Phase 8c.4 (v2.119.62) Bismillah; Phase 8c.5 (v2.119.64) advance query + heuristic fix; Phase 8c.6 (v2.119.68) PUA synthetic codepoint emit; Phase 8d was rolled into 8c sub-phases; Phase 8e (v2.119.67) Devanagari auto-reorder. With v2.119.68 the Phase 8 capability matrix is closed; further refinements (additional Indic scripts, OpenType GPOS positioning, BiDi resolution) are tracked under separate roadmap items.

 

Scope and limitations

O pipeline opt-in é deliberadamente aditivo em relação ao formador estático de pós-passagem - os chamadores existentes não veem qualquer alteração de comportamento a menos que optem por o ativar. O conjunto predefinido [] é a escolha segura para regressão com bytes estáveis. Tipos de letra sem as tabelas da funcionalidade GSUB pedida produzem saída segura sem efeito (os chamadores não veem qualquer substituição aplicada nem exceções lançadas)

 

Mapa atual da API de formação

O pipeline atual já não é apenas de substituição: sfKerning aplica kerning de pares GPOS, sfMarkPositioning aplica deslocamentos Mark-to-Base e Mark-to-Mark, sfMarkToLigature aplica posicionamento Mark-to-Ligature, sfCursiveAttachment aplica alinhamento de âncoras de entrada / saída cursivas, sfTibetanShaping aplica formação GSUB tibetana, sfMongolianShaping aplica formas posicionais mongóis e sfIndicGSUB aplica a cadeia de funcionalidades Indic GSUB após a reordenação silábica. Veja ShapingFeatures, GPOS methods e Indic shaping methods

As adições recentes incluem sfLocalizedForms para locl, calt através de ApplyGSUBContextualFeature, kerning GPOS contextual e vertical, emissão nativa de glifos contextuais GSUB em árabe e os caminhos N'Ko, Adlam, Thai/Lao, hebraico e javanês. Consulte os métodos de pré-processamento de shaping de script

 

See also: OpenType GSUB Substitution Engine, Arabic / Persian / Urdu Shaping Support, Syriac / Mongolian / Devanagari Shaping, THotPDF.AssignSyntheticCodepointForGID, CFF / OpenType Font Subsetting