diff options
-rw-r--r-- | source/blender/blenkernel/intern/image.c | 7 | ||||
-rw-r--r-- | source/blender/blenloader/intern/readfile.c | 53 | ||||
-rw-r--r-- | source/blender/makesdna/DNA_image_types.h | 8 | ||||
-rw-r--r-- | source/blender/nodes/intern/CMP_nodes/CMP_image.c | 32 | ||||
-rw-r--r-- | source/blender/render/intern/source/texture.c | 7 | ||||
-rw-r--r-- | source/blender/src/buttons_shading.c | 5 | ||||
-rw-r--r-- | source/blender/src/drawimage.c | 6 | ||||
-rw-r--r-- | source/blender/src/drawnode.c | 9 |
8 files changed, 34 insertions, 93 deletions
diff --git a/source/blender/blenkernel/intern/image.c b/source/blender/blenkernel/intern/image.c index 56744224449..d9b76ac210b 100644 --- a/source/blender/blenkernel/intern/image.c +++ b/source/blender/blenkernel/intern/image.c @@ -1668,11 +1668,8 @@ static ImBuf *image_load_image_file(Image *ima, ImageUser *iuser, int cfra) ima->packedfile = newPackedFile(str); } - /*ok, this is *not* what a user expects when he clicks the premul - button, that his image is actually changed. This should be a - render-time option, not a modification to the image! - joeedh*/ - /*if(ima->flag & IMA_DO_PREMUL) - converttopremul(ibuf);*/ + if(ima->flag & IMA_DO_PREMUL) + converttopremul(ibuf); } else ima->ok= 0; diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index 7621603b570..f9a5c419adc 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -2419,7 +2419,6 @@ static void lib_link_texture(FileData *fd, Main *main) if(tex->id.flag & LIB_NEEDLINK) { tex->ima= newlibadr_us(fd, tex->id.lib, tex->ima); - tex->ipo= newlibadr_us(fd, tex->id.lib, tex->ipo); if(tex->env) tex->env->object= newlibadr(fd, tex->id.lib, tex->env->object); @@ -7451,58 +7450,6 @@ static void do_versions(FileData *fd, Library *lib, Main *main) } } - /*version patch to migrate premul flag from images to image users*/ - if (main->versionfile < 245 || (main->versionfile == 245 && main->subversionfile < 15)) { - Tex *tex; - Image *image; - ImageUser *iuser; - Scene *scene; - bNode *node; - bNodeTree *ntree; - - /*handle image textures*/ - for (tex=main->tex.first; tex; tex=tex->id.next) { - if (tex->ima) { - image = newlibadr(fd, lib, tex->ima); - if(image) - if (image->flag & IMA_OLDFLAG) - tex->iuser.flag |= IMA_DO_PREMUL; - } - } - - /*handle composite node trees*/ - for (scene=main->scene.first; scene; scene=scene->id.next) { - if (scene->nodetree) { - for (node=scene->nodetree->nodes.first; node; node=node->next) { - ID *nodeid = newlibadr(fd, lib, node->id); - if (node->storage && nodeid && GS(nodeid->name) == ID_IM) { - image = (Image*) nodeid; - iuser = node->storage; - if (image->flag & IMA_OLDFLAG) iuser->flag |= IMA_DO_PREMUL; - } - } - } - } - - /*handle node groups*/ - for (ntree=main->nodetree.first; ntree; ntree=ntree->id.next) { - if (ntree->type == NTREE_COMPOSIT) { - for (node=ntree->nodes.first; node; node=node->next) { - ID *nodeid = newlibadr(fd, lib, node->id); - if (node->storage && nodeid && GS(nodeid->name) == ID_IM) { - image = (Image*) nodeid; - iuser = node->storage; - if (image->flag & IMA_OLDFLAG) iuser->flag |= IMA_DO_PREMUL; - } - } - } - } - - /*finally, remove the flag from all images*/ - for (image=main->image.first; image; image=image->id.next) { - if (image->flag & IMA_OLDFLAG) image->flag &= ~IMA_OLDFLAG; - } - } /* WATCH IT!!!: pointers from libdata have not been converted yet here! */ /* WATCH IT 2!: Userdef struct init has to be in src/usiblender.c! */ diff --git a/source/blender/makesdna/DNA_image_types.h b/source/blender/makesdna/DNA_image_types.h index bc94f807baa..d5e4b7a1142 100644 --- a/source/blender/makesdna/DNA_image_types.h +++ b/source/blender/makesdna/DNA_image_types.h @@ -58,7 +58,6 @@ typedef struct ImageUser { /* iuser->flag */ #define IMA_ANIM_ALWAYS 1 #define IMA_ANIM_REFRESHED 2 -#define IMA_DO_PREMUL 4 typedef struct Image { ID id; @@ -109,12 +108,7 @@ typedef struct Image { #define IMA_REFLECT 16 #define IMA_NOCOLLECT 32 #define IMA_ANTIALI 64 - -/*used to be IMA_DO_PREMUL. Note that - in theory, in should be possible - to use this flag position if necassary, - since this is only used in do_versions.*/ -#define IMA_OLDFLAG 128 +#define IMA_DO_PREMUL 128 /* tpageflag */ #define IMA_TILES 1 diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_image.c b/source/blender/nodes/intern/CMP_nodes/CMP_image.c index 5df649d6808..6a82e8a9254 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_image.c +++ b/source/blender/nodes/intern/CMP_nodes/CMP_image.c @@ -58,7 +58,7 @@ static bNodeSocketType cmp_node_rlayers_out[]= { static CompBuf *node_composit_get_image(RenderData *rd, Image *ima, ImageUser *iuser) { ImBuf *ibuf; - CompBuf *stackbuf, *old; + CompBuf *stackbuf; int type; ibuf= BKE_image_get_ibuf(ima, iuser); @@ -79,11 +79,10 @@ static CompBuf *node_composit_get_image(RenderData *rd, Image *ima, ImageUser *i stackbuf->rect= ibuf->rect_float; } - old = stackbuf; - stackbuf = dupalloc_compbuf(stackbuf); - free_compbuf(old); - - if (type==CB_RGBA && iuser && (iuser->flag & IMA_DO_PREMUL)) { + /*code to respect the premul flag of images; I'm + not sure if this is a good idea for multilayer images, + since it never worked before for them. + if (type==CB_RGBA && ima->flag & IMA_DO_PREMUL) { //premul the image int i; float *pixel = stackbuf->rect; @@ -94,7 +93,7 @@ static CompBuf *node_composit_get_image(RenderData *rd, Image *ima, ImageUser *i pixel[2] *= pixel[3]; } } - + */ return stackbuf; }; @@ -203,6 +202,25 @@ static void node_composit_exec_image(void *data, bNode *node, bNodeStack **in, b else { stackbuf= node_composit_get_image(rd, ima, iuser); + /*respect image premul option*/ + if (stackbuf->type==CB_RGBA && ima->flag & IMA_DO_PREMUL) { + int i; + float *pixel; + + /*first duplicate stackbuf->rect, since it's just a pointer + to the source imbuf, and we don't want to change that.*/ + stackbuf->rect = MEM_dupallocN(stackbuf->rect); + + /*premul the image*/ + + pixel = stackbuf->rect; + for (i=0; i<stackbuf->x*stackbuf->y; i++, pixel += 4) { + pixel[0] *= pixel[3]; + pixel[1] *= pixel[3]; + pixel[2] *= pixel[3]; + } + } + /* put image on stack */ out[0]->data= stackbuf; diff --git a/source/blender/render/intern/source/texture.c b/source/blender/render/intern/source/texture.c index b77e30a777f..831fe5dcc0b 100644 --- a/source/blender/render/intern/source/texture.c +++ b/source/blender/render/intern/source/texture.c @@ -1138,13 +1138,6 @@ static int multitex(Tex *tex, float *texvec, float *dxt, float *dyt, int osatex, if(osatex) retval= imagewraposa(tex, tex->ima, NULL, texvec, dxt, dyt, texres); else retval= imagewrap(tex, tex->ima, NULL, texvec, texres); tag_image_time(tex->ima); /* tag image as having being used */ - - /*do premul if necassary*/ - if (tex->iuser.flag & IMA_DO_PREMUL) { - texres->tr *= texres->ta; - texres->tg *= texres->ta; - texres->tb *= texres->ta; - } break; case TEX_PLUGIN: retval= plugintex(tex, texvec, dxt, dyt, osatex, texres); diff --git a/source/blender/src/buttons_shading.c b/source/blender/src/buttons_shading.c index 7945b6bacd3..0325128daa2 100644 --- a/source/blender/src/buttons_shading.c +++ b/source/blender/src/buttons_shading.c @@ -1181,7 +1181,7 @@ void uiblock_image_panel(uiBlock *block, Image **ima_pp, ImageUser *iuser, uiBlockSetFunc(block, image_reload_cb, ima, iuser); uiDefButBitS(block, TOG, IMA_ANTIALI, B_NOP, "Anti", 10, 50, 45, 20, &ima->flag, 0, 0, 0, 0, "Toggles Image anti-aliasing, only works with solid colors"); - uiDefButBitS(block, TOG, IMA_DO_PREMUL, imagechanged, "Premul", 55, 50, 65, 20, &iuser->flag, 0, 0, 0, 0, "Toggles whether to premultiply the image at render/composite time."); + uiDefButBitS(block, TOG, IMA_DO_PREMUL, imagechanged, "Premul", 55, 50, 65, 20, &ima->flag, 0, 0, 0, 0, "Toggles premultiplying alpha"); uiBlockEndAlign(block); if( ELEM(ima->source, IMA_SRC_MOVIE, IMA_SRC_SEQUENCE)) { @@ -2560,7 +2560,7 @@ static void lamp_panel_spot(Object *ob, Lamp *la) tip= "Irregular buffer produces sharp shadow always, but it doesn't show up for raytracing"; else if(la->buftype==LA_SHADBUF_HALFWAY) tip= "Regular buffer, averaging the closest and 2nd closest Z value for reducing biasing"; - + uiDefButC(block, MENU, B_REDR, "Classical %x0|Classic-Halfway %x2|Irregular %x1", 10,140,80,19,&la->buftype, 0, 0, 0, 0, tip); } } @@ -2656,6 +2656,7 @@ static void lamp_panel_spot(Object *ob, Lamp *la) } } + } else uiDefBut(block, LABEL,0," ", 100,180,200,19,NULL, 0, 0, 0, 0, ""); diff --git a/source/blender/src/drawimage.c b/source/blender/src/drawimage.c index 3db93cdba02..da00e644a6b 100644 --- a/source/blender/src/drawimage.c +++ b/source/blender/src/drawimage.c @@ -2058,11 +2058,7 @@ void drawimagespace(ScrArea *sa, void *spacedata) if(sima->flag & SI_USE_ALPHA) { sima_draw_alpha_backdrop(sima, x1_rep, y1_rep, ibuf->x*xuser_asp, ibuf->y*yuser_asp); glEnable(GL_BLEND); - /*use key alpha if the IMA_DO_PREMUL option is set.*/ - if (sima->iuser.flag & IMA_DO_PREMUL) - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - else - glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); + glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); } /* detect if we need to redo the curve map. diff --git a/source/blender/src/drawnode.c b/source/blender/src/drawnode.c index 5b4975401b3..54475eb362e 100644 --- a/source/blender/src/drawnode.c +++ b/source/blender/src/drawnode.c @@ -938,7 +938,7 @@ static void image_layer_cb(void *ima_v, void *iuser_v) { ntreeCompositForceHidden(G.scene->nodetree); - BKE_image_multilayer_index(BKE_image_get_renderresult(ima_v), iuser_v); + BKE_image_multilayer_index(ima_v, iuser_v); allqueue(REDRAWNODE, 0); } @@ -995,11 +995,6 @@ static int node_composit_buts_image(uiBlock *block, bNodeTree *ntree, bNode *nod uiButSetFunc(bt, node_image_type_cb, node, ima); MEM_freeN(strp); - if (iuser) { - dy -= 19; - uiDefButBitS(block, TOG, IMA_DO_PREMUL, B_NODE_EXEC+node->nr, "Premul", xmin, dy, xmax-xmin, 20, &iuser->flag, 0, 0, 0, 0, "Toggles whether to premultiply the image at render/composite time."); - } - if( ELEM(ima->source, IMA_SRC_MOVIE, IMA_SRC_SEQUENCE) ) { width= (xmax-xmin)/2; @@ -1039,7 +1034,7 @@ static int node_composit_buts_image(uiBlock *block, bNodeTree *ntree, bNode *nod } if(node->id) { Image *ima= (Image *)node->id; - int retval= 19*2; + int retval= 19; /* for each draw we test for anim refresh event */ if(iuser->flag & IMA_ANIM_REFRESHED) { |