[Bf-blender-cvs] [5bbd377] soc-2013-paint: Replace GSQueue with BLI_Stack for image filling

Campbell Barton noreply at git.blender.org
Mon Jul 14 03:51:34 CEST 2014


Commit: 5bbd3774ed3d3729372a5cd6fbe7792b6ce8c6f6
Author: Campbell Barton
Date:   Mon Jul 14 11:45:47 2014 +1000
https://developer.blender.org/rB5bbd3774ed3d3729372a5cd6fbe7792b6ce8c6f6

Replace GSQueue with BLI_Stack for image filling

Was doing a malloc per pixel, and a redundant memcmp,
BLI_Stack chunks memory more efficiently.

===================================================================

M	source/blender/editors/sculpt_paint/paint_image_2d.c

===================================================================

diff --git a/source/blender/editors/sculpt_paint/paint_image_2d.c b/source/blender/editors/sculpt_paint/paint_image_2d.c
index e4171a5..878e1d5 100644
--- a/source/blender/editors/sculpt_paint/paint_image_2d.c
+++ b/source/blender/editors/sculpt_paint/paint_image_2d.c
@@ -42,7 +42,7 @@
 
 #include "BLI_rect.h"
 #include "BLI_math_color_blend.h"
-#include "BLI_gsqueue.h"
+#include "BLI_stack.h"
 #include "BLI_bitmap.h"
 
 #include "BKE_context.h"
@@ -1305,35 +1305,43 @@ void paint_2d_stroke_done(void *ps)
 	MEM_freeN(s);
 }
 
-static void paint_2d_fill_add_pixel_byte(int i, int j, ImBuf *ibuf, GSQueue *stack, BLI_bitmap *touched, float color[4], float threshold)
+static void paint_2d_fill_add_pixel_byte(
+        const int i, const int j, ImBuf *ibuf, BLI_Stack *stack, BLI_bitmap *touched,
+        const float color[4], float threshold_sq)
 {
-	int coordinate = j * ibuf->x + i;
+	int coordinate;
 
 	if (i >= ibuf->x || i < 0 || j >= ibuf->y || j < 0)
 		return;
 
+	coordinate = j * ibuf->x + i;
+
 	if (!BLI_BITMAP_TEST(touched, coordinate)) {
 		float color_f[4];
 		unsigned char *color_b = (unsigned char *)(ibuf->rect + coordinate);
 		rgba_uchar_to_float(color_f, color_b);
 
-		if (compare_len_squared_v3v3(color_f, color, threshold)) {
-			BLI_gsqueue_push(stack, &coordinate);
+		if (compare_len_squared_v3v3(color_f, color, threshold_sq)) {
+			BLI_stack_push(stack, &coordinate);
 		}
 		BLI_BITMAP_SET(touched, coordinate, true);
 	}
 }
 
-static void paint_2d_fill_add_pixel_float(int i, int j, ImBuf *ibuf, GSQueue *stack, BLI_bitmap *touched, const float color[4], float threshold)
+static void paint_2d_fill_add_pixel_float(
+        const int i, const int j, ImBuf *ibuf, BLI_Stack *stack, BLI_bitmap *touched,
+        const float color[4], float threshold_sq)
 {
-	int coordinate = j * ibuf->x + i;
+	int coordinate;
 
 	if (i >= ibuf->x || i < 0 || j >= ibuf->y || j < 0)
 		return;
 
+	coordinate = j * ibuf->x + i;
+
 	if (!BLI_BITMAP_TEST(touched, coordinate)) {
-		if (compare_len_squared_v3v3(ibuf->rect_float + 4 * coordinate, color, threshold)) {
-			BLI_gsqueue_push(stack, &coordinate);
+		if (compare_len_squared_v3v3(ibuf->rect_float + 4 * coordinate, color, threshold_sq)) {
+			BLI_stack_push(stack, &coordinate);
 		}
 		BLI_BITMAP_SET(touched, coordinate, true);
 	}
@@ -1400,7 +1408,7 @@ void paint_2d_bucket_fill(const bContext *C, const float color[3], Brush *br, fl
 	else {
 		/* second case, start sweeping the neighboring pixels, looking for pixels whose
 		 * value is within the brush fill threshold from the fill color */
-		GSQueue *stack;
+		BLI_Stack *stack;
 		BLI_bitmap *touched;
 		int coordinate;
 		int width = ibuf->x;
@@ -1422,7 +1430,7 @@ void paint_2d_bucket_fill(const bContext *C, const float color[3], Brush *br, fl
 		/* change image invalidation method later */
 		ED_imapaint_dirty_region(ima, ibuf, 0, 0, ibuf->x, ibuf->y);
 
-		stack = BLI_gsqueue_new(sizeof(int));
+		stack = BLI_stack_new(sizeof(int), __func__);
 		touched = BLI_BITMAP_NEW(ibuf->x * ibuf->y, "bucket_fill_bitmap");
 
 		coordinate = (j * ibuf->x + i);
@@ -1435,12 +1443,12 @@ void paint_2d_bucket_fill(const bContext *C, const float color[3], Brush *br, fl
 			rgba_uchar_to_float(pixel_color, (unsigned char *)&pixel_color_b);
 		}
 
-		BLI_gsqueue_push(stack, &coordinate);
+		BLI_stack_push(stack, &coordinate);
 		BLI_BITMAP_SET(touched, coordinate, true);
 
 		if (do_float) {
-			while (!BLI_gsqueue_is_empty(stack)) {
-				BLI_gsqueue_pop(stack, &coordinate);
+			while (!BLI_stack_is_empty(stack)) {
+				BLI_stack_pop(stack, &coordinate);
 
 				IMB_blend_color_float(ibuf->rect_float + 4 * (coordinate),
 				                      ibuf->rect_float + 4 * (coordinate),
@@ -1470,8 +1478,8 @@ void paint_2d_bucket_fill(const bContext *C, const float color[3], Brush *br, fl
 			}
 		}
 		else {
-			while (!BLI_gsqueue_is_empty(stack)) {
-				BLI_gsqueue_pop(stack, &coordinate);
+			while (!BLI_stack_is_empty(stack)) {
+				BLI_stack_pop(stack, &coordinate);
 
 				IMB_blend_color_byte((unsigned char *)(ibuf->rect + coordinate),
 				                     (unsigned char *)(ibuf->rect + coordinate),
@@ -1502,7 +1510,7 @@ void paint_2d_bucket_fill(const bContext *C, const float color[3], Brush *br, fl
 		}
 
 		MEM_freeN(touched);
-		BLI_gsqueue_free(stack);
+		BLI_stack_free(stack);
 	}
 
 	imapaint_image_update(sima, ima, ibuf, false);




More information about the Bf-blender-cvs mailing list