Skip to content

Formato MAP

Vii edited this page Mar 11, 2022 · 3 revisions

Aunque DIV acepta formatos de imagen populares, como BMP, PCX o JPG, dispone de un formato propio para gráficos llamado MAP. La ventaja de este formato es que permite incluir datos adicionales útiles para DIV y para el programador de juegos, como gamas de color y puntos de control.

El formato MAP está limitado a 256 colores (como el propio DIV) y no utiliza ningún sistema para comprimir los datos. Existen variantes del formato MAP que permiten mayor densidad de color y compresión sin pérdida, usadas en otros entornos como Fenix o BennuGD, pero actualmente DIV no los soporta.

Cabecera

struct map_header {
    char    magic[7];   // "map\x1A\x0D\x0A\0"
    byte    version;    // 0
    short   width;
    short   height;
    int     code;
    char    description[32];
};

Como vemos, la cabecera contiene, además de la habitual cadena identificadora y el número de versión, la información basica de la imagen, como la anchura (width) y altura (height).

El valor code se tiene en cuenta a la hora de agregar el gráfico a un fichero FPG. Ya que todos los gráficos en un FPG deben tener un identificador numérico asociado, al agregar a un FPG un gráfico proveniente de un MAP, el entorno de DIV introducirá por defecto el valor code almacenado en dicho MAP. Asimismo, cuando exportamos un gráfico desde un FPG, éste tendrá ya en su valor code el código que tuviese asociado en el FPG.

El campo description contiene una descripción de hasta 32 caracteres. Su funcionamiento es similar al de code: la descripción se mantendrá cuando importemos un MAP a un FPG y también cuando lo exportemos. La codificación que se usa para esta cadena es CP850.

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 map_palette {
    pal_rgb     colors[256];    // Colores de la paleta
    pal_range   ranges[16];     // Gamas de color
};

Puntos de control

Un mapa puede tener definidos entre 0 y 1000 puntos de control. El punto número 0 (el primero) es especial, ya que indica el centro virtual del gráfico (también llamado en ocasiones centro de gravedad o ancla). Si no se define, DIV asumirá como centro virtual el centro real del gráfico, es decir, las coordenadas width/2, height/2.

El resto de puntos de control son para uso libre del programador y pueden tener múltiples aplicaciones.

struct map_cpoint {
    short x, y;
};

Los puntos de control deben estar dentro de las dimensiones del mapa. Si alguno no lo está, se considera que ese punto de control no está definido. DIV suele usar coordenadas con valor -1 (0xFFFF) para indicar puntos de control no definidos.

Mapa de bits

Finalmente se encuentran los bytes que definen el gráfico, que serán un total de width*height bytes.

La estructura general queda como sigue:

struct map_file {
    map_header  header;                 // Cabecera
    map_palette palette;                // Paleta
    short       n_cpoints;              // Número de puntos de control
    map_cpoint  cpoints[n_cpoints];     // Puntos de control
    byte        pixels[width*height];   // Mapa de bits
};
Clone this wiki locally