Index: A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
Home > Flood fill example in C
This flood fill code is adapted from a Tetris clone called "Tetanus On Drugs" by . It's licensed under the GNU Lesser General Public License (in addition to the GNU FDL that covers all of Wikipedia) and comes with ABSOLUTELY NO WARRANTY. #define BOARD_WIDTH 10
#define BOARD_HEIGHT 20
typedef struct MAP
{
unsigned char b[BOARD_HEIGHT][BOARD_WIDTH];
} MAP;
static void flood_loop(MAP *map, int x, int y,
unsigned int dst_c, unsigned int src_c)
{
int fillL, fillR, i;
int in_line = 1;
/* find left side, filling along the way */
fillL = fillR = x;
while( in_line )
{
map->b[y][fillL] = dst_c;
fillL--;
in_line = (fillL < 0) ? 0 : (map->b[y][fillL] == src_c);
}
fillL++;
/* find right side, filling along the way */
in_line = 1;
while( in_line )
{
map->b[y][fillR] = c;
fillR++;
in_line = (fillR > BOARD_WIDTH-1) ? 0 : (map->b[y][fillR] == fillC);
}
fillR--;
/* search top and bottom */
for(i = fillL; i <= fillR; i++)
{
if( y > 0 && map->b[y - 1][i] == fillC )
flood_loop(map, i, y - 1, c, fillC);
if( y < BOARD_HEIGHT && map->b[y + 1][i] == fillC )
flood_loop(map, i, y + 1, c, fillC);
}
}
void flood_fill(MAP *map, int x, int y, unsigned int c)
{
flood_loop(map, x, y, c, map->b[y][x]);
map->b[y][x] = c; /* some buggy optimizers needed this line */
}
This is the same algorithm adapted by Claudio Santana for the Java programming language:
int checkPixel(int[] oldPix, int[] newPix)
{
return (newPix[0] == oldPix[0] &&
newPix[1] == oldPix[1] &&
newPix[2] == oldPix[2] &&
newPix[3] == oldPix[3] ? 1:0);
}
void floodLoop(WritableRaster raster, int x, int y, int[] fill, int[] old)
{
int fillL, fillR,i;
int in_line=1;
int[] aux = {255,255,255,255};
// find left side, filling along the way
fillL = fillR = x;
while(in_line!=0)
{
int[] p = raster.getPixel(fillL,y,aux);
raster.setPixel(fillL,y,fill);
fillL--;
in_line = (fillL < 0) ? 0 : checkPixel(raster.getPixel(fillL,y,aux),old);
}
fillL++;
// find right side, filling along the way
in_line = 1;
while (in_line!=0)
{
raster.setPixel(fillR,y,fill);
fillR++;
in_line = (fillR > d.width-1) ? 0 : checkPixel(raster.getPixel(fillR,y,aux),old);
}
fillR--;
// look up and down
for( i=fillL; i<=fillR; i++ )
{
if ( y>0 && checkPixel(raster.getPixel(i,y-1,aux),old)!=0 )
floodLoop(raster,i,y-1,fill,old);
if ( y
Read more »