|
Motor de sustitución OpenType GSUB Superficie de capacidades de sustitución de glifos (v2.119.43 - v2.119.50)
|
Modelado árabe CFF / Subconjunto OpenType |
|
El motor OpenType GSUB (Glyph SUBstitution) dentro de HotPDF permite consultar, controlar e incrustar todo tipo de sustitución de glifos que declare una fuente OpenType: ligaduras, alternas estilísticas, variantes contextuales, formas de modelado árabe / Indic, formas alternativas CJK y más. Todos los LookupType de OpenType GSUB del 1 al 8 están implementados y expuestos como una superficie de consulta solo de capacidades; quien llama controla la emisión de texto y decide qué glifo sustituto escribir en el flujo de contenido de la página
API pública type TGSUBStringArray = array of AnsiString;
// LookupType 1 - Single Substitution (one glyph -> one glyph) function GetSingleSubstituteGlyph(InputGID: Word; const FeatureTag: AnsiString): Word;
// LookupType 2 - Multiple Substitution (one glyph -> sequence of glyphs) function GetMultipleSubstituteGlyphs(InputGID: Word; const FeatureTag: AnsiString; var OutGIDs: array of Word): Boolean;
// LookupType 3 - Alternate Substitution (one glyph -> one of N alternates) function GetAlternateGlyphCount(InputGID: Word; const FeatureTag: AnsiString): Integer; function GetAlternateGlyph(InputGID: Word; const FeatureTag: AnsiString; AlternateIndex: Integer): Word;
// LookupType 4 - Ligature Substitution (N glyphs -> one ligature) function ApplyLigatureSubstitution(const InputGIDs: array of Word; StartIndex: Integer; const FeatureTag: AnsiString; out OutGID: Word; out ConsumedCount: Integer): Boolean;
// LookupType 5 + 6 - Contextual / Chained Contextual Substitution function ApplyContextualSubst(const InputGIDs: array of Word; StartIndex: Integer; const FeatureTag: AnsiString; var OutGIDs: array of Word; out ConsumedLen: Integer): Boolean;
// LookupType 8 - Reverse Chained Contextual Single Substitution function ApplyReverseChainedContextualSubst(const InputGIDs: array of Word; StartIndex: Integer; const FeatureTag: AnsiString; out OutGID: Word): Boolean;
// Script / LangSys selection (Phase 7) procedure SetGSUBScript(const ScriptTag: AnsiString); procedure SetGSUBLanguage(const LangTag: AnsiString); function GetGSUBScripts: TGSUBStringArray; function GetGSUBLanguages(const ScriptTag: AnsiString): TGSUBStringArray; function GetGSUBFeatures(const ScriptTag, LangTag: AnsiString): TGSUBStringArray;
// TTF subsetter closure (Phase 9) procedure MarkUnicodeGlyphUsed(GID: Word);
Descripción El motor se activa después de que
Contrato defensivo en toda la superficie: las fuentes sin tabla GSUB, las etiquetas de función que no tienen 4 bytes, las funciones que el script / idioma seleccionado no anuncia, los GID que ninguna subtabela cubre y los glifos de entrada ignorados por LookupFlag devuelven siempre una operación segura sin efecto (False / OutGID = InputGID / OutGIDs vacíos / ConsumedCount = 1) para que los llamadores nunca vean excepciones en los casos rutinarios de "no se aplica ninguna sustitución"
Matriz de LookupType LookupType 1 (Sustitución simple) - un glifo se asigna a un sustituto. Funciones canónicas: LookupType 2 (Sustitución múltiple) - un glifo se divide en una secuencia de glifos sustitutos. Uso canónico: LookupType 3 (Sustitución alternativa) - un glifo se asigna a una de N alternativas. Funciones canónicas: LookupType 4 (Sustitución de ligaduras) - N glifos de entrada se combinan en una sola ligadura. Funciones canónicas: LookupType 5 (Sustitución contextual) + LookupType 6 (Sustitución contextual encadenada) - coincide con una secuencia de glifos de entrada y despacha búsquedas anidadas en posiciones específicas dentro de la coincidencia. Las tres variantes de formato (1 secuencia literal, 2 secuencia ClassDef, 3 secuencia Coverage) están implementadas; el despachador LookupType 7 (Sustitución de extensión) - capa pura de indirección que la especificación OpenType define para fuentes cuya subtabla de sustitución queda más allá del alcance de 16 bits de la LookupType 8 (Sustitución simple contextual encadenada inversa) - sustitución 1:1 consciente del contexto cuya característica distintiva es que los llamadores deben aplicarla en orden de exploración inverso sobre una ejecución de varios glifos (fin -> inicio) porque cada sustituto puede depender del contexto futuro de vistazo que todavía no debe haberse sustituido. Uso canónico: alternativas contextuales árabes / siríacas / n'ko / índicas cuya forma final depende del glifo siguiente. Usa
Selección de Script / LangSys De forma predeterminada, el motor prefiere el script
Semántica estricta frente a respaldo: un
Respeto de LookupFlag y GDEF Cada consulta lee el LookupFlag de cada tabla Lookup (y el markFilteringSet uint16 opcional al final cuando
Cierre del subconfigurador TTF (MarkUnicodeGlyphUsed) El subconjunto TTF v2.84.0 de HotPDF deriva su conjunto de glifos usados a partir de
Después de emitir cualquier GID devuelto por
Flujo de trabajo típico (versalitas latinas)
PDF.RegisterUnicodeTTF('myFont', 'C:\\Windows\\Fonts\\arial.ttf'); PDF.SetGSUBScript('latn'); PDF.SetGSUBLanguage(''); // default LangSys SmallCapGID := PDF.GetSingleSubstituteGlyph(InputGID, 'smcp'); if SmallCapGID <> InputGID then begin // emit SmallCapGID into the page content stream... PDF.MarkUnicodeGlyphUsed(SmallCapGID); // pull into subset end;
Flujo de trabajo típico (ligadura árabe LAM-ALEF)
PDF.SetGSUBScript('arab'); Run := [LamGID, FathaGID, AlefGID]; // post-cmap GIDs if PDF.ApplyLigatureSubstitution(Run, 0, 'rlig', LigGID, ConsumedCount) then begin // emit LigGID + advance by ConsumedCount PDF.MarkUnicodeGlyphUsed(LigGID); end;
Alcance y limitaciones El motor es una superficie de consulta de solo capacidades: responde "qué haría GSUB aquí", pero no ejecuta una canalización automática de modelado (disposición de clase Harfbuzz, reordenamiento consciente de clústeres para Indic, resolución BiDi, posicionamiento GPOS, adjunción de marcas). Los llamadores son responsables de conducir el bucle de exploración, elegir qué sustituto o alternativa emitir, llamar a
El modelado árabe / persa / urdu del lado productor (ligadura obligatoria LAM-ALEF + Arabic Presentation Forms-A) está implementado como una canalización integrada separada que se ejecuta automáticamente durante la emisión de texto - vea Modelado árabe / persa / urdu
Trazado de versiones v2.119.43 Sustitución simple + fase 1. v2.119.44 Sustitución múltiple + alternativa (fase 2). v2.119.45 Ligadura (fase 3). v2.119.46 Extensión + GDEF + respeto de LookupFlag (fase 4). v2.119.47 Sustitución contextual + contextual encadenada + despachador SequenceLookupRecord (fase 5). v2.119.48 Sustitución contextual encadenada inversa - matriz LookupType 1-8 cerrada (fase 6). v2.119.49 API de selección Script / LangSys (fase 7). v2.119.50 Cierre del subconjunto TTF mediante
Ver también: Modelado árabe / persa / urdu, Funciones de subconjunto de fuentes CFF / OpenType, THotPDF.EnableFontSubsetting |