Referencia Compacta de Bytes en TTF

Referencia Compacta de Bytes en TrueType (TTF)

Una guía mínima y de referencia rápida para los desplazamientos de bytes y diseños de campos de cada tabla TTF principal. Todo es big-endian. Para estrategia de análisis y guías detalladas, consulta Analizar una Fuente.

Contenidos

  1. Encabezado de archivo
  2. Tablas

Encabezado de archivo

Tabla de desplazamientos (encabezado sfnt) — 12 bytes en byte 0:

desplazamientotipocamponotas
0u32sfntVersion0x00010000 (TrueType) o 0x4F54544F (OTTO)
4u16numTablescantidad de tablas que siguen
6u16searchRangepista de búsqueda binaria; recalcular si se modifica
8u16entrySelectorpista de búsqueda binaria
10u16rangeShiftpista de búsqueda binaria

Directorio de tablas — numTables registros de 16 bytes cada uno, comenzando en byte 12:

desplazamientotipocamponotas
0tag[4]tableTagp. ej. head, glyf (ASCII)
4u32checksumsuma de verificación de tabla
8u32offsetdesde el inicio del archivo
12u32lengthlongitud real; tabla rellenada a límite de 4 bytes

El registro i comienza en byte 12 + i×16.


Tablas

head — Encabezado de fuente (54 bytes, fijo)

Métricas de fuente global y configuración.

desplazamientotipocamponotas
0u16majorVersion1
2u16minorVersion0
4i32fontRevisionpunto fijo 16.16
8u32checksumAdjustmentsuma de archivo completo
12u32magicNumberdebe ser 0x5F0F3CF5
16u16flagscampo de bits
18u16unitsPerEmcuadrícula de diseño (p. ej. 1000, 2048)
20i64createdsegundos desde 1904-01-01 00:00 UTC
28i64modifiedmisma época
36i16xMincaja delimitadora de fuente
38i16yMin
40i16xMax
42i16yMax
44u16macStylecampo de bits
46u16lowestRecPPEMtamaño más pequeño legible en píxeles
48i16fontDirectionHint
50i16indexToLocFormat0 = loca corto, 1 = loca largo
52i16glyphDataFormat0

maxp — Perfil máximo

Requisitos de memoria. Versión 0.5 (CFF, 6 bytes):

desplazamientotipocamponotas
0u32version0x00005000
4u16numGlyphscrítico

Versión 1.0 (TrueType, 32 bytes):

desplazamientotipocamponotas
0u32version0x00010000
4u16numGlyphscantidad de glifos
6u16maxPointsmáximo en glifo simple
8u16maxContoursmáximo en glifo simple
10u16maxCompositePointsmáximo en glifo compuesto
12u16maxCompositeContoursmáximo en glifo compuesto
14u16maxZones1 o 2
16u16maxTwilightPoints
18u16maxStorage
20u16maxFunctionDefs
22u16maxInstructionDefs
24u16maxStackElements
26u16maxSizeOfInstructions
28u16maxComponentElements
30u16maxComponentDepth

hhea — Encabezado horizontal (36 bytes, fijo)

Métricas para diseño horizontal.

desplazamientotipocamponotas
0u16majorVersion1
2u16minorVersion0
4i16ascender
6i16descendergeneralmente negativo
8i16lineGap
10u16advanceWidthMax
12i16minLeftSideBearing
14i16minRightSideBearing
16i16xMaxExtent
18i16caretSlopeRise1 para vertical
20i16caretSlopeRun0 para vertical
22i16caretOffset0 para no inclinado
24i16reserved[4]cero
32i16metricDataFormat0
34u16numberOfHMetricsdimensiona tabla hmtx

hmtx — Métricas horizontales (variable)

Sin encabezado. Dos matrices consecutivas:

Parte 1: numberOfHMetrics (de hhea) entradas de:

desplazamientotipocamponotas
0u16advanceWidth
2i16lsbdistancia al lado izquierdo

Parte 2: numGlyphs − numberOfHMetrics entradas de:

desplazamientotipocamponotas
0i16lsbreutiliza último advance width

loca — Índice de ubicación (variable)

Mapea índice de glifo → desplazamiento de byte en tabla glyf. numGlyphs + 1 desplazamientos (el +1 marca el final del último glifo).

Formato corto (head.indexToLocFormat == 0): desplazamientos uint16 (multiplica por 2 para obtener desplazamiento real).

Formato largo (head.indexToLocFormat == 1): desplazamientos uint32 (usa directamente).

Si loca[i] == loca[i+1], el glifo i está vacío (p. ej. carácter de espacio).

glyf — Datos de glifos (variable)

Sin encabezado. Bloques de glifos consecutivos, ubicados por loca.

Encabezado de glifo (10 bytes):

desplazamientotipocamponotas
0i16numberOfContours≥ 0 = simple; < 0 = compuesto
2i16xMincaja delimitadora de glifo
4i16yMin
6i16xMax
8i16yMax

Glifo simple (numberOfContours ≥ 0):

desplazamientotipocamponotas
10u16[numberOfContours]endPtsOfContoursúltimo+1 = cantidad de puntos
…u16instructionLengthbytes de pistas
…u8[instructionLength]instructionsbytecode TrueType
…u8[…]flagsuna bandera lógica por punto, comprimida
…—xCoordinatescodificado en delta
…—yCoordinatescodificado en delta

Bits de bandera (cada punto):

bitnombresignificado
0x01ON_CURVE_POINTpunto en curva (si no es punto de control Bézier)
0x02X_SHORT_VECTORdelta x es 1 byte
0x04Y_SHORT_VECTORdelta y es 1 byte
0x08REPEAT_FLAGsiguiente byte = contar repeticiones para esta bandera
0x10X_IS_SAME_OR_POSITIVE(consulta especificación)
0x20Y_IS_SAME_OR_POSITIVE(consulta especificación)
0x40OVERLAP_SIMPLElos contornos pueden superponerse
0x80reserved0

Glifo compuesto (numberOfContours < 0):

Bucle de componentes. Cada uno:

desplazamientotipocamponotas
0u16flagsbanderas de componentes (abajo)
2u16glyphIndexqué glifo referenciar
4—arg1, arg2int8/uint8 o int16/uint16 por ARG_1_AND_2_ARE_WORDS
…—transform0, 1, 2, o 4 × F2Dot14 por banderas de escala

Bits de bandera de componente:

bitnombresignificado
0x0001ARG_1_AND_2_ARE_WORDSargumentos son 16-bit
0x0002ARGS_ARE_XY_VALUESargumentos son desplazamientos (si no índices)
0x0004ROUND_XY_TO_GRID
0x0008WE_HAVE_A_SCALEun F2Dot14 sigue
0x0020MORE_COMPONENTSotro componente después de este
0x0040WE_HAVE_AN_X_AND_Y_SCALEdos F2Dot14 siguen
0x0080WE_HAVE_A_TWO_BY_TWOcuatro F2Dot14 (matriz)
0x0100WE_HAVE_INSTRUCTIONSdespués del último componente: u16 length + bytes
0x0200USE_MY_METRICS
0x0400OVERLAP_COMPOUND

cmap — Mapeo de carácter a glifo (variable)

Mapea Unicode → índice de glifo. Múltiples subtablas; elige la mejor para tu caso.

Encabezado (4 bytes):

desplazamientotipocampo
0u16version
2u16numTables

Registros de codificación (numTables de 8 bytes cada uno):

desplazamientotipocamponotas
0u16platformID0=Unicode, 1=Mac, 3=Windows
2u16encodingIDdependiente de plataforma
4u32subtableOffsetdesde inicio de tabla cmap

Común: (3,1) → formato 4 (BMP); (3,10) → formato 12 (Unicode completo).

Formato 0 (codificación de bytes, 256 glifos):

desplazamientotipocampo
0u16format
2u16length
4u16language
6u8[256]glyphIdArray

Formato 4 (mapeo de segmentos, BMP):

desplazamientotipocampo
0u16format
2u16length
4u16language
6u16segCountX2
8u16searchRange
10u16entrySelector
12u16rangeShift
14+u16[segCount]endCode
…u16reserved
…u16[segCount]startCode
…i16[segCount]idDelta
…u16[segCount]idRangeOffset
…u16[…]glyphIdArray

Formato 12 (cobertura Unicode completa):

desplazamientotipocampo
0u16format
2u16reserved
4u32length
8u32language
12u32numGroups
16+—groups (numGroups entradas, 12 bytes cada una)

Cada grupo: { u32 startCharCode; u32 endCharCode; u32 startGlyphID }.

name — Nombres de fuente (variable)

Cadenas legibles por humanos (familia, estilo, versión, etc.). Se almacenan una vez en un grupo de bytes; los registros apuntan con metadatos.

Encabezado (6 bytes):

desplazamientotipocamponotas
0u16version0 o 1
2u16countcantidad de registros de nombre
4u16storageOffsetinicio del grupo de cadenas desde inicio de tabla

Registros de nombre (count de 12 bytes cada uno):

desplazamientotipocamponotas
0u16platformID0=Unicode, 3=Windows
2u16encodingIDdependiente de plataforma
4u16languageIDetiqueta de idioma/plataforma
6u16nameID1=familia, 2=subfamilia, 4=completo, 5=versión
8u16lengthlongitud de cadena en bytes
10u16stringOffsetdesde storageOffset

Luego bytes de cadena sin procesar por plataforma (típicamente UTF-16BE para Windows).

post — Datos PostScript (variable)

Ángulo itálico, bandera de espacio único, nombres PostScript (solo v2.0).

Encabezado fijo (32 bytes):

desplazamientotipocamponotas
0u32version0x00010000, 0x00020000, o 0x00030000
4i32italicAnglepunto fijo 16.16
8i16underlinePosition
10i16underlineThickness
12u32isFixedPitch0 o distinto de cero
16u32minMemType42
20u32maxMemType42
24u32minMemType1
28u32maxMemType1

Solo versión 2.0 (después del encabezado):

desplazamientotipocampo
32u16numGlyphs
34u16[numGlyphs]glyphNameIndex
…—nombres de cadena Pascal para índices ≥ 258

OS/2 — Métricas OS/2 y Windows (dependiente de versión)

Clasificación de fuente, peso, ancho, cobertura, PANOSE, banderas de incrustación.

Versión 0 (78 bytes):

desplazamientotipocamponotas
0u16version0–5
2i16xAvgCharWidth
4u16usWeightClass100–900
6u16usWidthClass1–9
8u16fsTypebanderas de incrustación
10i16ySubscriptXSize
12i16ySubscriptYSize
14i16ySubscriptXOffset
16i16ySubscriptYOffset
18i16ySuperscriptXSize
20i16ySuperscriptYSize
22i16ySuperscriptXOffset
24i16ySuperscriptYOffset
26i16yStrikeoutSize
28i16yStrikeoutPosition
30i16sFamilyClass
32u8[10]panose
42u32ulUnicodeRange1bits 0–31
46u32ulUnicodeRange2bits 32–63
50u32ulUnicodeRange3bits 64–95
54u32ulUnicodeRange4bits 96–127
58tag[4]achVendID
62u16fsSelectionbanderas de estilo
64u16usFirstCharIndex
66u16usLastCharIndex
68i16sTypoAscender
70i16sTypoDescender
72i16sTypoLineGap
74u16usWinAscent
76u16usWinDescent

Versión 1 añade (86 bytes):

desplazamientotipocampo
78u32ulCodePageRange1
82u32ulCodePageRange2

Versiones 2/3/4 añaden (96 bytes):

desplazamientotipocampo
86i16sxHeight
88i16sCapHeight
90u16usDefaultChar
92u16usBreakChar
94u16usMaxContext

Versión 5 añade (100 bytes):

desplazamientotipocampo
96u16usLowerOpticalPointSize
98u16usUpperOpticalPointSize

kern — Pares de kerning (opcional, variable)

Ajustes de espaciado entre pares de glifos. Opcional; las fuentes modernas usan GPOS.

Encabezado (4 bytes):

desplazamientotipocamponotas
0u16version0
2u16nTables

Encabezado por subtabla (6 bytes):

desplazamientotipocamponotas
0u16versionversión de subtabla
2u16lengthlongitud de subtabla en bytes
4u16coveragebyte alto = formato; byte bajo = banderas

Formato 0 (pares ordenados):

desplazamientotipocamponotas
6u16nPairs
8u16searchRangepista de búsqueda binaria
10u16entrySelectorpista de búsqueda binaria
12u16rangeShiftpista de búsqueda binaria
14+—pairsnPairs entradas, 6 bytes cada una

Cada par: { u16 left; u16 right; i16 value }.


Para estrategia de análisis y guías completas, consulta Analizar una Fuente.