18 Transparencias y dibujo con patrón


void drawing_mode(int mode, BITMAP *pattern, int x_anchor, int y_anchor);
Ajusta el modo de dibujo gráfico. Esto sólo afecta a las rutinas geométricas como putpixel, lines, rectangles, circles, polygons, floodfill, etc, y no a la salida de texto, blits o dibujado de sprites. El modo debería ser uno de los siguientes valores.

      DRAW_MODE_SOLID               - por defecto, dibujado sólido
      DRAW_MODE_XOR                 - dibujado or-exclusivo
      DRAW_MODE_COPY_PATTERN        - rellenado con patrón multicolor
      DRAW_MODE_SOLID_PATTERN       - rellenado con patrón de un solo color
      DRAW_MODE_MASKED_PATTERN      - rellenado con patrón enmascarado
      DRAW_MODE_TRANS               - fundido de color translúcido
En DRAW_MODE_XOR, los pixels son escritos en el bitmap con una operación or-exclusiva en vez de con la copia simple, por lo que dibujar la misma figura dos veces la borrará. Como esto requiere tanto leer como escribir en el bitmap de memoria, el dibujado xor es mucho más lento que el modo normal.

Con los modos con patrón, usted indica un bitmap de patrón que será dibujado sobre la superficie de la figura. Allegro almacena un puntero a este bitmap en vez de una copia, por lo que no debe destruir el bitmap mientras sea usado como patrón. El ancho y alto del patrón debe ser un múltiplo de dos, pero pueden ser diferentes, es decir, un patrón de 64x16 está bien, pero uno de 17x3 no. El patrón será repetido en una rejilla comenzando en el punto (x_anchor, y_anchor). Normalmente debería pasar cero para estos valores, lo que le dejará dibujar varias figuras y que sus patrones se junten en los bordes. Un alineamiento de cero puede sin embargo ser peculiar cuando mueva una figura con patrón por la pantalla, porque la figura se moverá, pero el patrón no, por lo que en algunas situaciones quizás le interese alterar las posiciones del ancla (anchor).

Cuando selecciona DRAW_MODE_COPY_PATTERN, los pixels simplemente son copiados del bitmap de patrón al bitmap destino. Esto le permite usar patrones multicolor, y significa que el color que pase a la rutina de dibujado es ignorado. Este es el más rápido de los modos con patrón.

En DRAW_MODE_SOLID_PATTERN, cada pixel del patrón es comparado con el color de máscara (cero en modos de 256 colores, rosa fucsia en modos truecolor). Si el pixel del patrón es sólido, un pixel del color que pasó a la rutina de dibujado es escrito en el bitmap destino, de otro modo escribe un cero. El patrón es por esto tratado como una máscara monocroma, que le permite usar el mismo patrón para dibujar diferentes figuras con colores diferentes, pero previene el uso de patrones multicolores.

DRAW_MODE_MASKED_PATTERN es casi lo mismo que DRAW_MODE_SOLID_PATTERN, pero los pixels enmascarados son ignorados en vez de copiados como cero, por lo que el fondo se verá a través de los agujeros.

En DRAW_MODE_TRANS, la tabla global color_map o las funciones de fundido se usan para sobreimprimir pixels encima de la imágen existente. Esta sólo debe usarse después de haber constuído la tabla de mapeo de color (para modos de 256 colores) o las funciones de fundido (para modos truecolor). Dado que debe leer y escribir en la memoria del bitmap, el dibujado transparente es muy lento si dibuja directamente en la memora de vídeo, así que siempre que sea posible debería dibujar en bitmaps de memoría.

Relacionado con: xor_mode, solid_mode, color_map, set_trans_blender.
void xor_mode(int on);
Esto es un atajo para activar o desactivar el modo de dibujado xor. Llamar xor_mode(TRUE) es equivalente a drawing_mode (DRAW_MODE_XOR, NULL, 0, 0); Llamar xor_mode(FALSE) es equivalente a drawing_mode (DRAW_MODE_SOLID, NULL, 0, 0);
Relacionado con: drawing_mode.
void solid_mode();
Esto es un atajo para seleccionar el dibujado sólido. Es equivalente a llamar drawing_mode(DRAW_MODE_SOLID, NULL, 0, 0);
Relacionado con: drawing_mode.

Transparencia en modos de 256 colores

En modos de vídeo con paleta, la translucidez y la iluminación son implementadas con una tabla precalculada de 64k, que contiene el resultado de la combinación de cualquier color c1 con c2. Tiene que crear esta tabla antes de usar cualquiera de las rutinas de iluminación o translucidez. Dependiendo de cómo se crea tabla, será posible hacer un rango diferente de efectos. Por ejemplo, la translucidez se puede implementar usando un color intermedio entre c1 y c2 como resultado de su combinación. La iluminación se consigue tratando uno de los colores como nivel de luz (0-255) en vez de como color, y creando la tabla apropiadamente. Un rango de efectos especializados es posible, si por ejemplo sustituye cualquier color con otro color haciendo los colores individuales de origen o destino totalmente sólidos o invisibles.

Las tablas de color pueden ser precalculadas con la utilidad colormap, o generadas en tiempo real. La estructura COLOR_MAP se define así:

   typedef struct {
      unsigned char data[PAL_SIZE][PAL_SIZE];
   } COLOR_MAP;
extern COLOR_MAP *color_map;
Puntero global a una tabla de color. ¡Esto debe ser ajustado antes de usar cualquiera de las funciones de dibujado translúcido o iluminado en modos de 256 colores!
Relacionado con: create_color_table, create_light_table, create_trans_table, set_trans_blender, draw_trans_sprite, draw_lit_sprite, drawing_mode.
void create_light_table(COLOR_MAP *table, const PALETTE pal, int r, g, b, void (*callback)(int pos));
Llena la tabla de mapeo de color especificada con los datos precalculados necesarios para hacer efectos de translucidez con la paleta especificada. Cuando se combinan los colores c1 y c2 con esta tabla, c1 se trata como un nivel de luz desde 0 a 255. Con un nivel de luz de 255 la tabla devolverá el color c2 sin cambios, con un nivel de luz 0 devolverá el valor r,g,b que especifque a la función, y con niveles de luz intermedios devolverá un color intermedio. Los valores r,g y b están entre 0-63. Si la función callback no es NULL, se la llamará 256 veces durante el cálculo, permitiéndole mostrar un indicador de progreso.
Relacionado con: color_map, create_trans_table, create_color_table, create_blender_table, draw_lit_sprite.
void create_trans_table(COLOR_MAP *table, const PALETTE pal, int r, g, b, void (*callback)(int pos));
Rellena la tabla de color especificada con los datos precalculados necesarios para hacer efectos de translucidez con la paleta especificada. Cuando se combinan los colores c1 y c2 en esta tabla, el resultado será un color intermedio entre los dos. Los valores r, g, b que especifique son la solidez de cada componente de color, desde 0 (totalmente transparente) hasta 255 (totalmente sólido). Para una solidez del 50%, pasa 128. Esta función trata el color origen #0 como un caso especial, dejando el destino sin cambiar siempre que se encuentre un pixel del color cero, para que los sprites con máscara puedan ser dibujados correctamente. Si la función callback no es NULL, será llamada 256 veces durante el cálculo, permitiéndole enseñar un indicador de progreso.
Relacionado con: color_map, create_light_table, create_color_table, draw_trans_sprite.
void create_color_table(COLOR_MAP *table, const PALETTE pal, void (*blend)(PALETTE pal, int x, int y, RGB *rgb), void (*callback)(int pos));
Llena la tabla de mapeo de color con datos precalculados necesarios para poder hacer efectos propios con la paelta especificada, llamando a la función de fundido para determinar los resultados de cada combinación de color. A su rutina de fundido se le pasará un puntero a la paleta y los dos colores que van a ser combinados, y debería devolver el resultado deseado en una estructura RGB con formato 0-63. Entonces Allegro buscará en la paleta aquél color que mejor encaje con el que pidió, por lo que no importa si la paleta no tiene un color que encaje exactamente. Si la función callback no es NULL, se le llamará 256 veces durante el cálculo, permitiéndole que muestre un indicador de progreso.
Relacionado con: color_map, create_light_table, create_trans_table, create_blender_table.
void create_blender_table(COLOR_MAP *table, const PALETTE pal, void (*callback)(int pos));
Llena la tabla de mapeo de color especificada con datos precalculados para hacer un equivalente "paletizado" de cualquiera de los modos de fundido truecolor que esté actualmente seleccionado. Después de llamar a set_trans_blender(), set_blender_mode() o cualquiera de las otras rutinas de modo de fundido, puede usar esta función para crear un tabla de mapeo de 8 bits que tendrá los mismos resultados que el modo de fundido de 24 bits que tenga seleccionado.
Relacionado con: color_map, create_light_table, create_trans_table, create_color_table, set_trans_blender, set_blender_mode.

Transparencia en truecolor

En los modo de video truecolor, la translucidez y la iluminación están implementadas por una función de fundido de la forma:

   unsigned long (*BLENDER_FUNC)(unsigned long x, y, n);
Esta rutina toma dos colores como parámetros, los descompone en sus componenetes rojo, verde y azul, los combina acorde con el valor de interpolación n, y entonces fusiona de nuevo el resultado en un solo valor de color, que devuelve.

Como estas rutinas se pueden usar desde diferentes profundidades de color, hay tres callbacks, una para usar con píxels de 15 bits (5.5.5), una para píxels de 16 bits (5.6.5), y otra para píxels de 24 bits (8.8.8), que puede compartirse entre el código de 24 y 32 bits dado que el empaquetamiento de bits es el mismo.


void set_trans_blender(int r, int g, int b, int a);
Selecciona el conjunto de rutinas de fundido por defecto, que hacen una interpolación lineal simple entre los colores fuente y destino. Cuando se llama a una función de dibujo translúcido, el parámetro alfa ajustado por esta rutina se usa como factor de interpolación, que controla la solidez del dibujado (de 0 a 255). Cuando una función de dibujo iluminado de es llamada, el valor alfa se ignora, y se usa el color pasado a la función de sprite para seleccionar un nivel alfa. La rutina de fundido se usará para interpolar entre el color del sprite y los valores RGB que se le pasaron a esta función (en un rango de 0 a 255).

Relacionado con: color_map, draw_trans_sprite, draw_lit_sprite, drawing_mode, set_add_blender, set_burn_blender, set_color_blender, set_blender_mode, set_alpha_blender, set_write_alpha_blender, set_difference_blender, set_dissolve_blender, set_dodge_blender, set_hue_blender, set_invert_blender, set_luminance_blender, set_multiply_blender, set_saturation_blender, set_screen_blender.
void set_alpha_blender();
Activa el modo de fundido especial de canal-alfa, que se usa para dibujar sprites RGBA de 32 bits. Después de llamar a esta función, puede usar draw_trans_sprite() o draw_trans_rle_sprite() para dibujar una imagen de 32 bits en un otra hicolor o truecolor. Los valore alfa se tomarán directamente del gráfico origen, asíq ue puede variar la solidez de cada parte de la imagen. Sin embargo, no puede usar ninguna de las funciones normales de translucidez mientras este modo esté activo, así que debería volver a uno de los modos normales de fundido (p.ej. set_trans_blender()) antes de dibujar otra cosa que no sean sprites en RGBA de 32 bits.
Relacionado con: set_trans_blender, draw_trans_sprite, draw_trans_rle_sprite, set_write_alpha_blender.
void set_write_alpha_blender();
Activa el modo especial de edición de canal-alfa, que se usa para dibujar canales alfa encima de un sprite RGB existente, para transformarlo en una imagen en formato RGBA. Después de llamar a esta función, puede ajustar el modo de dibujo a DRAW_MODE_TRANS y entonces escribir valores de color (de 0 a 255) en una imágen de 32 bits. Esto dejará los valores de color igual, pero alterará el alfa con los valores que esté escribiendo. Después de activar este modo también puede usar draw_trans_sprite() para superponer una mascara alfa de 8 bits encima de un sprite existente de 32 bits.
Relacionado con: set_alpha_blender, draw_trans_sprite, drawing_mode.
void set_add_blender(int r, int g, int b, int a);
Activa un modo de fundido de color para combinar píxels truecolor iluminados o translúcidos.
Relacionado con: set_trans_blender, drawing_mode.
void set_burn_blender(int r, int g, int b, int a);
Activa un modo de fundido "chamuscado" para combinar píxels truecolor iluminados o translúcidos. Aquí el brillo de los colores de la imagen origen reduce el brillo de la imagen destino, oscureciendola.
Relacionado con: set_trans_blender, drawing_mode.
void set_color_blender(int r, int g, int b, int a);
Activa un modo de fundido de color para combinar píxels truecolor iluminados o translúcidos. Aplica sólo el tono y saturación de la imagen origen a la imagen destino. La luminosidad de la imagen destino no queda afectada.
Relacionado con: set_trans_blender, drawing_mode.
void set_difference_blender(int r, int g, int b, int a);
Activa el modo de fundido por diferencia para combinar píxels truecolor translúcidos o iluminados. Esto crea una imágen que tiene colores calculados por la diferencia entre los colores fuente y destino.
Relacionado con: set_trans_blender, drawing_mode.
void set_dissolve_blender(int r, int g, int b, int a);
Activa un modo de fundido por disolución para combinar píxels truecolor translúcidos o iluminados. Aleatoriamente, reemplaza los colores de algunos píxels de la imagen destino con los correspondientes de la imágen origen. El número de pixels reeemplazados depende del valor alpha (cuanto más alto sea el valor, más pixels se reemplazarán; va pillando la idea :)
Relacionado con: set_trans_blender, drawing_mode.
void set_dodge_blender(int r, int g, int b, int a);
Activa un mode de fundido "trucado" para combinar píxels truecolor iluminados o translúcidos. La claridad de colores en la imágen origen ilumina los colores de la imagen destino. El mayor efecto se consigue con el blanco; el negro no tiene ningún efecto.
Relacionado con: set_trans_blender, drawing_mode.
void set_hue_blender(int r, int g, int b, int a);
Activa un modo de fundido por tono para combinar píxels truecolor iluminados o translúcidos. Éste aplica el tono del origen al destino.
Relacionado con: set_trans_blender, drawing_mode.
void set_invert_blender(int r, int g, int b, int a);
Activa el modo de fundido inverso para combinar píxels truecolor iluminados o translúcidos. Funde el color inverso (o negativo) del origen con el de destino.
Relacionado con: set_trans_blender, drawing_mode.
void set_luminance_blender(int r, int g, int b, int a);
Activa el modo de fundido de iluminación para combinar píxels truecolor iluminados o translúcidos. Aplica la ilumincación del origen al destino. El color de la destinación no queda afectado.
Relacionado con: set_trans_blender, drawing_mode.
void set_multiply_blender(int r, int g, int b, int a);
Activa un modo de fundido por multiplicación para combinar píxels truecolor iluminados o translúcidoz. Combina las imágenes origen y destino, multiplicando los coloroes para producir un color más oscuro. Si el color se multiplica por blanco no cambia; cuando se multiplica por negro se vuelve negro.
Relacionado con: set_trans_blender, drawing_mode.
void set_saturation_blender(int r, int g, int b, int a);
Activa un modo de fundido de saturación para combinar píxels truecolor iluminados o translúcidos. Aplica la saturación del origen a la imagen destino.
Relacionado con: set_trans_blender, drawing_mode.
void set_screen_blender(int r, int g, int b, int a);
Activa un modo de fundido de pantalla para combinar píxels truecolor iluminados o translúcidos. Este modo de fundido ilumina el color de la imagen destino multiplicando el color inverso del origen con el color destino. Es más o menos el opuesto al modo de fundido por multiplicación.
Relacionado con: set_trans_blender, drawing_mode.
void set_blender_mode(BLENDER_FUNC b15, b16, b24, int r, g, b, a);
Especifíca un conjunto de rutinas propias de fundido en truecolor, que pueden ser usadas para implementar cualquier modo de interpolación que necesite. Esta función comparte un único fundido entre los modos de 24 y 32 bits.
Relacionado con: draw_lit_sprite, drawing_mode, set_blender_mode_ex, set_trans_blender, color_map, draw_trans_sprite.
void set_blender_mode_ex(BLENDER_FUNC b15, b16, b24, b32, b15x, b16x, b24x, int r, g, b, a);
Como set_blender_mode(), pero le permite especificar un conjunto más completo de rutinas de fundido. Las rutinas b15, b16, b24 y b32 se usan cuando se vayan a dibujar píxels en destinos con el mismo formato, meintras que b15x, b16x y b24x las usan draw_trans_sprite() y draw_trans_rle_sprite cuando van adibujar imágenes RGBA en un destino que tiene otro formato. Estos fundidos se les pasará un parámetro x de 32 bits, junto con un valor y de una profundidad diferente de color, y debe hacer algo sensible como respuesta.
Relacionado con: set_blender_mode, set_alpha_blender.

Volver al Indice