Added another 2 checks for if an image has the premul flag set, 1 in the image
authorJoseph Eagar <joeedh@gmail.com>
Thu, 14 Feb 2008 13:36:59 +0000 (13:36 +0000)
committerJoseph Eagar <joeedh@gmail.com>
Thu, 14 Feb 2008 13:36:59 +0000 (13:36 +0000)
compositor node, another in render_realtime_texture.  Note that multilayer images
in the image compositor node do not respect the premul flag (though I did write
commented out code for it).

As far as I can tell, the premul option never worked for multilayer images in the
image node, so I'm a little nervous about making it work properly there.

ton, any comments?

source/blender/nodes/intern/CMP_nodes/CMP_image.c
source/blender/render/intern/source/texture.c

index 0984aa4bfe1de71bb2ddc6705ce8115962f1fe97..659629457f8b37f34ac202baa50b8e38b25bc1cf 100644 (file)
@@ -79,6 +79,21 @@ 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) {
+               //premul the image
+               int i;
+               float *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];
+               }
+       }
+       */
        return stackbuf;
 };
 
@@ -186,7 +201,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) {
+                       
+                               /*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*/
+                               int i;
+                               float *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;
                        
index 0a5f0126c9e6bb7474b30d4f30bc2578903e135c..348ceac456663aea8a24dd9595b43a4627ba692c 100644 (file)
@@ -2521,7 +2521,13 @@ void render_realtime_texture(ShadeInput *shi, Image *ima)
        
        if(shi->osatex) imagewraposa(tex, ima, NULL, texvec, dx, dy, &texr); 
        else imagewrap(tex, ima, NULL, texvec, &texr); 
-       
+
+       if (tex->ima && tex->ima->flag & IMA_DO_PREMUL) {
+               texr.tr *= texr.ta;
+               texr.tg *= texr.ta;
+               texr.tb *= texr.ta;
+       }
+               
        shi->vcol[0]*= texr.tr;
        shi->vcol[1]*= texr.tg;
        shi->vcol[2]*= texr.tb;