Laboratorium nr 6
1/4
1)
Bitmapy
Biblioteka Allegro podczas wywołania funkcji set_gfx_mode() standardowo alokuje w
pamięci karty graficznej specjalny obszar będący bitmapą. Obszar ten opisany jest za
pomocą struktury BITMAP i dostęp do niego odbywa się poprzez zmienną wskaźnikową
screen. Dodatkowo biblioteka Allegro oferuje programiście możliwość tworzenia własnych
bitmap w pamięci RAM komputera. Rozróżniamy 4 podstawowe typy bitmap:
1.
Memory Bitmap (standardowa bitmapa w pamięci RAM)
2.
Sub Bitmap (bitmapa potomna, będąca częścią bitmapy rodzica)
3.
Video Memory Bitmap (specjalny rodzaj bitmap, wykorzystywany w grach)
4.
System Bitmap (specjalny rodzaj bitmap systemowych)
W celu alokacji pamięci dla własnej bitmapy, wywołujemy funkcję:
BITMAP *create_bitmap(int width, int height)
Funkcja ta zwraca wskaźnik do bitmapy, w przypadku błędu alokacji zwracana jest
wartość NULL. Na końcu działania programu należy zwolnić obszar pamięci zajęty przez
daną bitmapę za pomocą wywołania funkcji:
void destroy_bitmap(BITMAP *bitmap)
Nazwa funkcji
Parametry
Opis
create_bitmap_ex
BITMAP *create_bitmap_ex(int
color_depth, int width, int height)
Funkcja alokuje obszar w pamięci
komputera dla bitmapy o głębi
koloru i rozmiarach podanych jako
parametry funkcji
create_sub_bitmap
BITMAP *create_sub_bitmap(BITMAP
*parent, int x, y, width, height)
Funkcja alokuje obszar w pamięci
komputera dla sub-bitmapy. Jako
parametry podajemy rozmiar oraz
wskaźnik na bitmapę (rodzica)
create_video_bitmap
BITMAP *create_video_bitmap(int width,
int height)
Funkcja alokuje obszar w pamięci
komputera dla video-bitmapy. Jako
parametry podajemy rozmiar
bitmapy
create_system_bitmap
BITMAP *create_system_bitmap(int
width, int height)
Funkcja alokuje obszar w pamięci
komputera dla system-bitmapy.
Jako parametry podajemy rozmiar
bitmapy
set_clip_rect
void set_clip_rect(BITMAP *bitmap, int x1,
int y1, int x2, int y2)
Funkcja ustawia nowy prostokąt
obcinania dla podanej bitmapy.
Grafika Komputerowa 2D
Temat: Bitmapy, wczytywanie plików, double-buffer w bibliotece Allegro
Instrukcja
laboratoryjna
6
Przygotował: dr inż. Grzegorz Łukawski, mgr inż. Maciej Lasota
Laboratorium nr 6
2/4
2)
Wczytywanie plików
Biblioteka Allegro umożliwia wczytywania różnego rodzaju bitmap z plików. Obsługuje
ona następujące formaty plików graficznych: BMP, PCX, TGA, LBM. W celu wczytania
bitmapy z dowolnie obsługiwanego pliku wywołujemy funkcję:
BITMAP *load_bitmap(const char *filename, RGB *pal)
Funkcja ta przyjmuje dwa parametry. Pierwszy parametr jest stałą znakową, będącą
nazwą pliku. Drugim parametrem jest zmienna typu PALETTE, zadaniem tej zmiennej jest
przechowywanie wczytanej z pliku palety kolorów.
Każdą wczytaną bitmapę musimy na końcu zwolnić za pomocą funkcji
destroy_bitmap().
Nazwa funkcji
Parametry
Opis
load_bmp
BITMAP *load_bmp(const char *filename, RGB *pal)
Funkcja wczytuje bitmapę oraz
paletę kolorów z pliku BMP
load_lbm
BITMAP *load_lbm(const char *filename, RGB *pal)
Funkcja wczytuje bitmapę oraz
paletę kolorów z pliku LBM
load_pcx
BITMAP *load_pcx(const char *filename, RGB *pal)
Funkcja wczytuje bitmapę oraz
paletę kolorów z pliku PCX
load_tga
BITMAP *load_tga(const char *filename, RGB *pal)
Funkcja wczytuje bitmapę oraz
paletę kolorów z pliku TGA
save_bitmap
int save_bitmap(const char *filename, BITMAP *bmp,
const RGB *pal)
Funkcja zapisuje bitmapę do
dowolnie obsługiwanego
formatu pliku.
3)
Kopiowanie bitmap w pamięci
W celu skopiowania prostokątnego obszaru jednej bitmapy do drugiej bitmapy,
wywołujemy funkcje:
void blit(BITMAP *source, BITMAP *dest, int source_x, int source_y, int dest_x,
int dest_y, int width, int height);
Jako parametry podajemy bitmapę źródłową, bitmapę docelową, współrzędne lewego
górnego rogu obszaru oraz wysokość i szerokość obszaru do skopiowania. Funkcja blite()
wykorzystywana jest w technice Double Buffernig (podwójnego bufora), czyli technice
zapewniającej płynne wyświetlanie obrazów. Każdy kolejny obraz jest wcześniej rysowany w
pamięci RAM komputera, po czym zostaje bezpośrednio wyświetlony przez kartę graficzną
na ekranie monitora.
Laboratorium nr 6
3/4
UWAGA! SPRITE (w Allegro) są to specjalne rodzaje bitmap, służące do
przechowywania obrazów np. w grach komputerowych. Możemy na nich
operować identycznie jak na zwykłych bitmapach.
Nazwa funkcji
Parametry
Opis
draw_sprite
void draw_sprite(BITMAP *bmp, BITMAP *sprite,
int x, int y)
Funkcja kopiuje obszar
bitmapy sprite do drugiej
bitmapy. Jako parametr
podajemy pozycje
początkową rysowania
stretch_sprite
void stretch_sprite(BITMAP *bmp, BITMAP *sprite,
int x, int y, int w, int h)
Funkcja kopiuje obszar
bitmapy sprite do drugiej
bitmapy, dokonując zmiany
rozmiaru. Jako parametry
podajemy pozycję
początkową rysowania oraz
nową wysokość i szerokość
rotate_sprite
void rotate_sprite(BITMAP *bmp, BITMAP *sprite,
int x, int y, fixed angle)
Funkcja kopiuje obszar
bitmapy sprite do drugiej
bitmapy, dokonując obrotu o
podany kąt
pivot_sprite
void pivot_sprite(BITMAP *bmp, BITMAP *sprite,
int x, int y, int cx, int cy, fixed angle)
Funkcja kopiuje obszar
bitmapy sprite do drugiej
bitmapy, dokonując obrotu o
podany kąt względem punktu
(cx,cy)
draw_sprite_v_flip
void draw_sprite_v_flip(BITMAP *bmp, BITMAP
*sprite, int x, int y)
Funkcja kopiuje obszar
bitmapy sprite do drugiej
bitmapy, dokonując
odwrócenia pionowego
draw_sprite_h_flip
void draw_sprite_h_flip(BITMAP *bmp, BITMAP
*sprite, int x, int y);
Funkcja kopiuje obszar
bitmapy sprite do drugiej
bitmapy, dokonując
odwrócenia poziomego
draw_sprite_vh_flip
void draw_sprite_vh_flip(BITMAP *bmp, BITMAP
*sprite, int x, int y)
Funkcja kopiuje obszar
bitmapy sprite do drugiej
bitmapy, dokonując
odwrócenia pionowego i
poziomego
rotate_scaled_sprite
void rotate_scaled_sprite(BITMAP *bmp, BITMAP
*sprite, int x, int y, fixed angle, fixed scale)
Funkcja kopiuje obszar
bitmapy sprite do drugiej
bitmapy, dokonując obrotu o
podany kąt i skalowania
pivot_scaled_sprite
void pivot_scaled_sprite(BITMAP *bmp, BITMAP
*sprite, int x, int y, int cx, int cy, fixed angle, fixed
scale)
Funkcja kopiuje obszar
bitmapy sprite do drugiej
bitmapy, dokonując obrotu o
podany kąt względem punktu
(cx,cy) i skalowania
stretch_blit
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)
Funkcja kopiuje obszar
jednej bitmapy do drugiej
bitmapy, dokonując
dodatkowo zmiany rozmiaru
Laboratorium nr 6
4/4
UWAGA! Poniżej zostały przedstawione niektóre funkcje służące do uzyskania
efektu przezroczystości, więcej informacji w dokumentacji biblioteki
Nazwa funkcji
Parametry
set_trans_blender
void set_trans_blender(int r, int g, int b, int a);
set_alpha_blender
void set_alpha_blender();
set_write_alpha_blender
void set_write_alpha_blender();