Pipeline automático de shaping (Fase 8)

Pipeline GSUB opt-in no lado do produtor (v2.119.59 - v2.120.10)

 

Arabic Shaping  Shaping multi-script  GSUB Engine

O pipeline automático de shaping eleva a engine OpenType GSUB de uma superfície de consulta apenas de capacidade para uma feature no lado do produtor aplicada automaticamente conforme o texto é emitido nos content streams PDF. Os chamadores habilitam features GSUB específicas por meio de um conjunto tipado (ShapingFeatures: THPDFShapingFeatures) e o HotPDF cuida de rodar as substituições certas, marcar glifos substitutos no subset da fonte embutida e emitir as entradas de mapeamento reverso do ToUnicode CMap necessárias para acessibilidade.

 

Framework opt-in (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: THPDFShapingFeaturesread ...write ...;

 

O padrão é [] (conjunto vazio), o que preserva saída byte-idêntica para chamadores que dependem do shaper estático de pós-passada da v2.119.32-58. Definir uma ou mais flags eleva a engine ao modo automático para as features correspondentes.

 

sfArabicGSUB - shaping GSUB árabe nativo (v2.185.0)

Quando sfArabicGSUB está definido, o HotPDF mapeia um run árabe lógico para IDs de glifos base, aplica as consultas posicionais init, medi, fina e isol da fonte registrada nas posições de ligação selecionadas para cada letra, e depois aplica rlig, calt e rclt sobre o run com shaping. Glifos substitutos sem codepoint Unicode são emitidos pelo caminho de codepoints sintéticos com mapeamentos reversos ToUnicode, de modo que fontes cujos glifos árabes contextuais vivem fora do cmap ainda possam ser embutidas e copiadas corretamente

 

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

 

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

Quando sfStandardLigatures está definido, as Standard Ligatures latinas são fundidas automaticamente usando a feature liga da fonte. ApplyLatinLigatureRefinement mira o bloco Alphabetic Presentation Forms (U+FB00-FB4F) — tipicamente FB00 ff, FB01 fi, FB02 fl, FB03 ffi, FB04 ffl, FB05 long-s + t, FB06 st. sfContextualLigatures adiciona uma segunda passada para a feature clig da fonte. Ambas as passadas usam o mesmo mecanismo de reverse-cmap que sfArabicGSUB e emitem 7 novas entradas de mapeamento reverso no ToUnicode CMap (FB00-FB06), de modo que o copy / paste no leitor consumidor resolva a ligadura de volta às letras de origem.

 

sfContextualAlternates - GSUB 'rclt' (v2.119.66)

Quando sfContextualAlternates está definido, a feature rclt (Required Contextual Alternates) da fonte é aplicada. ApplyArabicGSUBContextualRefinement usa o ponto de entrada ApplyContextualSubst da v2.119.47 e trata saída N-para-M de comprimento variável (a substituição só é confirmada quando todo GID de substituição é alcançável pelo reverse cmap). A faixa do reverse cmap é estendida a FB00-FDFF + FE70-FEFF para cobrir Presentation Forms latinas + árabes + hebraicas.

 

Usuários canônicos de rclt: init / medi / fina / isol árabes quando a fonte dirige o shaping posicional por GSUB em vez de por codepoints de Unicode Presentation Forms; certas regras de desambiguação de sequências latinas; features de shaping índico pres / blws / psts / half / pstf / cjct quando registradas como rclt pelo designer da fonte.

 

sfIndicShaping - Phase 8e (v2.119.67)

Quando sfIndicShaping está definido, a capacidade de devanágari ApplyDevanagariReorder da v2.119.55 é promovida de método manual para pré-passada automática aplicada dentro dos três helpers de BuildUnicode*FieldContent. Runs de devanágari têm o Repha (Ra + Halant no início do cluster) movido para a posição pós-base, e a I-matra pré-base (U+093F) movida para antes da consoante base do cluster, de modo que a engine GSUB do leitor consumidor pegue a sílaba na ordem de renderização correta. As demais reordenações índicas (matra acima / abaixo da base, formação de conjuntos) permanecem no GSUB da fonte.

 

Suporte a consulta de avanços (v2.119.64 / Phase 8c.5)

Uma API complementar expõe a fração em em /W em cache, para que chamadores calcularem o word-wrap corretamente ao emitir glifos com substituição GSUB:

 

function GetCodepointAdvance(CP: Cardinal): Single;

 

Retorna a largura de avanço derivada do hmtx como fração do em para o glifo resolvido pelo 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).

 

Fluxo de trabalho típico (auto-shaping árabe completo)

 

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;

 

Fluxo de trabalho típico (Standard Ligatures latinas + reordenação de devanágari)

 

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

 

Fechamento do roadmap da Phase 8

Phase 8a (v2.119.59) framework opt-in + capacidade árabe; Phase 8b (v2.119.65) Standard Ligatures latinas; Phase 8c.1 (v2.119.60) Allah; Phase 8c.2 (v2.119.63) GSUB GID-level rlig; Phase 8c.3 (v2.119.61) mapeamento reverso ToUnicode; Phase 8c.4 (v2.119.62) Bismillah; Phase 8c.5 (v2.119.64) consulta de avanços + correção heurística; Phase 8c.6 (v2.119.68) emissão de codepoints sintéticos PUA; a Phase 8d foi incorporada às sub-fases 8c; Phase 8e (v2.119.67) auto-reordenação de devanágari. Com a v2.119.68 a matriz de capacidades da Phase 8 está fechada; refinamentos adicionais (scripts índicos extras, posicionamento OpenType GPOS, resolução BiDi) são acompanhados em itens separados do roadmap.

 

Escopo e limitações

O pipeline opt-in é intencionalmente aditivo sobre o shaper estático de pós-passada — chamadores existentes não veem mudança de comportamento, a menos que ativem. O conjunto padrão de [] é a escolha segura para regressão byte-estável. Fontes sem as tabelas de features GSUB solicitadas produzem saída no-op segura (chamadores não veem substituição aplicada nem exceções lançadas).

 

Mapa atual da API de shaping

O pipeline atual não é mais apenas de substituição: sfKerning aplica kerning par a par GPOS, sfMarkPositioning aplica offsets Mark-to-Base e Mark-to-Mark, sfMarkToLigature aplica posicionamento Mark-to-Ligature, sfCursiveAttachment aplica alinhamento de âncoras cursivas de entrada/saída, sfTibetanShaping aplica shaping GSUB tibetano, sfMongolianShaping aplica formas posicionais mongóis, e sfIndicGSUB aplica a cadeia de features GSUB índicas após a reordenação de sílabas. Veja ShapingFeatures, GPOS methods e Indic shaping methods

Adições recentes trazem sfLocalizedForms para locl, calt até ApplyGSUBContextualFeature, kerning GPOS contextual e vertical, emissão contextual nativa de glifos árabes via GSUB, e os caminhos N'Ko, Adlam, tailandês/lao, hebraico e javanês. Veja script shaping preprocess methods

 

See also: OpenType GSUB Substitution Engine, Suporte a shaping árabe / persa / urdu, Shaping siríaco / mongol / devanágari, THotPDF.AssignSyntheticCodepointForGID, Subsetting de fontes CFF / OpenType