WIP More work on queue-based flood Fill
This commit is contained in:
parent
8a9ab25151
commit
e06ead84c5
1 changed files with 27 additions and 7 deletions
34
src/fill.c
34
src/fill.c
|
|
@ -27,7 +27,7 @@
|
||||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
(See COPYING.txt)
|
(See COPYING.txt)
|
||||||
|
|
||||||
Last updated: November 17, 2021
|
Last updated: November 20, 2021
|
||||||
$Id$
|
$Id$
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
@ -92,6 +92,7 @@ void add_to_queue(int x1, int x2, int y, int yd);
|
||||||
int remove_from_queue(int * x1, int * x2, int * y, int * yd);
|
int remove_from_queue(int * x1, int * x2, int * y, int * yd);
|
||||||
void cleanup_queue(void);
|
void cleanup_queue(void);
|
||||||
void track_extents_and_progbar(int x, int y, int * extent_x1, int * extent_y1, int * extent_x2, int * extent_y2, SDL_Surface * screen, SDL_Surface * canvas);
|
void track_extents_and_progbar(int x, int y, int * extent_x1, int * extent_y1, int * extent_x2, int * extent_y2, SDL_Surface * screen, SDL_Surface * canvas);
|
||||||
|
double Inside(SDL_Surface * last, SDL_Surface * canvas, Uint32 old_colr, int x, int y, int * outside, double * in_line, Uint32 * px_colr);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef USE_QUEUE
|
#ifdef USE_QUEUE
|
||||||
|
|
@ -242,9 +243,24 @@ Uint32 blend(SDL_Surface * canvas, Uint32 draw_colr, Uint32 old_colr, double pct
|
||||||
return SDL_MapRGB(canvas->format, new_r, new_g, new_b);
|
return SDL_MapRGB(canvas->format, new_r, new_g, new_b);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef USE_QUEUE
|
||||||
|
double Inside(SDL_Surface * last, SDL_Surface * canvas, Uint32 old_colr, int x, int y, int * outside, double * in_line, Uint32 * px_colr) {
|
||||||
|
*px_colr = getpixels[last->format->BytesPerPixel] (last, x, y);
|
||||||
|
*in_line = colors_close(canvas, *px_colr, old_colr);
|
||||||
|
|
||||||
|
if (*in_line < COLOR_MATCH_WIDE && *outside < WIDE_MATCH_THRESHOLD) {
|
||||||
|
*outside = (*outside + 1);
|
||||||
|
return(1);
|
||||||
|
}
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
void simulate_flood_fill(SDL_Surface * screen, SDL_Surface * last, SDL_Surface * canvas, int x, int y, Uint32 cur_colr, Uint32 old_colr, int * extent_x1, int * extent_y1, int * extent_x2, int * extent_y2, Uint8 * touched) {
|
void simulate_flood_fill(SDL_Surface * screen, SDL_Surface * last, SDL_Surface * canvas, int x, int y, Uint32 cur_colr, Uint32 old_colr, int * extent_x1, int * extent_y1, int * extent_x2, int * extent_y2, Uint8 * touched) {
|
||||||
#ifdef USE_QUEUE
|
#ifdef USE_QUEUE
|
||||||
int x1, x2, dy;
|
int x1, x2, dy, outside;
|
||||||
|
double in_line;
|
||||||
|
Uint32 px_colr;
|
||||||
|
|
||||||
/* "Same" color? No need to fill */
|
/* "Same" color? No need to fill */
|
||||||
if (!would_flood_fill(canvas, cur_colr, old_colr))
|
if (!would_flood_fill(canvas, cur_colr, old_colr))
|
||||||
|
|
@ -266,13 +282,15 @@ void simulate_flood_fill(SDL_Surface * screen, SDL_Surface * last, SDL_Surface *
|
||||||
/* Do the work (possibly queuing more, as we go) */
|
/* Do the work (possibly queuing more, as we go) */
|
||||||
while (remove_from_queue(&x1, &x2, &y, &dy))
|
while (remove_from_queue(&x1, &x2, &y, &dy))
|
||||||
{
|
{
|
||||||
|
printf("From queue: (%d -> %d, %d) %d\n", x1, x2, y, dy);
|
||||||
x = x1;
|
x = x1;
|
||||||
|
|
||||||
if (Inside(x, y))
|
outside = 0;
|
||||||
|
if (Inside(last, canvas, old_colr, x, y, &outside, &in_line, &px_colr))
|
||||||
{
|
{
|
||||||
while (Inside(x - 1, y))
|
while (Inside(last, canvas, old_colr, x - 1, y, &outside, &in_line, &px_colr))
|
||||||
{
|
{
|
||||||
Set(x - 1, y);
|
putpixels[canvas->format->BytesPerPixel] (canvas, x - 1, y, blend(canvas, cur_colr, px_colr, (1.0 - in_line)));
|
||||||
track_extents_and_progbar(x - 1, y, extent_x1, extent_y1, extent_x2, extent_y2, screen, canvas);
|
track_extents_and_progbar(x - 1, y, extent_x1, extent_y1, extent_x2, extent_y2, screen, canvas);
|
||||||
|
|
||||||
x = x - 1;
|
x = x - 1;
|
||||||
|
|
@ -282,9 +300,10 @@ void simulate_flood_fill(SDL_Surface * screen, SDL_Surface * last, SDL_Surface *
|
||||||
if (x < x1)
|
if (x < x1)
|
||||||
add_to_queue(x, x1 - 1, y - dy, -dy);
|
add_to_queue(x, x1 - 1, y - dy, -dy);
|
||||||
|
|
||||||
|
outside = 0;
|
||||||
while (x1 < x2)
|
while (x1 < x2)
|
||||||
{
|
{
|
||||||
Set(x1, y);
|
putpixels[canvas->format->BytesPerPixel] (canvas, x1, y, blend(canvas, cur_colr, px_colr, (1.0 - in_line)));
|
||||||
track_extents_and_progbar(x1, y, extent_x1, extent_y1, extent_x2, extent_y2, screen, canvas);
|
track_extents_and_progbar(x1, y, extent_x1, extent_y1, extent_x2, extent_y2, screen, canvas);
|
||||||
|
|
||||||
x1 = x1 + 1;
|
x1 = x1 + 1;
|
||||||
|
|
@ -295,7 +314,8 @@ void simulate_flood_fill(SDL_Surface * screen, SDL_Surface * last, SDL_Surface *
|
||||||
if (x1 - 1 > x2)
|
if (x1 - 1 > x2)
|
||||||
add_to_queue(x2 + 1, x1 - 1, y - dy, -dy);
|
add_to_queue(x2 + 1, x1 - 1, y - dy, -dy);
|
||||||
|
|
||||||
while (x1 < x2 && !Inside(x1, y))
|
outside = 0;
|
||||||
|
while (x1 < x2 && !Inside(last, canvas, old_colr, x1, y, &outside, &in_line, &px_colr))
|
||||||
x1++;
|
x1++;
|
||||||
|
|
||||||
x = x1;
|
x = x1;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue