diff options
-rw-r--r-- | source/blender/blenkernel/BKE_colortools.h | 2 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/colortools.c | 27 | ||||
-rw-r--r-- | source/blender/imbuf/IMB_imbuf.h | 3 | ||||
-rw-r--r-- | source/blender/src/drawimage.c | 31 |
4 files changed, 62 insertions, 1 deletions
diff --git a/source/blender/blenkernel/BKE_colortools.h b/source/blender/blenkernel/BKE_colortools.h index dd739628fc5..a9d38162824 100644 --- a/source/blender/blenkernel/BKE_colortools.h +++ b/source/blender/blenkernel/BKE_colortools.h @@ -55,6 +55,6 @@ void curvemapping_evaluateRGBF(struct CurveMapping *cumap, float *vecout, con void curvemapping_evaluate_premulRGBF(struct CurveMapping *cumap, float *vecout, const float *vecin); void curvemapping_do_image(struct CurveMapping *cumap, struct Image *ima); void curvemapping_premultiply(struct CurveMapping *cumap, int restore); - +int curvemapping_RGBA_does_something(struct CurveMapping *cumap); #endif diff --git a/source/blender/blenkernel/intern/colortools.c b/source/blender/blenkernel/intern/colortools.c index 5b4c4ca107f..f9854fae98c 100644 --- a/source/blender/blenkernel/intern/colortools.c +++ b/source/blender/blenkernel/intern/colortools.c @@ -569,6 +569,8 @@ void curvemapping_do_image(CurveMapping *cumap, Image *ima) return; if(ima->ibuf->rect_float==NULL) IMB_float_from_rect(ima->ibuf); + else if(ima->ibuf->rect==NULL) + imb_addrectImBuf(ima->ibuf); curvemapping_premultiply(cumap, 0); @@ -588,3 +590,28 @@ void curvemapping_do_image(CurveMapping *cumap, Image *ima) curvemapping_premultiply(cumap, 1); } + +int curvemapping_RGBA_does_something(CurveMapping *cumap) +{ + int a; + + if(cumap->black[0]!=0.0f) return 1; + if(cumap->black[1]!=0.0f) return 1; + if(cumap->black[2]!=0.0f) return 1; + if(cumap->white[0]!=1.0f) return 1; + if(cumap->white[1]!=1.0f) return 1; + if(cumap->white[2]!=1.0f) return 1; + + for(a=0; a<CM_TOT; a++) { + if(cumap->cm[a].curve) { + if(cumap->cm[a].totpoint!=2) return 1; + + if(cumap->cm[a].curve[0].x != 0.0f) return 1; + if(cumap->cm[a].curve[0].y != 0.0f) return 1; + if(cumap->cm[a].curve[1].x != 1.0f) return 1; + if(cumap->cm[a].curve[1].y != 1.0f) return 1; + } + } + return 0; +} + diff --git a/source/blender/imbuf/IMB_imbuf.h b/source/blender/imbuf/IMB_imbuf.h index 623e9e901f9..ae7a7f527f1 100644 --- a/source/blender/imbuf/IMB_imbuf.h +++ b/source/blender/imbuf/IMB_imbuf.h @@ -478,6 +478,9 @@ void IMB_freezbuffloatImBuf(struct ImBuf * ibuf); */ void IMB_rectfill(struct ImBuf *drect, float col[4]); +/* exported for image tools in blender, to quickly allocate 32 bits rect */ +short imb_addrectImBuf(struct ImBuf * ibuf); +void imb_freerectImBuf(struct ImBuf * ibuf); #ifdef WITH_QUICKTIME /** diff --git a/source/blender/src/drawimage.c b/source/blender/src/drawimage.c index 9a002005e06..fa6a91b701d 100644 --- a/source/blender/src/drawimage.c +++ b/source/blender/src/drawimage.c @@ -978,7 +978,22 @@ static void image_panel_curves(short cntrl) // IMAGE_HANDLER_PROPERTIES } } +/* are there curves? curves visible? and curves do something? */ +static int image_curves_active(ScrArea *sa) +{ + SpaceImage *sima= sa->spacedata.first; + if(sima->cumap) { + if(curvemapping_RGBA_does_something(sima->cumap)) { + short a; + for(a=0; a<SPACE_MAXHANDLER; a+=2) { + if(sima->blockhandler[a] == IMAGE_HANDLER_CURVES) + return 1; + } + } + } + return 0; +} static void image_blockhandlers(ScrArea *sa) { @@ -1268,6 +1283,8 @@ void drawimagespace(ScrArea *sa, void *spacedata) MEM_freeN(rect); } else { + /* this part is generic image display */ + if(sima->flag & SI_SHOW_ALPHA) { if(ibuf->rect) sima_draw_alpha_pixels(x1, y1, ibuf->x, ibuf->y, ibuf->rect); @@ -1283,6 +1300,20 @@ void drawimagespace(ScrArea *sa, void *spacedata) sima_draw_alpha_backdrop(sima, x1, y1, (float)ibuf->x, (float)ibuf->y); glEnable(GL_BLEND); } + + /* detect if we need to redo the curve map. + ibuf->rect is zero for compositor and render results after change + also: if no curves are active, we only keep the float rect + */ + if(ibuf->rect_float) { + if(image_curves_active(sa)) { + if(ibuf->rect==NULL) + curvemapping_do_image(G.sima->cumap, G.sima->image); + } + else if(ibuf->rect) + imb_freerectImBuf(ibuf); + } + if(ibuf->rect) glaDrawPixelsSafe(x1, y1, ibuf->x, ibuf->y, ibuf->x, GL_RGBA, GL_UNSIGNED_BYTE, ibuf->rect); else |