Soporte de modelado siríaco / mongol / devanagari

Superficies de capacidad multiescritura (v2.119.53 - v2.119.55)

 

Arabic Shaping  Auto Shaping Pipeline  GSUB Engine

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

 

Capacidad de modelado siriaco (v2.119.53)

Dos métodos nuevos 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 codepoint 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 aislada / inicial / 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 precodificados en Unicode - no existe un equivalente siríaco de los bloques U+FB50-FDFF / U+FE70-FEFC de Arabic Presentation Forms. Por tanto, los consumidores deben conducir el modelado siríaco mediante búsquedas GSUB definidas por la fuente (por lo general init / medi / fina / isol + rlig) en lugar de reescritura de codepoints. La capa de capacidad anterior da a los llamadores las etiquetas de posición que necesitan para consultar la característica GSUB correcta para cada glifo

 

Capacidad de modelado mongol (v2.119.54)

Dos métodos paralelos para 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 selectores de variación FVS1 / FVS2 / FVS3 (U+180B-U+180D), el guion suave NIRUGU (U+180A) y las marcas vocálicas ali gali se clasifican todos como Transparent (clase T) para que participen en la unión sin interrumpir el recorrido

 

Al igual que el siríaco, el mongol no tiene Presentation Forms precodificados en Unicode. El diseño vertical tradicional del mongol, las reglas complejas de variación de la forma de las letras y la selección de formas impulsada por FVS se espera que se manejen mediante búsquedas GSUB definidas por la fuente (por lo general init / medi / fina / isol + ccmp / rlig / locl); la capa de capacidad da a los llamadores las etiquetas de posición necesarias para consultar esas características

 

Capacidad de modelado Indic devanagari (v2.119.55)

El devanagari es fundamentalmente distinto del árabe / siríaco / mongol - es una escritura abugida índica en la que la unidad significativa es un grupo silábico (akshara), no una sola letra, y el orden renderizado de los glifos dentro de un grupo 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 codepoint 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) para que los llamadores puedan detectar límites silábicos e identificar qué posiciones dentro de cada grupo necesitan reordenamiento

 

ApplyDevanagariReorder es un prepaso que recorre la secuencia de entrada y aplica las dos reglas principales de reordenamiento de devanagari: (1) Repha (Ra + Halant al comienzo de un grupo silábico) se mueve a la posición posterior a la consonante base del grupo para que se renderice como un gancho en superíndice; (2) la I-matra prebase (U+093F DEVANAGARI VOWEL SIGN I) se mueve antes de la consonante base del grupo para que se renderice como un gancho del lado izquierdo. Otros reordenamientos índicos (matra sobre la base, matra bajo la base, formación de conjunciones) se dejan al 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 prepaso dentro de los tres ayudantes BuildUnicode*FieldContent. El motor GSUB del lector consumidor luego toma la sílaba en el orden correcto y aplica sus propias reglas contextuales de modelado. Consulte Canalización automática de modelado

 

Flujo de trabajo típico (siríaco)

 

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;

 

Flujo de trabajo típico (devanagari con reordenamiento automático)

 

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"

 

Ayudantes de subconjunto y extracción Unicode

RegisterToUnicodeReverseMapping registra codepoints de origen para la salida de glifos moldeados o sintéticos. ClearToUnicodeReverseMappings restablece la tabla, ToUnicodeReverseMappingCount informa su tamaño, GetUnicodeGlyphForCodepoint devuelve el ID de glifo de la fuente registrada para un codepoint Unicode y EnableShapingFeatureForSubset marca glifos sustitutos de una característica GSUB para incluirlos en el subconjunto incrustado

 

Alcance y limitaciones

Integración actual del productor

El modelado siríaco, mongol, tibetano e Indic ahora tiene páginas explícitas de referencia de API. Siríaco se puede habilitar mediante AutoShapeSyriac, mongol mediante sfMongolianShaping, tibetano mediante sfTibetanShaping, el reordenamiento Indic mediante sfIndicShaping y el modelado Indic GSUB completo mediante sfIndicGSUB. Los puntos de entrada detallados están documentados en métodos de modelado tibetano / mongol / siríaco y métodos de modelado Indic

El alcance actual también cubre N'Ko y Adlam como escrituras cursivas RTL, Thai/Lao para SARA AM y marcas tonales, hebreo para el ordenamiento de niqqud y javanés para signos previos a la base. Estas rutas están documentadas en métodos de preprocesamiento de modelado de escritura

 

 

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