-
Notifications
You must be signed in to change notification settings - Fork 4
Formato IFS
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.