-
Notifications
You must be signed in to change notification settings - Fork 5
Formato PAL
DIV está limitado al uso de modos de vídeo VGA/SVGA de 8 bits por pixel, lo que le permite un máximo de 256 colores mostrados simultáneamente en pantalla. El estándar en estos modos es permitir definir cada color mediante sus componentes RGB permitiendo un valor de entre 0 y 63 inclusive para cada valor, lo cual nos da una posibilidad de 262.144 colores diferentes, de los cuales sólo podemos mostrar 256 en pantalla simultáneamente en todo momento.
El formato PAL está diseñado para almacenar estas paletas de 256 colores, además de lo que en DIV se llaman gamas de color: secuencias de colores (32 como máximo) que podemos seleccionar de la paleta a nuestro gusto para que DIV calcule gradientes entre ellos. Podemos definir hasta 16 gamas. Sólo tienen utilidad en el editor gráfico de DIV, no son accesibles desde los juegos hechos en DIV.
Algo muy importante a tener en cuenta es que el primer color de la paleta (el número 0) es especial. El color 0 siempre es tratado por el motor gráfico de DIV como el color transparente, es decir, el color 0 nunca se dibuja en pantalla sobre otros gráficos. Este sistema se conoce como color key. En DIV, el color transparente suele ser negro total (RGB 0,0,0) aunque se puede definir con cualesquiera otros valores RGB.
Esto no significa que no se pueda usar el negro total en los gráficos. Se puede definir cualquier otro color de la paleta aparte del 0 con los valores RGB (0,0,0) para disponer de un negro total que sea opaco.
La cabecera de un fichero PAL es muy simple:
struct pal_header {
char magic[7]; // "pal\x1A\x0D\0A\0"
byte version; // 0
};A continuación encontramos la definición de los 256 colores, simplemente un byte por componente:
struct pal_rgb {
byte r, g, b; // 0..63
};
pal_rgb colors[256];Y finalmente la definición de las 16 gamas. Como hemos dicho, esta información es irrelevante para los juegos, pero para que el IDE acepte el fichero PAL, las gamas deben estar presentes y con el formato correcto.
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
};
pal_range ranges[16];