type568
Member #8,381
March 2007
|
My problem is that this code crashes. It was originally using _putpixel32, that's why it called fastfloodfill32. I know that it's slow, but my idea was to make it myself, with a putpixel. So I changed it to putpixel, and now I'm totally confused. As I know putpixel, can't crash a program, while it's bitmap does exist. Also, commenting ANY one of the two summons each fastfloodfill_32_**direction** summons, solves the crash problem (Than the function doesn't do what is required of it though). I spent hourse on commenting different parts, looking threw the code and I can't understand what is the problem. It seems like the problem, is in the closed circle. (summon 1 by 1 east,north,west, south,east..) It should freeze than though, not crash. (I noticed that before, while was trying to do the same with 8 directions, untill understood that 8 aren't nessasary, and even worse). 1 | | 2 | #include "Graphics.h" | 3 | | 4 | //fastfloodfill568_32 | 5 | void fastfloodfill568_32_north(BITMAP* dest,int x,int y); | 6 | void fastfloodfill568_32_west(BITMAP* dest,int x,int y); | 7 | void fastfloodfill568_32_south(BITMAP* dest,int x,int y); | 8 | void fastfloodfill568_32_east(BITMAP* dest,int x,int y); | 9 | | 10 | int c_fff568,p_fff568; //BITMAP* .... | 11 | | 12 | void fastfloodfill568_32_east(BITMAP* dest,int x,int y) | 13 | { | 14 | _putpixel(dest,x,y,c_fff568); | 15 | | 16 | if(dest->w>x+1) | 17 | if(_getpixel32(dest,x+1,y)==p_fff568) | 18 | fastfloodfill568_32_east(dest,x+1,y); | 19 | if(0<y-1) | 20 | if(_getpixel32(dest,x,y-1)==p_fff568) | 21 | fastfloodfill568_32_north(dest,x,y-1); | 22 | } | 23 | | 24 | void fastfloodfill568_32_north(BITMAP* dest,int x,int y) | 25 | { | 26 | putpixel(dest,x,y,c_fff568); | 27 | | 28 | if(0<y-1) | 29 | if(_getpixel32(dest,x,y-1)==p_fff568) | 30 | fastfloodfill568_32_north(dest,x,y-1); | 31 | if(0<x-1) | 32 | if(_getpixel32(dest,x-1,y)==p_fff568) | 33 | fastfloodfill568_32_west(dest,x-1,y); | 34 | } | 35 | | 36 | void fastfloodfill568_32_west(BITMAP* dest,int x,int y) | 37 | { | 38 | putpixel(dest,x,y,c_fff568); | 39 | | 40 | | 41 | if(0<x-1) | 42 | if(_getpixel32(dest,x-1,y)==p_fff568) | 43 | fastfloodfill568_32_west(dest,x-1,y); | 44 | if(dest->h>y+1) | 45 | if(_getpixel32(dest,x,y+1)==p_fff568) | 46 | fastfloodfill568_32_south(dest,x,y+1); | 47 | } | 48 | | 49 | void fastfloodfill568_32_south(BITMAP* dest,int x,int y) | 50 | { | 51 | putpixel(dest,x,y,c_fff568); | 52 | | 53 | if(dest->h>y+1) | 54 | if(_getpixel32(dest,x,y+1)==p_fff568) | 55 | fastfloodfill568_32_south(dest,x,y+1); | 56 | if(dest->w>x+1) | 57 | if(_getpixel32(dest,x+1,y)==p_fff568) | 58 | fastfloodfill568_32_east(dest,x+1,y); | 59 | } | 60 | | 61 | | 62 | void fastfloodfill568_32(BITMAP* dest,int x,int y,int clr) | 63 | { | 64 | c_fff568=clr; | 65 | | 66 | if(x>0 && y>0 && x<dest->w && y<dest->h) | 67 | { | 68 | p_fff568=getpixel(dest,x,y); | 69 | if(p_fff568 == c_fff568) | 70 | return; | 71 | putpixel(dest,x,y,c_fff568); | 72 | } | 73 | else | 74 | return; | 75 | | 76 | acquire_bitmap(dest); | 77 | if(dest->w>x+1) | 78 | if(_getpixel32(dest,x+1,y)==p_fff568) | 79 | fastfloodfill568_32_east(dest,x+1,y); | 80 | | 81 | if(0<y-1) | 82 | if(_getpixel32(dest,x,y-1)==p_fff568) | 83 | fastfloodfill568_32_north(dest,x,y-1); | 84 | | 85 | if(0<x-1) | 86 | if(_getpixel32(dest,x-1,y)==p_fff568) | 87 | fastfloodfill568_32_west(dest,x-1,y); | 88 | | 89 | | 90 | if(dest->h>y+1) | 91 | if(_getpixel32(dest,x,y+1)==p_fff568) | 92 | fastfloodfill568_32_south(dest,x,y+1); | 93 | | 94 | release_bitmap(dest); | 95 | } |
This code crashes in different programs, while allgro floodfill works. Another problem though, is the floodfill's leaks, allegro's floodfill leaks from my 4 cornered forms. (They are drawn with a loop, using only four dots, in some cases leaks). Edit: Graphics.h:
#define USE_CONSOLE
#include <allegro.h>
void fastfloodfill568_32(BITMAP* dest,int x,int y,int color);
void fastline568_32(BITMAP* buff,int x,int y,int x1,int y1,int color);
|