diff options
author | Joseph Eagar <joeedh@gmail.com> | 2008-02-14 16:36:59 +0300 |
---|---|---|
committer | Joseph Eagar <joeedh@gmail.com> | 2008-02-14 16:36:59 +0300 |
commit | ac5d28a13c6db6837fd1f00cfecd9cef06e8d92a (patch) | |
tree | 769774a6344e0903daf3d076bb335a2c9c46839e /source | |
parent | 6907bcc79bff47d5b861305631d4f765d0778049 (diff) |
Added another 2 checks for if an image has the premul flag set, 1 in the image
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?
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/nodes/intern/CMP_nodes/CMP_image.c | 35 | ||||
-rw-r--r-- | source/blender/render/intern/source/texture.c | 8 |
2 files changed, 41 insertions, 2 deletions
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_image.c b/source/blender/nodes/intern/CMP_nodes/CMP_image.c index 0984aa4bfe1..659629457f8 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_image.c +++ b/source/blender/nodes/intern/CMP_nodes/CMP_image.c @@ -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; diff --git a/source/blender/render/intern/source/texture.c b/source/blender/render/intern/source/texture.c index 0a5f0126c9e..348ceac4566 100644 --- a/source/blender/render/intern/source/texture.c +++ b/source/blender/render/intern/source/texture.c @@ -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; |