Canalización automática de modelado (fase 8)

Opt-in producer-side GSUB pipeline (v2.119.59 - v2.120.10)

 

Arabic Shaping  Multi-Script Shaping  GSUB Engine

La canalización automática de conformación eleva el motor OpenType GSUB de una superficie de consulta de capacidades a una característica del lado productor que se aplica automáticamente cuando el texto se emite en flujos de contenido PDF. Los llamadores habilitan características GSUB específicas mediante un conjunto tipado (ShapingFeatures: THPDFShapingFeatures) y HotPDF se encarga de ejecutar las sustituciones correctas, marcar los glifos sustitutos en el subconjunto de fuente incrustado y emitir las entradas de reasignación inversa del ToUnicode CMap necesarias para la accesibilidad

 

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

 

El valor predeterminado es [] (conjunto vacío), lo que conserva una salida byte a byte idéntica para los llamadores que dependen del conformador estático posterior de v2.119.32-58. Establecer una o más marcas eleva el motor al modo automático para las características correspondientes

 

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

Cuando sfArabicGSUB está establecido, las sustituciones rlig (Required Ligatures) definidas por la fuente se aplican automáticamente a los tramos de texto árabe. ApplyArabicGSUBRefinement recorre el cmap para crear un arreglo de GID, llama a ApplyLigatureSubstitution con la etiqueta de característica rlig, reasigna los GID sustitutos mediante el cmap inverso (cubriendo FB50-FDFF + FE70-FEFF Arabic Presentation Forms) a un punto de código Unicode y llama a MarkUnicodeGlyphUsed para conservar el glifo sustituto en el subconjunto de fuente incrustado. Esto cubre ligaduras específicas de fuente más allá de las cuatro familias de ligaduras árabes codificadas de forma fija (LAM-ALEF v2.119.32, YEH-HAMZA v2.119.58, Allah v2.119.60, Bismillah v2.119.62)

 

Establecer sfArabicGSUB omite implícitamente el conformador estático de 4 posiciones para árabe de v2.85.0; los llamadores que necesiten que el conformador estático siga manejando puntos de código fuera de lo que declara el GSUB de la fuente deben dejar sfArabicGSUB desactivado

 

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

Cuando sfStandardLigatures está establecido, las Latin Standard Ligatures se combinan automáticamente usando la característica liga de la fuente. ApplyLatinLigatureRefinement apunta al bloque Alphabetic Presentation Forms (U+FB00-FB4F), normalmente FB00 ff, FB01 fi, FB02 fl, FB03 ffi, FB04 ffl, FB05 long-s + t y FB06 st. sfContextualLigatures agrega una segunda pasada para la característica clig de la fuente. Ambas pasadas usan el mismo mecanismo de cmap inverso que sfArabicGSUB y emiten 7 nuevas entradas de reasignación inversa ToUnicode CMap (FB00-FB06), de modo que copiar / pegar en el lector consumidor resuelve la ligadura de vuelta a las letras de origen

 

sfContextualAlternates - GSUB 'rclt' (v2.119.66)

Cuando sfContextualAlternates está establecido, se aplica la característica rclt (Required Contextual Alternates) de la fuente. ApplyArabicGSUBContextualRefinement usa el punto de entrada ApplyContextualSubst de v2.119.47 y maneja salida N-a-M de longitud variable; la sustitución solo se confirma cuando cada GID de reemplazo es alcanzable mediante el cmap inverso. El rango del cmap inverso se extiende a FB00-FDFF + FE70-FEFF para cubrir 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)

Cuando sfIndicShaping está establecido, la capacidad Devanagari ApplyDevanagariReorder de v2.119.55 se promociona de método manual a prepasada automática aplicada dentro de los tres helpers BuildUnicode*FieldContent. En los tramos Devanagari, Repha (Ra + Halant al inicio del clúster) se mueve a la posición posterior a la base, y la I-matra prebase (U+093F) se mueve antes de la consonante base del clúster, de modo que el motor GSUB del lector consumidor toma la sílaba en el orden de renderizado correcto. Otros reordenamientos Indic (matra superior / inferior, formación de conjuntos consonánticos) permanecen en el GSUB de la fuente

 

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

Una API complementaria expone la fracción em de /W en caché para que los llamadores puedan calcular correctamente el ajuste de línea al emitir glifos sustituidos por GSUB:

 

function GetCodepointAdvance(CP: Cardinal): Single;

 

Devuelve el ancho de avance derivado de hmtx como fracción de em para el glifo resuelto por cmap en CP. La misma versión también corrigió CodeUnitAdvance para clasificar Arabic Presentation Forms (U+FB50-FDFF + U+FE70-FEFF) como NARROW en lugar de WIDE; la alternativa heurística era incorrecta antes de v2.65

 

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

 

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

 

Ámbito y limitaciones

La canalización opcional es intencionalmente aditiva sobre el conformador estático posterior; los llamadores existentes no ven cambios de comportamiento salvo que la activen. El conjunto predeterminado [] es la opción segura para regresión byte-estable. Las fuentes sin las tablas de características GSUB solicitadas producen una salida segura sin efecto; los llamadores no ven sustitución aplicada ni excepciones

 

Mapa actual de API de conformación

La canalización actual ya no es solo de sustitución: sfKerning aplica kerning de pares GPOS, sfMarkPositioning aplica desplazamientos Mark-to-Base y Mark-to-Mark, sfTibetanShaping aplica conformación Tibetan GSUB, sfMongolianShaping aplica formas posicionales mongolas y sfIndicGSUB aplica la cadena de funciones Indic GSUB después de reordenar las sílabas. Consulte ShapingFeatures, GPOS methods y Indic shaping methods

Las incorporaciones recientes añaden sfLocalizedForms para locl, calt mediante ApplyGSUBContextualFeature, kerning GPOS contextual y vertical, y rutas N'Ko, Adlam, Thai/Lao, Hebrew y Javanese. Consulte script shaping preprocess methods

 

Véase también: Motor de sustitución OpenType GSUB, Soporte de modelado árabe / persa / urdu, Modelado siríaco / mongol / devanagari, THotPDF.AssignSyntheticCodepointForGID, Subconjunto de fuentes CFF / OpenType