Witam, mam problem z algorytmem typu floodfill (wypełnianie danego obszaru kolorem) w allegro 5. Naskrobałem taki oto kodzik, nie jest on za ładny ale działa (niby):
void wypelnij_pixel(ALLEGRO_BITMAP *bitmapa, int x, int y, ALLEGRO_COLOR kolor1, ALLEGRO_COLOR kolor2)
{
ALLEGRO_COLOR kolor3 = al_get_pixel(bitmapa, x, y);
if (kolor1.r == kolor3.r && kolor1.g == kolor3.g && kolor1.b == kolor3.b)
{
al_put_pixel(x, y, kolor2);
wypelnij_pixel(bitmapa, x-1, y, kolor1, kolor2);
wypelnij_pixel(bitmapa, x+1, y, kolor1, kolor2);
wypelnij_pixel(bitmapa, x, y-1, kolor1, kolor2);
wypelnij_pixel(bitmapa, x, y+1, kolor1, kolor2);
}
}
void wypelnij_pole(ALLEGRO_BITMAP *bitmapa, int x, int y, ALLEGRO_COLOR kolor2)
{
ALLEGRO_COLOR kolor1 = al_get_pixel(bitmapa, x, y);
// al_lock_bitmap(bitmapa, ALLEGRO_PIXEL_FORMAT_ANY, ALLEGRO_LOCK_WRITEONLY);
al_set_target_bitmap(bitmapa);
if (kolor1.r != kolor2.r || kolor1.g != kolor2.g || kolor1.b != kolor2.g) wypelnij_pixel(bitmapa, x, y, kolor1, kolor2);
// al_unlock_bitmap(bitmapa);
al_set_target_bitmap(al_get_backbuffer(okno));
al_set_target_backbuffer(okno);
al_rest(0.5);
}
Przed wywołaniem funkcji wypelnij_pole zawsze zamykam bitmapę, na której wypełniam obszar za pomocą al_lock_bitmap.
Funkcja niby działa ok i ładnie wszystko koloruje na obszarach rzędu 200x100, 250x50 pikseli itp, ale gdy próbuję wypełnić jakiś większy obszar (np. 400 x 400) program się wyłącza. Macie na to jakaś radę?