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 shaping eleva o mecanismo OpenType GSUB de uma superfície apenas de consulta de capacidades para um recurso de produção aplicado automaticamente quando o texto é emitido nos fluxos de conteúdo do PDF. Os chamadores habilitam recursos GSUB específicos por meio de um conjunto tipado (ShapingFeatures: THPDFShapingFeatures), e o HotPDF executa as substituições corretas, marca os glifos substitutos no subconjunto da fonte incorporada e emite as entradas de mapeamento reverso do 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,    // font-defined 'rlig' (Required Ligatures) for Arabic

    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 ...;

 

O padrão é [] (conjunto vazio), preservando saída byte a byte idêntica para chamadores que dependem do modelador estático pós-passagem da v2.119.32-58. Definir uma ou mais flags eleva o mecanismo para o modo automático nos recursos correspondentes

 

sfArabicGSUB - Phase 8c.2 (v2.119.63)

Quando sfArabicGSUB está definido, substituições rlig (Required Ligatures) declaradas pela fonte são aplicadas automaticamente a trechos de texto árabe. ApplyArabicGSUBRefinement percorre o cmap para montar uma matriz de GIDs, chama ApplyLigatureSubstitution com a tag de recurso rlig, mapeia os GIDs substitutos de volta pelo cmap reverso (cobrindo FB50-FDFF + FE70-FEFF Arabic Presentation Forms) para um codepoint Unicode e chama MarkUnicodeGlyphUsed para manter o glifo substituto no subconjunto da fonte incorporada. Isso cobre ligaduras específicas da fonte além das quatro famílias árabes codificadas diretamente (LAM-ALEF v2.119.32, YEH-HAMZA v2.119.58, Allah v2.119.60, Bismillah v2.119.62)

 

Definir sfArabicGSUB ignora implicitamente o modelador estático árabe de 4 posições da v2.85.0; chamadores que precisam manter o modelador estático tratando codepoints fora do que o GSUB da fonte declara devem deixar sfArabicGSUB desativado

 

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

Quando sfStandardLigatures está definido, as Latin Standard Ligatures são dobradas automaticamente usando o recurso liga da fonte. ApplyLatinLigatureRefinement mira 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 adiciona uma segunda passagem para o recurso clig da fonte. Ambas as passagens usam o mesmo mecanismo de cmap reverso de sfArabicGSUB e emitem 7 novas entradas de mapeamento reverso no ToUnicode CMap (FB00-FB06), para que copiar / colar no leitor consumidor resolva a ligadura de volta para as letras de origem

 

sfContextualAlternates - GSUB 'rclt' (v2.119.66)

Quando sfContextualAlternates está definido, o recurso rclt (Required Contextual Alternates) da fonte é aplicado. 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 pode ser alcançado pelo cmap reverso). O intervalo do cmap reverso é estendido para FB00-FDFF + FE70-FEFF para cobrir Latin + Arabic + Hebrew Presentation Forms

 

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á definido, a capacidade Devanagari ApplyDevanagariReorder da v2.119.55 é promovida de método manual para uma pré-passagem automática aplicada dentro dos três helpers BuildUnicode*FieldContent. Trechos Devanagari movem Repha (Ra + Halant no início do cluster) para a posição pós-base, e a I-matra pré-base (U+093F) para antes da consoante base do cluster, para que o mecanismo GSUB do leitor consumidor receba a sílaba na ordem correta de renderização. Outros reordenamentos índicos (matra acima da base / abaixo da base, formação de conjuncts) permanecem no GSUB da fonte

 

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

Uma API complementar expõe a fração em armazenada em cache de /W, para que os chamadores possam calcular quebra de linha corretamente ao emitir glifos substituídos por GSUB:

 

function GetCodepointAdvance(CP: Cardinal): Single;

 

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

 

Typical workflow (full Arabic auto-shaping)

 

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

PDF.ShapingFeatures :=

  [sfArabicGSUB,  // font-defined 'rlig'

   sfContextualAlternates];  // 'rclt' (positional shaping in GSUB-driven fonts)

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 opcional é intencionalmente aditivo sobre o modelador estático pós-passagem; chamadores existentes não veem mudança de comportamento a menos que optem por ele. O conjunto padrão [] é a escolha segura para regressões com bytes estáveis. Fontes sem as tabelas GSUB solicitadas produzem saída segura sem efeito (nenhuma substituição aplicada e nenhuma exceção levantada)

 

Mapa atual da API de formação

A canalização atual não é mais apenas de substituição: sfKerning aplica kerning de pares GPOS, sfMarkPositioning aplica deslocamentos Mark-to-Base e Mark-to-Mark, sfTibetanShaping aplica formação Tibetan GSUB, sfMongolianShaping aplica formas posicionais mongóis e sfIndicGSUB aplica a cadeia de recursos Indic GSUB após a reordenação de sílabas. Veja ShapingFeatures, GPOS methods e Indic shaping methods

As adições recentes incluem sfLocalizedForms para locl, calt por ApplyGSUBContextualFeature, kerning GPOS contextual e vertical, e os caminhos N'Ko, Adlam, Thai/Lao, Hebrew e Javanese. Veja script shaping preprocess methods

 

Consulte também: OpenType GSUB Substitution Engine, Arabic / Persian / Urdu Shaping Support, Syriac / Mongolian / Devanagari Shaping, THotPDF.AssignSyntheticCodepointForGID, CFF / OpenType Font Subsetting