Skip to content

Formato IFS

Vii edited this page Mar 11, 2022 · 6 revisions

IFS es el formato en que se incluyen los outlines de fuentes en DIV que luego se usan desde el generador de fuentes para crear fuentes personalizadas con color, textura, sombra, etc., que una vez generadas se almacenan en formato FNT que es el formato de fuente apto para usar en los juegos hechos en DIV.

Originalmente, los ficheros IFS se podían crear con la utilidad TurboIFS incluida con DIV, un pequeño programa para Windows que generaba un fichero IFS a partir de una fuente TrueType. Sin embargo, este programa no solía convertir correctamente los acentos y otros caracteres especiales, y nunca dispusimos del código fuente.

Al contrario de lo que suele hacerse para los outlines de fuentes escalables, el formato IFS no guarda dichos outlines en un formato vectorial sino en mapas de bits (literalmente 1 bit por pixel). IFS contiene tablas de todo el juego de caracteres para cinco tamaños distintos: 8, 10, 12, 14 y 128 pixels. Cualquier otro tamaño se obtiene escalando el tamaño superior más próximo. Por tanto no se puede obtener un tamaño superior a 128 pixels sin que se haga obvio el pixelado.

El juego de caracteres en que se almacena la fuente es Windows-1252 (Windows occidental). DIV hace internamente una conversión a CP850.

La cabecera del fichero es:

struct ifs_header {
    char    magic[4];   // "IFS\0"
    int     offset8;
    int     offset10;
    int     offset12;
    int     offset14;
    int     offset128;
};

En cada offset se almacena el offset dentro del fichero donde se almacena cada tabla. Es importante obedecer los offsets y no limitarse a leer el fichero secuencialmente, esperando que todo esté siempre en el mismo orden, ya que hay ficheros IFS incluidos en DIV que contienen huecos entre secciones.

Cada tabla es un array de 256 elementos del siguiente tipo:

struct ifs_table {
    int     offset;     // Offset del carácter
    int     size;       // Tamaño en bytes del carácter
};

Finalmente, cada uno de estos elementos hace referencia a la estructura donde se almacenan los datos del carácter:

struct ifs_glyph {
    int     alto;               // Altura del bitmap
    int     inc_y;              // Desplazamiento vertical del bitmap
    int     ancho;              // Anchura del bitmap en bytes
    int     ancho_pixels;       // Anchura del glifo en pixels
    byte    bitmap[alto*ancho]; // Mapa de bits
};

Como aclaración se muestra a continuación un ejemplo de lo que representan estos valores.

IMPORTANTE: Obsérvese que el bit menos significativo de cada byte se sitúa gráficamente a la izquierda.

Clone this wiki locally