Revision: 17563 http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=17563 Author: campbellbarton Date: 2008-11-24 23:06:09 +0100 (Mon, 24 Nov 2008)
Log Message: ----------- minor changes * less calls to BKE_image_get_ibuf when switching between images * remove thread debug prints * use own pixel blending funcs (IMB_blend_color isnt needed in some cases), slightly faster without this. 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-11-24 21:57:58 UTC (rev 17562) +++ branches/projection-paint/source/blender/src/imagepaint.c 2008-11-24 22:06:09 UTC (rev 17563) @@ -159,7 +159,6 @@ //#define PROJ_DEBUG_PAINT 1 //#define PROJ_DEBUG_NOSEAMBLEED 1 -//#define PROJ_DEBUG_PRINT_THREADS 1 #define PROJ_DEBUG_WINCLIP 1 /* projectFaceSeamFlags options */ @@ -2715,7 +2714,7 @@ MTFace *tf; int a, i; /* generic looping vars */ - int image_index, face_index; + int image_index = -1, face_index; /* memory sized to add to arena size */ int tot_bucketRectMem=0; @@ -3067,22 +3066,19 @@ } if (tpage_last != tf->tpage) { - ibuf= BKE_image_get_ibuf((Image *)tf->tpage, NULL); - if (ibuf) { - image_index = BLI_linklist_index(image_LinkList, tf->tpage); - - if (image_index==-1) { /* MemArena dosnt have an append func */ - BLI_linklist_append(&image_LinkList, tf->tpage); - image_index = ps->image_tot; - ps->image_tot++; - } + image_index = BLI_linklist_index(image_LinkList, tf->tpage); + + if (image_index==-1 && BKE_image_get_ibuf((Image *)tf->tpage, NULL)) { /* MemArena dosnt have an append func */ + BLI_linklist_append(&image_LinkList, tf->tpage); + image_index = ps->image_tot; + ps->image_tot++; } tpage_last = tf->tpage; } - if (ibuf) { + if (image_index != -1) { /* Initialize the faces screen pixels */ /* Add this to a list to initialize later */ project_paint_delayed_face_init(ps, mf, tf, face_index); @@ -3718,9 +3714,6 @@ ps->context_bucket_x = ps->bucket_min[0]; ps->context_bucket_y = ps->bucket_min[1]; -#ifdef PROJ_DEBUG_PRINT_THREADS - printf("Initializing Values %d %d!", ps->bucket_min[0], ps->bucket_min[1]); -#endif return 1; } @@ -3739,9 +3732,6 @@ if (project_bucket_isect_circle(ps, ps->context_bucket_x, ps->context_bucket_y, mval, ps->brush->size * ps->brush->size, bucket_bounds)) { *bucket_index = ps->context_bucket_x + (ps->context_bucket_y * ps->buckets_x); -#ifdef PROJ_DEBUG_PRINT_THREADS - printf(" --- %d %d \n", ps->context_bucket_x, ps->context_bucket_y); -#endif ps->context_bucket_x++; if (ps->thread_tot > 1) @@ -3758,7 +3748,6 @@ return 0; } - /* Each thread gets one of these, also used as an argument to pass to project_paint_op */ typedef struct ProjectHandle { /* args */ @@ -3773,6 +3762,26 @@ int thread_index; } ProjectHandle; +static void blend_color_mix(unsigned char *cp, unsigned char *cp1, unsigned char *cp2, int fac) +{ + /* this and other blending modes previously used >>8 instead of /255. both + are not equivalent (>>8 is /256), and the former results in rounding + errors that can turn colors black fast after repeated blending */ + int mfac= 255-fac; + + cp[0]= (mfac*cp1[0]+fac*cp2[0])/255; + cp[1]= (mfac*cp1[1]+fac*cp2[1])/255; + cp[2]= (mfac*cp1[2]+fac*cp2[2])/255; +} + +static void blend_color_mix_float(float *cp, float *cp1, float *cp2, float fac) +{ + float mfac= 1.0-fac; + cp[0]= mfac*cp1[0] + fac*cp2[0]; + cp[1]= mfac*cp1[1] + fac*cp2[1]; + cp[2]= mfac*cp1[2] + fac*cp2[2]; +} + /* run this for single and multithreaded painting */ static void *do_projectpaint_thread(void *ph_v) { @@ -3822,15 +3831,8 @@ /* printf("brush bounds %d %d %d %d\n", bucket_min[0], bucket_min[1], bucket_max[0], bucket_max[1]); */ -#ifdef PROJ_DEBUG_PRINT_THREADS - printf("THREAD %d %d %d\n", ps->thread_tot, thread_index, (ps->bucket_max[0] - ps->bucket_min[0]) * (ps->bucket_max[1] - ps->bucket_min[1]) ); -#endif while (project_bucket_iter_next(ps, &bucket_index, bucket_bounds, pos)) { -#ifdef PROJ_DEBUG_PRINT_THREADS - printf("\t%d %d\n", thread_index, bucket_index); -#endif - /* Check this bucket and its faces are initialized */ if (ps->bucketFlags[bucket_index] == PROJ_BUCKET_NULL) { /* No pixels initialized */ @@ -3884,7 +3886,7 @@ 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); - IMB_blend_color_float( projPixel->pixel.f_pt, projPixel->origColor.f, projPixel->newColor.f, projPixel->mask, IMB_BLEND_MIX); + 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); } @@ -3893,7 +3895,7 @@ 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); - *projPixel->pixel.uint_pt = IMB_blend_color( projPixel->origColor.uint, projPixel->newColor.uint, (int)(projPixel->mask*255), IMB_BLEND_MIX); + 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); } @@ -3913,9 +3915,9 @@ * 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 */ +#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 +#endif /* add to memarena instead */ if (is_floatbuf) { @@ -3942,7 +3944,7 @@ if (ps->is_airbrush==0 && projPixel->mask < 1.0f) { IMB_blend_color_float( projPixel->newColor.f, projPixel->newColor.f, rgba, alpha, blend); - IMB_blend_color_float( projPixel->pixel.f_pt, projPixel->origColor.f, projPixel->newColor.f, projPixel->mask, IMB_BLEND_MIX); + 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); } @@ -3961,7 +3963,7 @@ 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); - *projPixel->pixel.uint_pt = IMB_blend_color( projPixel->origColor.uint, projPixel->newColor.uint, (int)(projPixel->mask*255), IMB_BLEND_MIX); + 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); } @@ -3973,8 +3975,7 @@ /* done painting */ } - node = node->next; - } while (node); + } while ((node = node->next)); } } _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org http://lists.blender.org/mailman/listinfo/bf-blender-cvs