[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [17735] branches/projection-paint/source/ blender/src/imagepaint.c: split code for applying each paint tool into its own function.

Campbell Barton ideasman42 at gmail.com
Sun Dec 7 09:54:49 CET 2008


Revision: 17735
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=17735
Author:   campbellbarton
Date:     2008-12-07 09:54:42 +0100 (Sun, 07 Dec 2008)

Log Message:
-----------
split code for applying each paint tool into its own function.

Modified Paths:
--------------
    branches/projection-paint/source/blender/src/imagepaint.c

Modified: branches/projection-paint/source/blender/src/imagepaint.c
===================================================================
--- branches/projection-paint/source/blender/src/imagepaint.c	2008-12-07 06:21:06 UTC (rev 17734)
+++ branches/projection-paint/source/blender/src/imagepaint.c	2008-12-07 08:54:42 UTC (rev 17735)
@@ -1413,6 +1413,7 @@
 	}
 	
 	projPixel = (ProjPixel *)BLI_memarena_alloc(arena, size);
+	//memset(projPixel, 0, size);
 	
 	if (ibuf->rect_float) {
 		projPixel->pixel.f_pt = (float *)ibuf->rect_float + ((x_px + y_px * ibuf->x) * 4);
@@ -1494,10 +1495,10 @@
 			}
 			else {
 				if (ibuf->rect_float) {
-					((ProjPixelClone *)projPixel)->clonepx.ch[3] = 0;
+					((ProjPixelClone *)projPixel)->clonepx.f[3] = 0;
 				}
 				else {
-					((ProjPixelClone *)projPixel)->clonepx.f[3] = 0;
+					((ProjPixelClone *)projPixel)->clonepx.ch[3] = 0;
 				}
 			}
 			
@@ -3869,6 +3870,103 @@
 	cp[2]= mfac*cp1[2] + fac*cp2[2];
 }
 
+static void do_projectpaint_clone(ProjPaintState *ps, ProjPixel *projPixel, float *rgba, float alpha, short blend)
+{
+	if (ps->is_airbrush==0 && projPixel->mask < 1.0f) {
+		projPixel->newColor.uint = IMB_blend_color(projPixel->newColor.uint, ((ProjPixelClone*)projPixel)->clonepx.uint, (int)(alpha*255), blend);
+		blend_color_mix(projPixel->pixel.ch_pt,  projPixel->origColor.ch, projPixel->newColor.ch, (int)(projPixel->mask*255));
+	}
+	else {
+		*projPixel->pixel.uint_pt = IMB_blend_color(*projPixel->pixel.uint_pt, ((ProjPixelClone*)projPixel)->clonepx.uint, (int)(alpha*255), blend);
+	}
+}
+
+static void do_projectpaint_clone_f(ProjPaintState *ps, ProjPixel *projPixel, float *rgba, float alpha, short blend)
+{
+	if (ps->is_airbrush==0 && projPixel->mask < 1.0f) {
+		IMB_blend_color_float(projPixel->newColor.f, projPixel->newColor.f, ((ProjPixelClone *)projPixel)->clonepx.f, alpha, blend);
+		blend_color_mix_float(projPixel->pixel.f_pt,  projPixel->origColor.f, projPixel->newColor.f, projPixel->mask);
+	}
+	else {
+		IMB_blend_color_float(projPixel->pixel.f_pt, projPixel->pixel.f_pt, ((ProjPixelClone *)projPixel)->clonepx.f, alpha, blend);
+	}
+}
+
+/* do_projectpaint_smear*
+ * 
+ * note, mask is used to modify the alpha here, this is not correct since it allows
+ * accumulation of color greater then 'projPixel->mask' however in the case of smear its not 
+ * really that important to be correct as it is with clone and painting 
+ */
+static void do_projectpaint_smear(ProjPaintState *ps, ProjPixel *projPixel, float *rgba, float alpha, short blend, MemArena *smearArena, LinkNode **smearPixels, float co[2])
+{
+	unsigned char rgba_ub[4];
+	
+	if (project_paint_PickColor(ps, co, NULL, rgba_ub, 1)==0)
+		return; 
+	
+	((ProjPixelClone *)projPixel)->clonepx.uint = IMB_blend_color(*projPixel->pixel.uint_pt, *((unsigned int *)rgba_ub), (int)(alpha*projPixel->mask*255), blend);
+	BLI_linklist_prepend_arena(smearPixels, (void *)projPixel, smearArena);
+} 
+
+static void do_projectpaint_smear_f(ProjPaintState *ps, ProjPixel *projPixel, float *rgba, float alpha, short blend, MemArena *smearArena, LinkNode **smearPixels_f, float co[2])
+{
+	unsigned char rgba_ub[4];
+	unsigned char rgba_smear[4];
+	
+	if (project_paint_PickColor(ps, co, NULL, rgba_ub, 1)==0)
+		return;
+	
+	IMAPAINT_FLOAT_RGBA_TO_CHAR(rgba_smear, projPixel->pixel.f_pt);
+	((ProjPixelClone *)projPixel)->clonepx.uint = IMB_blend_color(*((unsigned int *)rgba_smear), *((unsigned int *)rgba_ub), (int)(alpha*projPixel->mask*255), blend);
+	BLI_linklist_prepend_arena(smearPixels_f, (void *)projPixel, smearArena);
+}
+
+static void do_projectpaint_draw(ProjPaintState *ps, ProjPixel *projPixel, float *rgba, float alpha, short blend)
+{
+	unsigned char rgba_ub[4];
+	
+	if (ps->is_texbrush) {
+		rgba_ub[0] = FTOCHAR(rgba[0] * ps->brush->rgb[0]);
+		rgba_ub[1] = FTOCHAR(rgba[1] * ps->brush->rgb[1]);
+		rgba_ub[2] = FTOCHAR(rgba[2] * ps->brush->rgb[2]);
+		rgba_ub[3] = FTOCHAR(rgba[3]);
+	}
+	else {
+		IMAPAINT_FLOAT_RGB_TO_CHAR(rgba_ub, ps->brush->rgb);
+		rgba_ub[3] = 255;
+	}
+	
+	if (ps->is_airbrush==0 && projPixel->mask < 1.0f) {
+		projPixel->newColor.uint = IMB_blend_color(projPixel->newColor.uint, *((unsigned int *)rgba_ub), (int)(alpha*255), blend);
+		blend_color_mix(projPixel->pixel.ch_pt,  projPixel->origColor.ch, projPixel->newColor.ch, (int)(projPixel->mask*255));
+	}
+	else {
+		*projPixel->pixel.uint_pt = IMB_blend_color(*projPixel->pixel.uint_pt, *((unsigned int *)rgba_ub), (int)(alpha*255), blend);
+	}
+}
+
+static void do_projectpaint_draw_f(ProjPaintState *ps, ProjPixel *projPixel, float *rgba, float alpha, short blend) {
+	if (ps->is_texbrush) {
+		rgba[0] *= ps->brush->rgb[0];
+		rgba[1] *= ps->brush->rgb[1];
+		rgba[2] *= ps->brush->rgb[2];
+	}
+	else {
+		VECCOPY(rgba, ps->brush->rgb);
+	}
+	
+	if (ps->is_airbrush==0 && projPixel->mask < 1.0f) {
+		IMB_blend_color_float(projPixel->newColor.f, projPixel->newColor.f, rgba, alpha, blend);
+		blend_color_mix_float(projPixel->pixel.f_pt,  projPixel->origColor.f, projPixel->newColor.f, projPixel->mask);
+	}
+	else {
+		IMB_blend_color_float(projPixel->pixel.f_pt, projPixel->pixel.f_pt, rgba, alpha, blend);
+	}
+}
+
+
+
 /* run this for single and multithreaded painting */
 static void *do_projectpaint_thread(void *ph_v)
 {
@@ -3888,7 +3986,6 @@
 	ImagePaintPartialRedraw *last_partial_redraw_cell;
 	
 	float rgba[4], alpha, dist, dist_nosqrt;
-	unsigned char rgba_ub[4];
 	
 	float brush_size_sqared;
 	int bucket_index;
@@ -3898,11 +3995,11 @@
 	rctf bucket_bounds;
 	
 	/* for smear only */
-	char rgba_smear[4];
 	float pos_ofs[2];
 	float co[2];
+	
 	LinkNode *smearPixels = NULL;
-	LinkNode *smearPixels_float = NULL;
+	LinkNode *smearPixels_f = NULL;
 	MemArena *smearArena = NULL; /* mem arena for this brush projection only */
 	
 	
@@ -3925,9 +4022,6 @@
 			/* No pixels initialized */
 			project_bucket_init(ps, thread_index, bucket_index, &bucket_bounds);
 		}
-		
-		/* TODO - we may want to init clone data in a separate to project_bucket_init
-		 * so we don't go overboard and init too many clone pixels  */
 
 		for (node = ps->bucketRect[bucket_index]; node; node = node->next) {
 			
@@ -3969,102 +4063,25 @@
 					case PAINT_TOOL_CLONE:
 						if (is_floatbuf) {
 							if (((ProjPixelClone *)projPixel)->clonepx.f[3]) {
-								
-								if (ps->is_airbrush==0 && projPixel->mask < 1.0f) {
-									IMB_blend_color_float(projPixel->newColor.f, projPixel->newColor.f, ((ProjPixelClone *)projPixel)->clonepx.f, alpha, blend);
-									blend_color_mix_float(projPixel->pixel.f_pt,  projPixel->origColor.f, projPixel->newColor.f, projPixel->mask);
-								}
-								else {
-									IMB_blend_color_float(projPixel->pixel.f_pt, projPixel->pixel.f_pt, ((ProjPixelClone *)projPixel)->clonepx.f, alpha, blend);
-								}
+								do_projectpaint_clone_f(ps, projPixel, rgba, alpha, blend);
 							}
 						}
 						else {
-							if (((ProjPixelClone*)projPixel)->clonepx.ch[3]) {
-								if (ps->is_airbrush==0 && projPixel->mask < 1.0f) {
-									projPixel->newColor.uint = IMB_blend_color(projPixel->newColor.uint, ((ProjPixelClone*)projPixel)->clonepx.uint, (int)(alpha*255), blend);
-									blend_color_mix(projPixel->pixel.ch_pt,  projPixel->origColor.ch, projPixel->newColor.ch, (int)(projPixel->mask*255));
-								}
-								else {
-									*projPixel->pixel.uint_pt = IMB_blend_color(*projPixel->pixel.uint_pt, ((ProjPixelClone*)projPixel)->clonepx.uint, (int)(alpha*255), blend);
-								}
+							if (((ProjPixelClone*)projPixel)->clonepx.ch[3]) { 
+								do_projectpaint_clone(ps, projPixel, rgba, alpha, blend);
 							}
 						}
 						break;
 					case PAINT_TOOL_SMEAR:
 						Vec2Subf(co, projPixel->projCoSS, pos_ofs);
-						if (project_paint_PickColor(ps, co, NULL, rgba_ub, 1)) {
-							
-							/* note, mask is used to modify the alpha here, this is not correct since it allows
-							 * accumulation of color greater then 'projPixel->mask' however in the case of smear its not 
-							 * really that important to be correct as it is with clone and painting 
-							 */ 
-							
-							/* drat! - this could almost be very simple if we ignore
-							 * the fact that applying the color directly gives feedback,
-							 * instead, collect the colors and apply after :/ */
-							
-#if 0						/* looks OK but not correct - also would need float buffer */
-							*projPixel->pixel.uint_pt = IMB_blend_color(*projPixel->pixel.uint_pt, *((unsigned int *)rgba_ub), (int)(alpha*projPixel->mask*256), blend);
-#endif
-							
-							/* add to memarena instead */
-							if (is_floatbuf) {
-								/* TODO FLOAT */ /* Smear wont do float properly yet */
-								/* Note, alpha*255 makes pixels darker */
-								IMAPAINT_FLOAT_RGBA_TO_CHAR(rgba_smear, projPixel->pixel.f_pt);
-								((ProjPixelClone *)projPixel)->clonepx.uint = IMB_blend_color(*((unsigned int *)rgba_smear), *((unsigned int *)rgba_ub), (int)(alpha*projPixel->mask*255), blend);
-								BLI_linklist_prepend_arena(&smearPixels_float, (void *)projPixel, smearArena);
-							}
-							else {
-								((ProjPixelClone *)projPixel)->clonepx.uint = IMB_blend_color(*projPixel->pixel.uint_pt, *((unsigned int *)rgba_ub), (int)(alpha*projPixel->mask*255), blend);
-								BLI_linklist_prepend_arena(&smearPixels, (void *)projPixel, smearArena);
-							}
-						}
+						
+						if (is_floatbuf)	do_projectpaint_smear_f(ps, projPixel, rgba, alpha, blend, smearArena, &smearPixels_f, co);
+						else				do_projectpaint_smear(ps, projPixel, rgba, alpha, blend, smearArena, &smearPixels, co);
 						break;
 					default:
-						if (is_floatbuf) {
-							if (ps->is_texbrush) {
-								rgba[0] *= ps->brush->rgb[0];
-								rgba[1] *= ps->brush->rgb[1];
-								rgba[2] *= ps->brush->rgb[2];
-							}
-							else {
-								VECCOPY(rgba, ps->brush->rgb);
-							}
-							
-							if (ps->is_airbrush==0 && projPixel->mask < 1.0f) {
-								IMB_blend_color_float(projPixel->newColor.f, projPixel->newColor.f, rgba, alpha, blend);
-								blend_color_mix_float(projPixel->pixel.f_pt,  projPixel->origColor.f, projPixel->newColor.f, projPixel->mask);
-							}
-							else {
-								IMB_blend_color_float(projPixel->pixel.f_pt, projPixel->pixel.f_pt, rgba, alpha, blend);
-							}
-							
-						}
-						else {
-							
-							if (ps->is_texbrush) {
-								rgba_ub[0] = FTOCHAR(rgba[0] * ps->brush->rgb[0]);
-								rgba_ub[1] = FTOCHAR(rgba[1] * ps->brush->rgb[1]);

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list