|
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
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
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: As adições recentes incluem
Consulte também: OpenType GSUB Substitution Engine, Arabic / Persian / Urdu Shaping Support, Syriac / Mongolian / Devanagari Shaping, THotPDF.AssignSyntheticCodepointForGID, CFF / OpenType Font Subsetting |