|
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
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
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
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
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
Á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: Las incorporaciones recientes añaden
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 |