Syriac / Mongolian / Devanagari Shaping Support

Multi-script capability surfaces (v2.119.53 - v2.119.55)

 

Arabic Shaping  Auto Shaping Pipeline  GSUB Engine

O HotPDF expõe superfícies de capacidade de classificação de junção / análise posicional / categoria silábica Indic para três scripts complexos além do árabe: siríaco (U+0700-U+074F), mongol (U+1800-U+18AF) e devanágari (U+0900-U+097F). Cada capacidade permite que os chamadores conduzam o script através do motor OpenType GSUB existente para obter shaping correto, mantendo o trabalho pesado (deteção de limites de cluster, resolução BiDi, posicionamento GPOS) fora do âmbito do HotPDF

 

Syriac shaping capability (v2.119.53)

Two new methods expose Syriac's joining behavior:

 

function GetSyriacJoiningClass(CP: Cardinal): TJoiningClass;

function GetSyriacPosition(const Run: array of Cardinal; Index: Integer): TPosition;

 

O siríaco segue a mesma estrutura de quatro classes Right-Joining / Dual-Joining / Transparent / Non-Joining que o árabe; GetSyriacJoiningClass classifica cada codepoint no bloco U+0700-U+074F de acordo com a propriedade Unicode joining. GetSyriacPosition percorre um run siríaco e resolve cada caráter para a sua posição isolada / inicial / medial / final com base nas classes de junção dos vizinhos imediatos

 

Ao contrário do árabe, o bloco siríaco não tem Presentation Forms pré-codificadas em Unicode - não existe equivalente siríaco dos blocos Arabic Presentation Forms U+FB50-FDFF / U+FE70-FEFC. Os consumidores têm de conduzir o shaping siríaco através de lookups GSUB definidos pelo tipo de letra (tipicamente init / medi / fina / isol + rlig) em vez de reescrita de codepoints. A camada de capacidades acima dá aos chamadores as etiquetas de posição de que precisam para consultar a funcionalidade GSUB certa para cada glifo

 

Mongolian shaping capability (v2.119.54)

Two parallel methods for Mongolian:

 

function GetMongolianJoiningClass(CP: Cardinal): TJoiningClass;

function GetMongolianPosition(const Run: array of Cardinal; Index: Integer): TPosition;

 

A cobertura inclui mongol básico (U+1820-U+1842), Todo (U+1843-U+1877), Sibe (U+1880-U+18A8), Manchu e extensões Ali Gali. Os seletors de variação FVS1 / FVS2 / FVS3 (U+180B-U+180D), o hífen suave NIRUGU (U+180A) e os sinais vocálicos Ali Gali são todos classificados como Transparent (classe T), para que participem na junção sem quebrar a varredura

 

Tal como o siríaco, o mongol não tem Presentation Forms pré-codificadas em Unicode. O layout vertical tradicional do mongol, as regras complexas de variação de forma de letras e a seleção de forma conduzida por FVS esperam ser tratadas por lookups GSUB definidos pelo tipo de letra (tipicamente init / medi / fina / isol + ccmp / rlig / locl); a camada de capacidades fornece aos chamadores as etiquetas de posição necessárias para consultar essas funcionalidades

 

Devanagari Indic shaping capability (v2.119.55)

O devanágari é fundamentalmente diferente do árabe / siríaco / mongol - é um script Indic abugida em que a unidade significativa é um cluster silábico (akshara), não uma única letra, e a ordem renderizada dos glifos dentro de um cluster é frequentemente diferente da ordem Unicode lógica. Dois métodos expõem a camada de capacidades Indic do devanágari:

 

function GetDevanagariCategory(CP: Cardinal): TIndicCategory;

procedure ApplyDevanagariReorder(var Run: array of Cardinal);

 

GetDevanagariCategory classifica cada codepoint em U+0900-U+097F numa de 13 categorias silábicas Indic (Base / Consonant / Vowel / Independent Vowel / Vowel Mark / Pre-base Matra / Above-base Matra / Below-base Matra / Halant Virama / Repha / Anusvara / Visarga / Other) para que os chamadores possam detetar limites de sílaba e identificar que posições dentro de cada cluster precisam de reordenação

 

ApplyDevanagariReorder é um pré-processo que percorre o run de entrada e aplica as duas regras principais de reordenação do devanágari: (1) Repha (Ra + Halant no início de um cluster silábico) é movido para a posição após a consoante base do cluster para ser renderizado como um gancho sobrescrito; (2) Pre-base I-matra (U+093F DEVANAGARI VOWEL SIGN I) é movido antes da consoante base do cluster para ser renderizado como um gancho do lado esquerdo. Outras reordenações Indic (matra acima da base, matra abaixo da base, formação de conjuntos) são deixadas para o motor GSUB do tipo de letra, porque exigem tabelas de lookup específicas do tipo de letra

 

Integração automática (v2.119.67): quando sfIndicShaping está em PDF.ShapingFeatures, ApplyDevanagariReorder é aplicado automaticamente como pré-processo dentro dos três auxiliares BuildUnicode*FieldContent. O motor GSUB do leitor consumidor depois apanha a sílaba na ordem correta e aplica as suas próprias regras de shaping contextual. Ver Automatic Shaping Pipeline

 

Typical workflow (Syriac)

 

PDF.RegisterUnicodeTTF('Estrangelo', 'SyrCOMEdessa.otf');

PDF.SetGSUBScript('syrc');  // see GSUB engine doc

for i := 0 to Length(Run) - 1 do

begin

  Pos := PDF.GetSyriacPosition(Run, i);  // init / medi / fina / isol

  // query GSUB for the position-appropriate substitute glyph

  // emit + MarkUnicodeGlyphUsed

end;

 

Typical workflow (Devanagari with automatic reorder)

 

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

PDF.ShapingFeatures := [sfIndicShaping];  // auto Repha + I-matra reorder

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

PDF.CurrentPage.UnicodeTextOut(50, 700, 0,

  UnicodeString(#$0939#$093F#$0928#$094D#$0926#$0940)); // "Hindi"

 

Unicode Subset and Extraction Helpers

RegisterToUnicodeReverseMapping regista codepoints de origem para saída de glifos moldados ou sintéticos. ClearToUnicodeReverseMappings repõe a tabela, ToUnicodeReverseMappingCount reporta o respetivo tamanho, GetUnicodeGlyphForCodepoint devolve o ID de glifo do tipo de letra registado para um codepoint Unicode e EnableShapingFeatureForSubset marca glifos substitutos de uma funcionalidade GSUB para inclusão no subconjunto incorporado

 

Scope and limitations

Integração atual do lado do produtor

O shaping siríaco, mongol, tibetano e Indic têm agora páginas de referência de API explícitas. O siríaco pode ser ativado através de AutoShapeSyriac, o mongol através de sfMongolianShaping, o tibetano através de sfTibetanShaping, a reordenação Indic através de sfIndicShaping e o shaping GSUB Indic completo através de sfIndicGSUB. Os pontos de entrada detalhados estão documentados nas páginas de shaping tibetano/mongol/siríaco e nas páginas de shaping Indic

O âmbito atual também cobre N'Ko e Adlam como scripts cursivos RTL, a ordenação SARA AM e de marcas tonais em Thai / Lao, a ordenação de niqqud hebraico e os sinais pré-base javaneses. Estes caminhos estão documentados em script shaping preprocess methods

 

 

See also: Arabic / Persian / Urdu Shaping Support, Automatic Shaping Pipeline (Phase 8), OpenType GSUB Substitution Engine, THotPDF.AssignSyntheticCodepointForGID