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