diff options
-rw-r--r-- | source/blender/blenkernel/BKE_blender.h | 2 | ||||
-rw-r--r-- | source/blender/blenloader/intern/readfile.c | 52 | ||||
-rw-r--r-- | source/blender/makesdna/DNA_image_types.h | 8 | ||||
-rw-r--r-- | source/blender/nodes/intern/CMP_nodes/CMP_image.c | 34 | ||||
-rw-r--r-- | source/blender/render/intern/source/texture.c | 2 | ||||
-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, 81 insertions, 37 deletions
diff --git a/source/blender/blenkernel/BKE_blender.h b/source/blender/blenkernel/BKE_blender.h index 6c3ff3f3467..d81eb4d5103 100644 --- a/source/blender/blenkernel/BKE_blender.h +++ b/source/blender/blenkernel/BKE_blender.h @@ -44,7 +44,7 @@ struct ListBase; struct MemFile; #define BLENDER_VERSION 245 -#define BLENDER_SUBVERSION 14 +#define BLENDER_SUBVERSION 15 #define BLENDER_MINVERSION 240 #define BLENDER_MINSUBVERSION 0 diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index 3207bed2139..3019d175689 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -2419,6 +2419,7 @@ 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); @@ -7450,7 +7451,56 @@ 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->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 && *(short*)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 && *(short*)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 d5e4b7a1142..bc94f807baa 100644 --- a/source/blender/makesdna/DNA_image_types.h +++ b/source/blender/makesdna/DNA_image_types.h @@ -58,6 +58,7 @@ 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; @@ -108,7 +109,12 @@ typedef struct Image { #define IMA_REFLECT 16 #define IMA_NOCOLLECT 32 #define IMA_ANTIALI 64 -#define IMA_DO_PREMUL 128 + +/*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 /* 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 06c3b90e828..5df649d6808 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; + CompBuf *stackbuf, *old; int type; ibuf= BKE_image_get_ibuf(ima, iuser); @@ -79,10 +79,11 @@ static CompBuf *node_composit_get_image(RenderData *rd, Image *ima, ImageUser *i stackbuf->rect= ibuf->rect_float; } - /*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) { + old = stackbuf; + stackbuf = dupalloc_compbuf(stackbuf); + free_compbuf(old); + + if (type==CB_RGBA && iuser && (iuser->flag & IMA_DO_PREMUL)) { //premul the image int i; float *pixel = stackbuf->rect; @@ -93,7 +94,7 @@ static CompBuf *node_composit_get_image(RenderData *rd, Image *ima, ImageUser *i pixel[2] *= pixel[3]; } } - */ + return stackbuf; }; @@ -202,27 +203,6 @@ 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); - - /*flag that we can free the buffer.*/ - stackbuf->malloc = 1; - - /*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 5de1757b56d..4fc79a942a6 100644 --- a/source/blender/render/intern/source/texture.c +++ b/source/blender/render/intern/source/texture.c @@ -1140,7 +1140,7 @@ static int multitex(Tex *tex, float *texvec, float *dxt, float *dyt, int osatex, tag_image_time(tex->ima); /* tag image as having being used */ /*do premul if necassary*/ - if (tex->ima && tex->ima->flag & IMA_DO_PREMUL) { + if (tex->iuser.flag & IMA_DO_PREMUL) { texres->tr *= texres->ta; texres->tg *= texres->ta; texres->tb *= texres->ta; diff --git a/source/blender/src/buttons_shading.c b/source/blender/src/buttons_shading.c index 31f22e5cd80..d8f50395bba 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, &ima->flag, 0, 0, 0, 0, "Toggles premultiplying alpha"); + 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."); uiBlockEndAlign(block); if( ELEM(ima->source, IMA_SRC_MOVIE, IMA_SRC_SEQUENCE)) { @@ -2559,7 +2559,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); } } @@ -2655,7 +2655,6 @@ 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 824c9f5232c..0b3b98bde2d 100644 --- a/source/blender/src/drawimage.c +++ b/source/blender/src/drawimage.c @@ -2060,7 +2060,11 @@ void drawimagespace(ScrArea *sa, void *spacedata) if(sima->flag & SI_USE_ALPHA) { sima_draw_alpha_backdrop(sima, x1_rep, y1_rep, (float)ibuf->x, (float)ibuf->y); glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + /*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); } /* detect if we need to redo the curve map. diff --git a/source/blender/src/drawnode.c b/source/blender/src/drawnode.c index 54475eb362e..5b4975401b3 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(ima_v, iuser_v); + BKE_image_multilayer_index(BKE_image_get_renderresult(ima_v), iuser_v); allqueue(REDRAWNODE, 0); } @@ -995,6 +995,11 @@ 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; @@ -1034,7 +1039,7 @@ static int node_composit_buts_image(uiBlock *block, bNodeTree *ntree, bNode *nod } if(node->id) { Image *ima= (Image *)node->id; - int retval= 19; + int retval= 19*2; /* for each draw we test for anim refresh event */ if(iuser->flag & IMA_ANIM_REFRESHED) { |