Skip to content

Formato FNT

Vii edited this page Mar 11, 2022 · 3 revisions

El formato FNT es el formato de fuente de letra que tiene dos funciones en DIV:

  • Se pueden cargar desde los juegos hechos en DIV y usarse para mostrar textos en pantalla.
  • Se pueden usar desde el editor gráfico de DIV para incorporar texto en los gráficos.

Se pueden generar con el generador de fuentes incluido en el entorno de DIV, que a su vez se basa en el formato IFS para obtener las siluetas de los caracteres con el tipo de letra y tamaño deseados.

Alternativamente, se pueden crear importando un mapa que contenga los 256 caracteres separados entre sí y de los bordes de la imagen por un margen de 1 pixel, que debe rellenarse con un color distinto al 0 (transparente). Los caracteres que deseen omitirse deben aparecer en el mapa también, pero consistiendo en únicamente un pixel transparente. Esto le indicará al importador que ese carácter no debe incluirse en la fuente.

Al igual que los demás formatos gráficos de DIV, el FNT está limitado a 256 colores, incluye su propia paleta y no utiliza ningún sistema de compresión.

Cabecera

struct fnt_header {
    char    magic[7];   // "fnt\x1A\x0D\x0A\0"
    byte    version;    // 0
};

La cabecera tan sólo incluye la cadena de identificación del formato y el número de versión, que debe aumentarse si se incluyen cambios que rompan la compatibilidad con versiones anteriores del formato FNT.

Paleta

Los datos de la paleta de color tienen exactamente la misma estructura que la descrita en los ficheros PAL. Diríjase al artículo del formato PAL para más detalles.

struct pal_rgb {
    byte    r, g, b;    // 0..63
};

enum range_type {
    DIRECT  = 0,    // Directa de paleta
    EDIT1   = 1,    // Editable cada color
    EDIT2   = 2,    // Editable cada 2 colores
    EDIT4   = 4,    // Editable cada 4 colores
    EDIT8   = 8     // Editable cada 8 colores
};

struct pal_range {
    byte        n_colors;   // 8, 16 o 32
    range_type  type;
    byte        fixed;      // 0=editable, 1=fija
    byte        black;      // color negro?? (suele ser 0)
    byte        colors[32]; // colores de la gama
};

struct fnt_palette {
    pal_rgb     colors[256];    // Colores de la paleta
    pal_range   ranges[16];     // Gamas de color
};

Juego de caracteres

enum charset_flags {
    NUMBERS   = 1,    // Números
    UPPERCASE = 2,    // Letras mayúsculas
    LOWERCASE = 4,    // Letras minúsculas
    SYMBOLS   = 8,    // Símbolos
    EXTENDED  = 16    // Caracteres extendidos
};

int charset_flags;

Se asume que la codificación de caracteres en los FNT siempre es CP850. Con charset_flags podemos indicar si queremos incluir o excluir determinados subconjuntos de caracteres del FNT. Se trata de un campo de bit flags, así que debemos hacer un OR binario con los flags correspondientes a los subconjuntos que queremos incluir.

A continuación se detalla qué rangos de caracteres se incluyen activando cada flag.

Flag Valor Descripción Rango(s) de caracteres
NUMBERS 1 Números '0'..'9'
UPPERCASE 2 Letras mayúsculas 'A'..'Z' (no incluye acentos ni Ñ)
LOWERCASE 4 Letras minúsculas 'a'..'z' (no incluye acentos ni ñ)
SYMBOLS 8 Símbolos y signos de puntuación Todo el rango ASCII comprendido entre 32 y 127 que no esté ya incluido en los subconjuntos anteriores
EXTENDED 16 Caracteres extendidos Todo lo no incluido en los subconjuntos anteriores: caracteres de control (0..31) y caracteres extendidos (128..255)

Debe recordarse que si se genera el FNT a partir de un IFS, no se incluirá ningún carácter que no se encontrara ya en el IFS. Los IFS incluidos en DIV Games Studio no incluyen el espacio (ASCII 32) por lo que éste se trata como un carácter excluido más y se representa como un espacio en blanco cuya anchura se calcula automáticamente, como se describe a continuación.

Los caracteres excluidos se representarán en pantalla como un espacio en blanco cuya anchura será equivalente a la mitad de la anchura promedio de todos los caracteres incluidos.

Tabla de caracteres

A continuación se encuentra la tabla que contiene las características de cada carácter. Siempre tiene 256 entradas, independientemente del juego de caracteres seleccionado en charset_flags. Se asume que los caracteres con anchura 0 están excluidos de la fuente.

struct fnt_char {
    int anchura;
    int altura;
    int inc_y;
    int offset;
};

fnt_char fnt_table[256];

anchura y altura definen el tamaño del mapa de bits almacenado en el FNT. inc_y es el número de pixels por el que se desplaza verticalmente el glifo antes de dibujarlo.

El campo offset indica la posición dentro del fichero donde se encuentra el mapa de bits correspondiente al carácter. De forma que DIV acude directamente a la posición offset y espera encontrar allí un gráfico de anchura por altura pixels (o anchura * altura bytes).

Clone this wiki locally