|
La canalización automática de modelado eleva el motor OpenType GSUB de una superficie de consulta solo de capacidades a una función del lado productor que se aplica automáticamente a medida que el texto se emite en los flujos de contenido PDF. Quien llama habilita funciones 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 mapeo inverso de la CMap ToUnicode necesarias para accesibilidad
Marco optativo (v2.119.59 / Fase 8a)
Un nuevo enum y una propiedad controlan qué sustituciones automáticas se ejecutan durante la emisión de texto:
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 idéntica a nivel de bytes para los llamadores que dependen del modelador estático de pospaso v2.119.32-58. Al establecer una o más banderas, el motor pasa al modo automático para las funciones correspondientes
sfArabicGSUB - Fase 8c.2 (v2.119.63)
Cuando se activa sfArabicGSUB, las sustituciones rlig (ligaduras obligatorias) definidas por la fuente se aplican automáticamente a los tramos de texto árabe. ApplyArabicGSUBRefinement recorre la cmap para construir un arreglo GID, llama a ApplyLigatureSubstitution con la etiqueta de función rlig, vuelve a mapear los GID sustitutos a través de la cmap inversa (que cubre las Arabic Presentation Forms FB50-FDFF + FE70-FEFF) hasta un código Unicode y llama a MarkUnicodeGlyphUsed para que el glifo sustituto se conserve en el subconjunto de fuente incrustado. Esto cubre ligaduras específicas de la fuente más allá de las cuatro familias árabes codificadas de forma rígida (LAM-ALEF v2.119.32, YEH-HAMZA v2.119.58, Allah v2.119.60, Bismillah v2.119.62)
Al activar sfArabicGSUB se omite implícitamente el modelador estático de 4 posiciones para árabe v2.85.0 - quienes necesiten que el modelador estático siga manejando códigos fuera de lo que declara la GSUB de la fuente deben dejar sfArabicGSUB desactivado
sfStandardLigatures / sfContextualLigatures - Fase 8b (v2.119.65)
Cuando se activa sfStandardLigatures, las ligaduras estándar latinas se pliegan automáticamente usando la función 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, FB06 st. sfContextualLigatures agrega una segunda pasada para la función clig de la fuente. Ambas pasadas usan el mismo mecanismo de cmap inversa que sfArabicGSUB y emiten 7 nuevas entradas de mapeo inverso de la CMap ToUnicode (FB00-FB06) para que el copiar / pegar del lector convierta la ligadura de vuelta a las letras de origen
sfContextualAlternates - GSUB 'rclt' (v2.119.66)
Cuando se activa sfContextualAlternates, se aplica la función rclt (Required Contextual Alternates) de la fuente. ApplyArabicGSUBContextualRefinement usa el punto de entrada ApplyContextualSubst de v2.119.47 y maneja salida variable de N a M (la sustitución solo se confirma cuando cada GID de reemplazo es alcanzable a través de la cmap inversa). El rango de la cmap inversa se amplía a FB00-FDFF + FE70-FEFF para cubrir las Presentation Forms latinas + árabes + hebreas
Usuarios canónicos de rclt: formas árabes init / medi / fina / isol cuando la fuente conduce el modelado posicional a través de GSUB en lugar de mediante códigos Unicode Presentation Forms; ciertas reglas de desambiguación de secuencias latinas; funciones Indic de modelado pres / blws / psts / half / pstf / cjct cuando el diseñador de la fuente las registra como rclt
sfIndicShaping - Fase 8e (v2.119.67)
Cuando se activa sfIndicShaping, la capacidad Devanagari ApplyDevanagariReorder de v2.119.55 pasa de ser un método manual a una prepasada automática aplicada dentro de los tres ayudantes BuildUnicode*FieldContent. Los tramos Devanagari trasladan Repha (Ra + Halant al inicio del clúster) 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 tome la sílaba en el orden correcto de renderizado. Otros reordenamientos Indic (matra por encima o por debajo de la base, formación de conjunciones) permanecen en la GSUB de la fuente
Soporte de consulta de avance (v2.119.64 / Fase 8c.5)
Una API complementaria expone la fracción de em almacenada en caché de /W 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 las Arabic Presentation Forms (U+FB50-FDFF + U+FE70-FEFF) como NARROW en lugar de WIDE (el reemplazo heurístico era incorrecto 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
Cierre de la hoja de ruta de la fase 8
Fase 8a (v2.119.59) marco opcional + capacidad árabe; Fase 8b (v2.119.65) ligaduras estándar latinas; Fase 8c.1 (v2.119.60) Allah; Fase 8c.2 (v2.119.63) GSUB rlig a nivel de GID; Fase 8c.3 (v2.119.61) mapeo inverso ToUnicode; Fase 8c.4 (v2.119.62) Bismillah; Fase 8c.5 (v2.119.64) consulta de avance + corrección heurística; Fase 8c.6 (v2.119.68) emisión de código de punto sintético PUA; Fase 8d se incorporó en las subfases 8c; Fase 8e (v2.119.67) reordenamiento automático Devanagari. Con v2.119.68 la matriz de capacidades de la Fase 8 queda cerrada; las mejoras posteriores (scripts Indic adicionales, posicionamiento OpenType GPOS, resolución BiDi) se rastrean en elementos separados de la hoja de ruta
Alcance y limitaciones
La canalización opcional es intencionalmente aditiva sobre el modelador estático de pospaso - los llamadores existentes no ven ningún cambio de comportamiento salvo que activen la opción. El conjunto [] predeterminado es la elección segura para regresiones estables a nivel de bytes. Las fuentes sin las tablas de funciones GSUB solicitadas producen una salida segura sin efecto (los llamadores no ven ninguna sustitución aplicada ni excepciones)
Mapa actual de API de modelado
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 modelado Tibetan GSUB, sfMongolianShaping aplica formas posicionales mongolas y sfIndicGSUB aplica la cadena de funciones Indic GSUB después de reordenar sílabas. Consulta ShapingFeatures, GPOS methods y Indic shaping methods
Las incorporaciones recientes agregan sfLocalizedForms para locl, calt mediante ApplyGSUBContextualFeature, kerning GPOS contextual y vertical, y rutas N'Ko, Adlam, Thai/Lao, Hebrew y Javanese. Consulta script shaping preprocess methods
Ver 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
|