13 Blits y sprites

Todas estas rutinas son afectadas por el �rea de recorte del bitmap destino.


void clear_bitmap(BITMAP *bitmap);
Limpia el bitmap con el color 0.

Relacionado con: clear_to_color, clear.
void clear(BITMAP *bitmap);
Un alias de clear_bitmap(), existe para mantener compatibilidad hacia atr�s. Est� implementado como una funci�n est�tica inline. El alias puede ser desactivado definiendo el s�mbolo de preprocesador ALLEGRO_NO_CLEAR_BITMAP_ALIAS antes de incluir los ficheros de cabecera de Allegro, por ejemplo:
      #define ALLEGRO_NO_CLEAR_BITMAP_ALIAS
      #include <allegro.h>
Relacionado con: clear_bitmap.
void clear_to_color(BITMAP *bitmap, int color);
Limpia el bitmap con el color especificado.
Relacionado con: clear_bitmap.
void blit(BITMAP *source, BITMAP *dest, int source_x, int source_y, int dest_x, int dest_y, int width, int height);
Copia un �rea rectangular del bitmap origen en el bitmap destino. Los par�metros source_x y source_y son de la esquina superior izquierda del �rea a copiar del bitmap origen, y dest_x y dest_y es la posici�n correspondiente en el bitmap destino. Esta rutina respeta el �rea de recorte del destino, y tambi�n habr� recorte si intenta copiar �reas que quedan fuera del bitmap origen.

Puede hacer un blit entre cualquier parte de dos bitmaps, incluso si las dos �reas se superponen (ejemplo: source y dest son el mismo bitmap, o uno es un sub-bitmap del otro). Deber�a tener en cuenta, sin embargo, que muchas tarjetas SVGA no tienen bancos de lectura/escritura separados, lo que significa que hacer un blit de una parte de la pantalla a otra requiere el uso de un bitmap de memoria temporal, y es por ello extremadamente lento. Como regla general deber�a evitar hacer blits de la pantalla sobre s� misma en modos SVGA.

Sin embargo, hacer un blit en modo-X de una parte de la pantalla a otro lado puede ser significantemente m�s r�pido que desde la memoria hacia la pantalla, siempre y cuando el origen y el destino est�n correctamente alineados el uno con el otro. Hacer una copia entre �reas de la pantalla que se superponen es lento, pero si las �reas no se superponen, y si tienen la misma alineaci�n de planos (es decir: (source_x%4) == (dest_x%4)), entonces se pueden usar los registros de la VGA para realizar una r�pida transferencia de datos. Para tomar ventaja de esto, en modo-X normalmente se almacenan los gr�ficos en una parte oculta de la memoria de v�deo (usando una pantalla virtual grande), y se hacen blits desde all� a la parte visible de la pantalla.

Si el bit GFX_HW_VRAM_BLIT est� activado en la variable gfx_capabilities, el controlador actual soporta blits de una parte de la pantalla a otra usando aceleraci�n por hardware. Esto es extremadamente r�pido, por lo que si este bit est� activado, ser�a �til almacenar parte de sus gr�ficos m�s frequentemente usados en una porci�n oculta de la memoria de v�deo.

Al contrario que la mayor�a de las rutinas gr�ficas, blit() permite que los bitmaps de origen y destino sean de diferentes profundidades de color, por lo que se puede usar para convertir im�genes de un formato de pixel a otro.

Relacionado con: masked_blit, stretch_blit, draw_sprite, gfx_capabilities.
void masked_blit(BITMAP *source, BITMAP *dest, int source_x, int source_y, int dest_x, int dest_y, int width, int height);
Como blit(), pero salta los pixels transparentes (cero en modos de 256 colores, y rosa fucsia para modos truecolor). La imagen origen debe ser un bitmap de memoria o un sub-bitmap, y las regiones de origen y destino no pueden superponerse.

Si el bit GFX_HW_VRAM_BLIT_MASKED est� activado en la variable gfx_capabilities, el controlador actual soporta blits de una parte de la pantalla a otra usando aceleraci�n por hardware. Esto es extremadamente r�pido, por lo que si este bit est� activado, ser�a �til almacenar parte de sus gr�ficos m�s frequentemente usados en una porci�n oculta de la memoria de v�deo.

Atenci�n: �si el bit de aceleraci�n por hardware no est� activado, masked_blit() no funcionar� correctamente cuando la imagen origen sea la memoria de v�deo, y el gr�fico a dibujar siempre tiene que ser un bitmap de memoria!

Relacionado con: blit, draw_sprite, bitmap_mask_color.
void stretch_blit(BITMAP *source, BITMAP *dest, int source_x, source_y, source_width, source_height, int dest_x, dest_y, dest_width, dest_height);
Como blit(), excepto que puede escalar im�genes de tal forma que las �reas de origen y destino no tienen que tener el mismo tama�o. Esta rutina no realiza tantas comprobaciones de seguridad como blit(): en particular debe tener cuidado de no copiar desde �reas fuera del bitmap origen, y no puede hacer la copia entre �reas que se superponen, y el bitmap origen y destino no pueden ser el mismo. Adem�s, el origen debe ser un bitmap de memoria o sub-bitmap, no la pantalla hardware.
Relacionado con: blit, stretch_sprite.
void masked_stretch_blit(BITMAP *source, BITMAP *dest, int source_x, source_y, source_w, source_h, int dest_x, dest_y, dest_w, dest_h);
Como stretch_blit(), pero se salta pixels transparentes, que est�n marcados con un 0 en modos de 256 colores o magenta fara datos en truecolor (rojo y azul al m�ximo y el verde a cero). Las regiones origen (source) y destino (destination) no deben solaparse.
Relacionado con: blit, masked_blit, stretch_blit, stretch_sprite.
void draw_sprite(BITMAP *bmp, BITMAP *sprite, int x, int y);
Dibuja una copia del bitmap sprite en el bitmap destino en la posici�n especificada. Eso es casi igual que blit(sprite, bmp, 0, 0, x, y, sprite->w, sprite->h), pero usa un modo de dibujado con m�scara en el cual los pixels transparentes (cero en modos de 256 colores, rosa fucsia para modos truecolor) son ignorados, por lo que la imagen de fondo se podr� ver por las partes enmascaradas del sprite. El sprite debe ser un bitmap de memoria, no la pantalla o un sub-bitmap. El destino puede ser cualquier bitmap.

Si el bit GFX_HW_VRAM_BLIT_MASKED est� activado en la variable gfx_capabilities, el controlador actual soporta blits de una parte de la pantalla a otra usando aceleraci�n por hardware. Esto es extremadamente r�pido, por lo que si este bit est� activado, ser�a �til almacenar parte de sus gr�ficos m�s frequentemente usados en una porci�n oculta de la memoria de v�deo.

Atenci�n: �si el bit de aceleraci�n por hardware no est� activado, draw_sprite() no funcionar� correctamente cuando la imagen origen sea la memoria de v�deo, y el gr�fico a dibujar siempre tiene que ser un bitmap de memoria!

A pesar de no soportar generalmente gr�ficos de diferentes profundidades de color, como caso especial puede usar esta funci�n para dibujar im�genes origen de 256 colores en bitmaps destino truecolor, por lo que puede usar efectos de paleta en sprites espec�ficos dentro de un programa truecolor.

Relacionado con: bitmap_mask_color, draw_gouraud_sprite, stretch_sprite, rotate_sprite, draw_character, draw_rle_sprite, draw_compiled_sprite, masked_blit, blit, draw_sprite_v_flip, draw_trans_sprite, draw_lit_sprite.
void draw_sprite_v_flip(BITMAP *bmp, BITMAP *sprite, int x, int y);
void draw_sprite_h_flip(BITMAP *bmp, BITMAP *sprite, int x, int y);
void draw_sprite_vh_flip(BITMAP *bmp, BITMAP *sprite, int x, int y);
Estas son como draw_sprite(), pero invierten la imagen sobre el eje vertical, horizontal o ambos. Esto produce im�genes espejo exactas, que no es lo mismo que rotar el sprite (y adem�s esto es m�s r�pido que la rutina de rotaci�n). El sprite debe ser un bitmap de memoria.
Relacionado con: draw_sprite, bitmap_mask_color.
void draw_trans_sprite(BITMAP *bmp, BITMAP *sprite, int x, int y);
Usa la tabla global color_map o las funciones de fundido truecolor para sobreimprimir un sprite encima de una imagen existente. Esto s�lo debe usarse si antes se ha creado la tabla de colores (para modos de 256 colores) o las funciones de fundido (para modos truecolor). Ya que tiene que leer al igual que escribir en la memoria del bitmap, el dibujado transl�cido es muy lento si dibuja directamente en la memoria de v�deo, as� que siempre que sea posibe deber�a usar un bitmap de memoria. El bitmap y el sprite deben, normalmente, tener la misma profundidad de color, pero como caso especial puede dibujar sprites en formato RGBA de 32 bits en cualquier bitmap hicolor o truecolor, siempre y cuando llame primero a set_alpha_blender(), y puede dibujar im�genes con 8 bits de alfa en un destino en RGBA de 32 bits, mientras llame antes a set_write_alpha_blender().
Relacionado con: bitmap_mask_color, draw_sprite, draw_lit_sprite, draw_trans_rle_sprite, color_map, set_trans_blender, set_alpha_blender, set_write_alpha_blender.
void draw_lit_sprite(BITMAP *bmp, BITMAP *sprite, int x, int y, int color);
Entinta el sprite hacia el color o nivel de luz especificado, usando la tabla global color_map, y dibuja la imagen resultante en el bitmap destino. Esto s�lo se puede usar si antes ha creado una tabla de colores (para modos de 256 colores) o un mapa de fundido (para modos truecolor).
Relacionado con: draw_lit_rle_sprite, color_map, set_trans_blender, bitmap_mask_color, draw_sprite, draw_trans_sprite, draw_gouraud_sprite.
void draw_gouraud_sprite(BITMAP *bmp, BITMAP *sprite, int x, int y, int c1, int c2, int c3, int c4);
Entinta el sprite al color o nivel de luz especificado, interpolando los cuatro colores de la esquina sobre la imagen. Esto s�lo se puede usar si antes ha creado una tabla de colores (para modos de 256 colores) o un mapa de fundido (para modos truecolor).
Relacionado con: bitmap_mask_color, draw_sprite, draw_lit_sprite, color_map, set_trans_blender.
void draw_character(BITMAP *bmp, BITMAP *sprite, int x, int y, int color);
Dibuja una copia del sprite en el bitmap destino en la posici�n especificada, dibujando los pixels transparentes (cero en modos de 256 colores, rosa fucsia en modos truecolor) con el modo de texto actual (ignor�ndolos si el modo de texto es -1, de otra forma los dibuja en el color de fondo del texto), y ajustando el resto de los pixels al color especificado. El sprite debe ser una imagen de 8 bits, incluso si el destino es un bitmap truecolor.
Relacionado con: draw_sprite, bitmap_mask_color.
void rotate_sprite(BITMAP *bmp, BITMAP *sprite, int x, int y, fixed angle);
Dibuja el sprite en el bitmap destino. Ser� colocado usando su esquina superior izquierda como la posici�n especificada, y entonces ser� rotado el �ngulo especificado sobre su centro. El �ngulo es un n�mero de punto fijo 16.16 con el mismo formato usado por las funciones trigonom�tricas de punto fijo, siendo 256 un c�rculo completo, 64 un �ngulo recto, etc. Todas las funciones de rotaci�n pueden usar diferentes tipos de bitmaps de origen y destino, incluso bitmaps de pantalla o con una profundidad de color distinta.
Relacionado con: draw_sprite, rotate_scaled_sprite, rotate_sprite_v_flip, itofix, Trigonometr�a de punto fijo, pivot_scaled_sprite, pivot_scaled_sprite_v_flip, pivot_sprite, pivot_sprite_v_flip, rotate_scaled_sprite_v_flip.
void rotate_sprite_v_flip(BITMAP *bmp, BITMAP *sprite, int x, int y, fixed angle);
Como rotate_sprite, pero tambi�n invierte la im�gen verticalmente. Para invertir la imagen horizontalmente, use esta rutina pero a�ada itofix(128) al �ngulo. Para invertir la im�gen en ambos ejes, use rotate_sprite() y a�ada itofix(128) a su �ngulo.
Relacionado con: pivot_sprite_v_flip, pivot_scaled_sprite_v_flip, rotate_sprite, rotate_scaled_sprite_v_flip.
void rotate_scaled_sprite(BITMAP *bmp, BITMAP *sprite, int x, int y, fixed angle, fixed scale);
Como rotate_sprite(), pero modifica el tama�o de la imagen a la vez que la rota.
Relacionado con: pivot_scaled_sprite, pivot_scaled_sprite_v_flip, rotate_sprite, rotate_scaled_sprite_v_flip.
void rotate_scaled_sprite_v_flip(BITMAP *bmp, BITMAP *sprite, int x, int y, fixed angle, fixed scale)
Dibuja el sprite, de forma similar a rotate_scaled_sprite(), excepto que primero invierte la imagen verticalmente.
Relacionado con: rotate_sprite, rotate_scaled_sprite, rotate_sprite_v_flip.
void pivot_sprite(BITMAP *bmp, BITMAP *sprite, int x, int y, int cx, int cy, fixed angle);
Como rotate_sprite(), pero toma el punto del sprite dado por (cx, cy) como (x, y) en el bitmap, y entonces lo rota sobre este punto.
Relacionado con: rotate_sprite, pivot_scaled_sprite, pivot_sprite_v_flip.
void pivot_sprite_v_flip(BITMAP *bmp, BITMAP *sprite, int x, int y, int cx, int cy, fixed angle);
Como rotate_sprite_v_flip(), pero toma el punto del sprite dado por (cx, cy) como (x, y) en el bitmap, y entonces lo rota sobre este punto.
Relacionado con: pivot_sprite, rotate_sprite_v_flip.
void pivot_scaled_sprite(BITMAP *bmp, BITMAP *sprite, int x, int y, int cx, int cy, fixed angle, fixed scale));
Como rotate_scaled_sprite(), pero toma el punto del sprite dado por (cx, cy) como (x, y) en el bitmap, y entonces lo rota y escala sobre este punto.
Relacionado con: pivot_sprite, pivot_scaled_sprite_v_flip, rotate_sprite, rotate_scaled_sprite.
void pivot_scaled_sprite_v_flip(BITMAP *bmp, BITMAP *sprite, int x, int y, fixed angle, fixed scale)
Como rotate_scaled_sprite_v_flip(), pero toma el punto del sprite dado por (cx, cy) como (x, y) en el bitmap, y entonces lo rota y escala sobre este punto.
Relacionado con: pivot_sprite, pivot_scaled_sprite, rotate_sprite, rotate_scaled_sprite_v_flip, rotate_sprite_v_flip.
void stretch_sprite(BITMAP *bmp, BITMAP *sprite, int x, int y, int w, int h);
Dibuja un sprite en el bitmap en la posici�n especificada, cambiando el tama�o al ancho y alto especificado. La diferencia entre stretch_sprite() y stretch_blit() es que stretch_sprite() enmascara los pixels transparentes, que son cero en modos de 256 colores, y rosa fucsia en modos truecolor (rojo y azul al m�ximo, verde a cero).
Relacionado con: draw_sprite, stretch_blit, bitmap_mask_color.

Volver al Indice