10 Rutinas de paleta

Todas las funciones de dibujo de Allegro usan parámetros en enteros para representar colores. En las resoluciones truecolor estos números codifican el color directamente como una colección de bits rojos, verdes y azules, pero en el modo normal de 256 colores, los valores son tratados como índices de la paleta actual, que es una tabla que contiene las intensidades de rojo, verde y azul de cada uno de los 256 colores posibles.

La paleta se almacena con estructuras RGB, que contienen intensidades de rojo, verde y azul en el formato hardware de la VGA, que van de 0 a 63, y son definidas así:

   typedef struct RGB
   {
      unsigned char r, g, b;
   } RGB;
Por ejemplo:
   RGB negro  = { 0,  0,  0  };
   RGB blanco = { 63, 63, 63 };
   RGB verde  = { 0,  63, 0  };
   RGB gris   = { 32, 32, 32 };
El tipo PALETTE es definido como un array de 256 estructuras RGB.

Puede notar que gran parte del código de Allegro escribe 'palette' como 'pallete'. Esto es porque los ficheros de cabecera de mi viejo compilador Mark Williams del Atari lo escribían con dos l's, y estoy acostumbrado a eso. Allegro aceptará sin problemas ambas escrituras, debido a algunos #defines en allegro/alcompat.h.


void vsync();
Espera a que empiece un retrazo vertical. El retrazo ocurre cuando el rayo de electrones de su monitor ha llegado a la parte inferior de la pantalla y está volviendo arriba para hacer otro barrido. Durante este corto periodo de tiempo la tarjeta de vídeo no manda datos al monitor, por lo que puede hacer cosas que de otra forma no podría, como alterar la paleta sin causar parpadeo (nieve). Sin embargo Allegro esperará automáticamente el retrazo vertical antes de alterar la paleta o hacer scroll por hardware, por lo que normalmente no debe preocuparse por esta función.

Relacionado con: set_palette, scroll_screen, timer_simulate_retrace.
void set_color(int index, const RGB *p);
Cambia la entrada de la paleta especificada al triplete RGB dado. A diferencia de otras funciones de paleta, esto no hace sincronización con el retrazo, por lo que debería llamar vsync() antes para evitar problemas de nieve.
Relacionado con: set_palette, get_color, _set_color.
void _set_color(int index, const RGB *p);
Esta es una versión inline de set_color(), que puede usar en la función callback del simulador de retrazo vertical. Sólo debería ser usada en VGA modo 13h y modo-X, porque algunos de las recientes SVGAs no son compatibles con la VGA (set_color() y set_palette() usarán llamadas VESA en estas tarjetas, pero _set_color() no sabrá nada de eso).
Relacionado con: set_color, set_gfx_mode, timer_simulate_retrace.
void set_palette(const PALETTE p);
Ajusta la paleta entera de 256 colores. Debe pasar un array de 256 estructuras RGB. A diferencia de set_color(), no hace falta llamar vsync() antes de esta función.
Relacionado con: select_palette, palette_color, set_gfx_mode, set_palette_range, set_color, get_palette.
void set_palette_range(const PALETTE p, int from, int to, int vsync);
Ajusta las entradas de la paleta desde from hasta to (inclusivos: pase 0 y 255 para ajustar la paleta entera). Si vsync está activado, espera un retrazo vertical, de otro modo cambia los colores inmediatamente.
Relacionado con: set_palette, get_palette_range.
void get_color(int index, RGB *p);
Recupera la entrada de la paleta especificada.
Relacionado con: get_palette, set_color.
void get_palette(PALETTE p);
Recupera la paleta entera de 256 colores. Debe proveer un array de 256 estructuras RGB para almacenar ahí los colores.
Relacionado con: get_palette_range, get_color, set_palette.
void get_palette_range(PALETTE p, int from, int to);
Recupera las entradas de la paleta desde from hasta to (inclusivos: pase 0 y 255 para recuperar la paleta entera).
Relacionado con: get_palette, set_palette_range.
void fade_interpolate(const PALETTE source, const PALETTE dest, PALETTE output, int pos, int from, to);
Calcula una paleta temporal en un sitio entre source y dest, devolviéndola en el parámetro output. La posición entre los dos extremos es especificada por el valor pos: 0 devuelve una copia exacta de source, 64 devuelve dest, 32 devuelve una paleta a medio camino entre las dos, etc. Esta rutina sólo afecta a los colores desde from hasta to (inclusivos: pase 0 y 255 para interpolar la paleta entera).
Relacionado con: fade_in, fade_out, fade_from.
void fade_from_range(const PALETTE source, const PALETTE dest, int speed, int from, to);
Funde gradualmente una parte de la paleta desde la paleta source hasta la paleta dest. La velocidad va de 1 (lento) a 64 (instantáneo). Esta rutina sólo afecta los colores desde from hasta to (inclusivos: pase 0 y 255 para fundir la paleta entera).
Relacionado con: fade_from.
void fade_in_range(const PALETTE p, int speed, int from, to);
Funde gradualmente una parte de la paleta desde una pantalla negra hasta la paleta especificada. La velocidad va de 1 (lento) a 64 (instantáneo). Esta rutina sólo afecta los colores desde from hasta to (inclusivos: pase 0 y 255 para fundir la paleta entera).
Relacionado con: fade_in.
void fade_out_range(int speed, int from, to);
Funde gradualmente una parte de la paleta desde la paleta actual hasta una pantalla negra. La velocidad va de 1 (lento) a 64 (instantáneo). Esta rutina sólo afecta los colores desde from hasta to (inclusivos: pase 0 y 255 para fundir la paleta entera).
Relacionado con: fade_out.
void fade_from(const PALETTE source, const PALETTE dest, int speed);
Funde gradualmente desde la paleta source hasta la paleta dest. La velocidad va de 1 (lento) a 64 (instantáneo).
Relacionado con: fade_in, fade_out, fade_interpolate, fade_from_range.
void fade_in(const PALETTE p, int speed);
Funde gradualmente desde una pantalla negra a la paleta especificada. La velocidad va de 1 (lento) a 64 (instantáneo).
Relacionado con: fade_out, fade_from, fade_interpolate, fade_in_range.
void fade_out(int speed);
Funde gradualmente la paleta actual hasta una pantalla negra. La velocidad va de 1 (lento) a 64 (instantáneo).
Relacionado con: fade_in, fade_from, fade_interpolate, fade_in_range.
void select_palette(const PALLETE p);
Rutina fea que puede usar en algunas situaciones peculiares cuando necesita convertir entre formatos de imagen con paleta a truecolor. Ajusta la tabla de la paleta interna de la misma forma que la función set_palette(), para que la conversión use la paleta especificada, pero sin afectar de ningún modo al hardware de visualización. La paleta antigua es almacenada en un buffer interno, y puede ser recuperada llamando unselect_palette().
Relacionado con: set_palette, unselect_palette.
void unselect_palette();
Recupera la tabla de la paleta que estaba en uso antes de la última llamada a select_palette().
Relacionado con: select_palette.
void generate_332_palette(PALETTE pal);
Construye una paleta truecolor falsa, usando tres bits para el rojo y el verde y dos para el azul. La función load_bitmap() devuelve esto si el fichero no contiene ninguna paleta (ej. cuando lee un bitmap truecolor).
Relacionado con: generate_optimized_palette, set_color_depth.
int generate_optimized_palette(BITMAP *bmp, PALETTE pal, const char rsvd[256]);
Genera una paleta de 256 colores óptima para hacer una versión reducida, en cuanto a color, de la imagen truecolor especificada. El parámetro rsvd apunta a una tabla que indica qué colores se le permite modificar a la función: cero para colores libres que pueden ser asignados como el optimizador quiera, valores negativos para colores reservados que no pueden usarse, y valores positivos para entradas fijas de la paleta que no deben cambiarse, pero que se pueden usar en la optimización.
Relacionado con: generate_332_palette, set_color_depth.
extern PALETTE default_palette;
La paleta por defecto de la BIOS IBM. Se seleccionará automáticamente cuando active un nuevo modo gráfico.
Relacionado con: black_palette, desktop_palette.
extern PALETTE black_palette;
Una paleta que contiene colores negros sólidos, usada por las rutinas de fundidos.
Relacionado con: desktop_palette.
extern PALETTE desktop_palette;
La paleta usada por el escritorio de baja resolución del Atari ST. No estoy seguro por qué esto sigue aquí, excepto porque los programas grabber y test la usan. Es probablemente el único código heredado del Atari que queda en Allegro, y sería una pena quitarlo :-)
Relacionado con: black_palette.

Volver al Indice