From 0431cce21fe5595fd934abc5b1b9a048ba993f14 Mon Sep 17 00:00:00 2001 From: Bill Kendrick Date: Sat, 20 Nov 2021 01:47:13 -0800 Subject: [PATCH 1/2] Fill debug updates Show final queue structure size at the end. Watching the fill blit happen is now a separate #define'd option. --- src/fill.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/fill.c b/src/fill.c index 1b2d575e8..d3bb97212 100644 --- a/src/fill.c +++ b/src/fill.c @@ -60,6 +60,7 @@ #define WIDE_MATCH_THRESHOLD 3 // #define DEBUG +// #define DEBUG_WATCH #define QUEUE_SIZE_CHUNK 1024 @@ -162,6 +163,10 @@ void cleanup_queue(void) { if (queue != NULL) free(queue); +#ifdef DEBUG + printf("queue_size = %d\n\n", queue_size); +#endif + queue_size = 0; queue_start = 0; queue_end = 0; @@ -308,7 +313,7 @@ void simulate_flood_fill_outside_check(int x, int y, int y_outside) if ((global_prog_anim % 800) == 1) /* Always lay sound _once_ */ playsound(global_canvas, 1, SND_FILL, 1, x, SNDDIST_NEAR); -#ifdef DEBUG +#ifdef DEBUG_WATCH if (global_prog_anim % 100 == 0) { SDL_BlitSurface(global_canvas, NULL, global_screen, NULL); From e77c7766cd76b579dc12cbceafea25c03b79f446 Mon Sep 17 00:00:00 2001 From: Bill Kendrick Date: Sat, 20 Nov 2021 01:52:43 -0800 Subject: [PATCH 2/2] Fill queue is now actually a stack Size of queue structure (which contains 3 ints, so is 12 bytes on my Linux laptop) before & after, when filling a few sample images when running in a 3000x2000 window: * a pattern i drew queue: 855,040 stack: 287,744 * mosaic queue: 908,288 stack: 398,336 * mosaic 4x via panel magic tool queue: 1,451,008 stack: 734,208 --- src/fill.c | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/src/fill.c b/src/fill.c index d3bb97212..042ee0bcb 100644 --- a/src/fill.c +++ b/src/fill.c @@ -69,7 +69,7 @@ typedef struct queue_s { } queue_t; queue_t * queue; -int queue_size = 0, queue_start = 0, queue_end = 0; +int queue_size = 0, queue_end = 0; /* Local function prototypes: */ @@ -91,7 +91,6 @@ void cleanup_queue(void); void init_queue(void) { queue_size = 0; - queue_start = 0; queue_end = 0; queue = (queue_t *) malloc(sizeof(queue_t) * QUEUE_SIZE_CHUNK); @@ -139,19 +138,19 @@ void add_to_queue(int x, int y, int y_outside) { } int remove_from_queue(int * x, int * y, int * y_outside) { - if (queue_start == queue_end) + if (queue_end == 0) return 0; - *x = queue[queue_start].x; - *y = queue[queue_start].y; - *y_outside = queue[queue_start].y_outside; + queue_end--; - queue_start++; + *x = queue[queue_end].x; + *y = queue[queue_end].y; + *y_outside = queue[queue_end].y_outside; #ifdef DEBUG - if (queue_start % 100 == 0) + if (queue_end % 100 == 0) { - printf("queue_start = %d\n", queue_start); + printf("queue_end = %d\n", queue_end); fflush(stdout); } #endif @@ -164,11 +163,10 @@ void cleanup_queue(void) { free(queue); #ifdef DEBUG - printf("queue_size = %d\n\n", queue_size); + printf("Final size was %d\n", queue_size); #endif queue_size = 0; - queue_start = 0; queue_end = 0; }