Soporte de modelado siríaco / mongol / devanagari

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

 

Arabic Shaping  Auto Shaping Pipeline  GSUB Engine

HotPDF expone superficies de capacidad de clase de unión / análisis posicional / categoría silábica índica para tres escrituras complejas además del árabe: siríaco (U+0700-U+074F), mongol (U+1800-U+18AF) y devanagari (U+0900-U+097F). Cada capacidad permite que los llamadores pasen la escritura por el motor OpenType GSUB existente para obtener shaping correcto, manteniendo fuera del alcance de HotPDF el trabajo pesado (detección de límites de clúster, resolución BiDi, posicionamiento GPOS)

 

Capacidad de shaping siríaco (v2.119.53)

Dos métodos exponen el comportamiento de unión del siríaco:

 

function GetSyriacJoiningClass(CP: Cardinal): TJoiningClass;

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

 

El siríaco sigue el mismo marco de cuatro clases Right-Joining / Dual-Joining / Transparent / Non-Joining que el árabe; GetSyriacJoiningClass clasifica cada punto de código del bloque U+0700-U+074F según la propiedad de unión Unicode. GetSyriacPosition recorre una secuencia siríaca y resuelve cada carácter a su posición isolated / initial / medial / final según las clases de unión de sus vecinos inmediatos

 

A diferencia del árabe, el bloque siríaco no tiene Presentation Forms pre-codificadas en Unicode: no existe un equivalente siríaco de los bloques Arabic Presentation Forms U+FB50-FDFF / U+FE70-FEFC. Por tanto, los consumidores deben realizar el shaping siríaco mediante búsquedas GSUB definidas por la fuente (normalmente init / medi / fina / isol + rlig) en vez de reescribir puntos de código. La capa de capacidad anterior proporciona a los llamadores las etiquetas de posición que necesitan para consultar la feature GSUB correcta para cada glifo

 

Capacidad de shaping mongol (v2.119.54)

Dos métodos paralelos para el mongol:

 

function GetMongolianJoiningClass(CP: Cardinal): TJoiningClass;

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

 

La cobertura incluye mongol básico (U+1820-U+1842), Todo (U+1843-U+1877), Sibe (U+1880-U+18A8), manchú y extensiones Ali Gali. Los Variation Selectors FVS1 / FVS2 / FVS3 (U+180B-U+180D), el guion blando NIRUGU (U+180A) y las marcas vocálicas Ali Gali se clasifican como Transparent (clase T), por lo que participan en la unión sin interrumpir el recorrido

 

Al igual que el siríaco, el mongol no tiene Presentation Forms pre-codificadas en Unicode. La disposición vertical tradicional del mongol, sus reglas complejas de variación de formas de letras y la selección de formas basada en FVS deben resolverse mediante búsquedas GSUB definidas por la fuente (normalmente init / medi / fina / isol + ccmp / rlig / locl); la capa de capacidad proporciona a los llamadores las etiquetas de posición necesarias para consultar esas features

 

Capacidad de shaping índico devanagari (v2.119.55)

Devanagari es fundamentalmente distinto de árabe / siríaco / mongol: es una escritura abugida índica en la que la unidad significativa es un clúster silábico (akshara), no una sola letra, y el orden renderizado de los glifos dentro de un clúster suele diferir del orden lógico Unicode. Dos métodos exponen la capa de capacidad índica de Devanagari:

 

function GetDevanagariCategory(CP: Cardinal): TIndicCategory;

procedure ApplyDevanagariReorder(var Run: array of Cardinal);

 

GetDevanagariCategory clasifica cada punto de código de U+0900-U+097F en una de 13 categorías silábicas índicas (Base / Consonant / Vowel / Independent Vowel / Vowel Mark / Pre-base Matra / Above-base Matra / Below-base Matra / Halant Virama / Repha / Anusvara / Visarga / Other), de modo que los llamadores puedan detectar límites de sílaba e identificar qué posiciones dentro de cada clúster necesitan reordenación

 

ApplyDevanagariReorder es una pre-pasada que recorre la secuencia de entrada y aplica las dos reglas principales de reordenación devanagari: (1) Repha (Ra + Halant al inicio de un clúster silábico) se mueve a la posición posterior a la consonante base del clúster para renderizarse como gancho superíndice; (2) la I-matra pre-base (U+093F DEVANAGARI VOWEL SIGN I) se mueve antes de la consonante base del clúster para renderizarse como gancho lateral izquierdo. Otras reordenaciones índicas (matra sobre la base, matra bajo la base, formación de conjuncts) quedan a cargo del motor GSUB de la fuente porque requieren tablas de búsqueda específicas de la fuente

 

Integración automática (v2.119.67): cuando sfIndicShaping in PDF.ShapingFeatures, ApplyDevanagariReorder se aplica automáticamente como pre-pasada dentro de los tres helpers BuildUnicode*FieldContent. El motor GSUB del lector consumidor toma entonces la sílaba en el orden correcto y aplica sus propias reglas de shaping contextual. Consulte Automatic Shaping Pipeline

 

Flujo de trabajo típico (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

  // consultar GSUB para el glifo sustituto adecuado a la posición

  // emitir + MarkUnicodeGlyphUsed

end;

 

Flujo de trabajo típico (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 registra puntos de código de origen para la salida de glifos con shaping o sintéticos. ClearToUnicodeReverseMappings reinicia la tabla, ToUnicodeReverseMappingCount informa su tamaño, GetUnicodeGlyphForCodepoint devuelve el ID de glifo de fuente registrado para un punto de código Unicode y EnableShapingFeatureForSubset marca glifos sustitutos de una feature GSUB para incluirlos en el subconjunto incrustado

 

Ámbito y limitaciones

Integración actual del productor

La conformación Syriac, Mongolian, Tibetan e Indic tiene ahora páginas de referencia API explícitas. Syriac puede activarse mediante AutoShapeSyriac, Mongolian mediante sfMongolianShaping, Tibetan mediante sfTibetanShaping, la reordenación Indic mediante sfIndicShaping y la conformación Indic GSUB completa mediante sfIndicGSUB. Los puntos de entrada detallados están documentados en Tibetan/Mongolian/Syriac shaping methods y Indic shaping methods

El alcance actual cubre también N'Ko y Adlam como escrituras cursivas RTL, Thai/Lao para SARA AM y marcas tonales, Hebrew para ordenación de niqqud y Javanese para signos previos a la base. Estas rutas están documentadas en script shaping preprocess methods

 

 

Véase también: Soporte de modelado árabe / persa / urdu, Canalización automática de modelado (fase 8), Motor de sustitución OpenType GSUB, THotPDF.AssignSyntheticCodepointForGID