diff options
74 files changed, 4 insertions, 11241 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 96f2df316cd..59dbeaed36b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -135,7 +135,6 @@ option(WITH_GAMEENGINE "Enable Game Engine" ON) option(WITH_PLAYER "Build Player" OFF) option(WITH_OPENCOLORIO "Enable OpenColorIO color management" ON) option(WITH_COMPOSITOR "Enable the tile based nodal compositor" ON) -option(WITH_COMPOSITOR_LEGACY "Enable legacy compositor" OFF) # GHOST Windowing Library Options option(WITH_GHOST_DEBUG "Enable debugging output for the GHOST library" OFF) diff --git a/build_files/scons/tools/btools.py b/build_files/scons/tools/btools.py index 22360447343..ee6dd20ecc0 100644 --- a/build_files/scons/tools/btools.py +++ b/build_files/scons/tools/btools.py @@ -108,7 +108,7 @@ def validate_arguments(args, bc): 'WITH_BF_STATICFFMPEG', 'BF_FFMPEG_LIB_STATIC', 'WITH_BF_OGG', 'BF_OGG', 'BF_OGG_LIB', 'WITH_BF_FRAMESERVER', - 'WITH_BF_COMPOSITOR', 'WITH_BF_COMPOSITOR_LEGACY', + 'WITH_BF_COMPOSITOR', 'WITH_BF_JPEG', 'BF_JPEG', 'BF_JPEG_INC', 'BF_JPEG_LIB', 'BF_JPEG_LIBPATH', 'WITH_BF_STATICJPEG', 'BF_JPEG_LIB_STATIC', 'WITH_BF_OPENJPEG', 'BF_OPENJPEG', 'BF_OPENJPEG_INC', 'BF_OPENJPEG_LIB', 'BF_OPENJPEG_LIBPATH', 'WITH_BF_REDCODE', 'BF_REDCODE', 'BF_REDCODE_INC', 'BF_REDCODE_LIB', 'BF_REDCODE_LIBPATH', @@ -599,7 +599,6 @@ def read_opts(env, cfg, args): ('BF_BOOST_LIB_STATIC', 'Boost static library', ''), (BoolVariable('WITH_GHOST_XDND', 'Build with drag-n-drop support on Linux platforms using XDND protocol', True)), - (BoolVariable('WITH_BF_COMPOSITOR_LEGACY', 'Enable the legacy compositor', False)), (BoolVariable('WITH_BF_CYCLES_OSL', 'Build with OSL sypport in Cycles', False)), (BoolVariable('WITH_BF_STATICOSL', 'Staticly link to OSL', False)), diff --git a/source/blender/nodes/CMakeLists.txt b/source/blender/nodes/CMakeLists.txt index a7b491cf42b..12842085189 100644 --- a/source/blender/nodes/CMakeLists.txt +++ b/source/blender/nodes/CMakeLists.txt @@ -123,6 +123,7 @@ set(SRC composite/nodes/node_composite_pixelate.c composite/node_composite_tree.c + composite/node_composite_util.h shader/nodes/node_shader_camera.c shader/nodes/node_shader_common.c @@ -235,13 +236,6 @@ set(SRC intern/node_common.h ) -if(WITH_COMPOSITOR_LEGACY) - list(APPEND SRC - composite/node_composite_util.h - composite/node_composite_util.c - ) -endif() - if(WITH_PYTHON) list(APPEND INC ../python @@ -267,8 +261,4 @@ if(WITH_COMPOSITOR) add_definitions(-DWITH_COMPOSITOR) endif() -if(WITH_COMPOSITOR_LEGACY) - add_definitions(-DWITH_COMPOSITOR_LEGACY) -endif() - blender_add_lib(bf_nodes "${SRC}" "${INC}" "${INC_SYS}") diff --git a/source/blender/nodes/SConscript b/source/blender/nodes/SConscript index cc735902934..9f56689bf43 100644 --- a/source/blender/nodes/SConscript +++ b/source/blender/nodes/SConscript @@ -66,9 +66,6 @@ if env['WITH_BF_COMPOSITOR']: incs += ' ../compositor ' defs.append("WITH_COMPOSITOR") -if env['WITH_BF_COMPOSITOR_LEGACY']: - defs.append("WITH_COMPOSITOR_LEGACY") - env.BlenderLib ( libname = 'bf_nodes', sources = sources, includes = Split(incs), defines = defs, libtype=['core','player'], priority = [190,105] ) env.BlenderLib ( libname = 'bf_cmpnodes', sources = cmpsources, includes = Split(incs), defines = defs, libtype=['core','player'], priority = [175,101] ) env.BlenderLib ( libname = 'bf_shdnodes', sources = shdsources, includes = Split(incs), defines = defs, libtype=['core','player'], priority = [175,101] ) diff --git a/source/blender/nodes/composite/node_composite_tree.c b/source/blender/nodes/composite/node_composite_tree.c index 03462738d58..7004b722bc9 100644 --- a/source/blender/nodes/composite/node_composite_tree.c +++ b/source/blender/nodes/composite/node_composite_tree.c @@ -95,9 +95,6 @@ static void free_node_cache(bNodeTree *UNUSED(ntree), bNode *node) for (sock= node->outputs.first; sock; sock= sock->next) { if (sock->cache) { -#ifdef WITH_COMPOSITOR_LEGACY - free_compbuf(sock->cache); -#endif sock->cache= NULL; } } @@ -161,9 +158,6 @@ static void localize(bNodeTree *localtree, bNodeTree *ntree) for (sock= node->outputs.first; sock; sock= sock->next) { sock->new_sock->cache= sock->cache; -#ifdef WITH_COMPOSITOR_LEGACY - compbuf_set_node(sock->new_sock->cache, node->new_node); -#endif sock->cache= NULL; sock->new_sock->new_sock= sock; } @@ -239,9 +233,6 @@ static void local_merge(bNodeTree *localtree, bNodeTree *ntree) for (lsock= lnode->outputs.first; lsock; lsock= lsock->next) { if (ntreeOutputExists(lnode->new_node, lsock->new_sock)) { lsock->new_sock->cache= lsock->cache; -#ifdef WITH_COMPOSITOR_LEGACY - compbuf_set_node(lsock->new_sock->cache, lnode->new_node); -#endif lsock->cache= NULL; lsock->new_sock= NULL; } @@ -363,335 +354,6 @@ void ntreeCompositEndExecTree(bNodeTreeExec *exec, int use_tree_data) } } -#ifdef WITH_COMPOSITOR -#ifdef WITH_COMPOSITOR_LEGACY - -/* ***************************** threaded version for execute composite nodes ************* */ -/* these are nodes without input, only giving values */ -/* or nodes with only value inputs */ -static int node_only_value(bNode *node) -{ - bNodeSocket *sock; - - if (ELEM3(node->type, CMP_NODE_TIME, CMP_NODE_VALUE, CMP_NODE_RGB)) - return 1; - - /* doing this for all node types goes wrong. memory free errors */ - if (node->inputs.first && node->type==CMP_NODE_MAP_VALUE) { - int retval= 1; - for (sock= node->inputs.first; sock; sock= sock->next) { - if (sock->link) - retval &= node_only_value(sock->link->fromnode); - } - return retval; - } - return 0; -} - -/* not changing info, for thread callback */ -typedef struct ThreadData { - bNodeStack *stack; - RenderData *rd; -} ThreadData; - -static void *exec_composite_node(void *nodeexec_v) -{ - bNodeStack *nsin[MAX_SOCKET]; /* arbitrary... watch this */ - bNodeStack *nsout[MAX_SOCKET]; /* arbitrary... watch this */ - bNodeExec *nodeexec= nodeexec_v; - bNode *node= nodeexec->node; - ThreadData *thd= (ThreadData *)node->threaddata; - - node_get_stack(node, thd->stack, nsin, nsout); - - if (node->typeinfo->execfunc) - node->typeinfo->execfunc(thd->rd, node, nsin, nsout); - else if (node->typeinfo->newexecfunc) - node->typeinfo->newexecfunc(thd->rd, 0, node, nodeexec->data, nsin, nsout); - - node->exec |= NODE_READY; - return NULL; -} - -/* return total of executable nodes, for timecursor */ -static int setExecutableNodes(bNodeTreeExec *exec, ThreadData *thd) -{ - bNodeTree *ntree = exec->nodetree; - bNodeStack *nsin[MAX_SOCKET]; /* arbitrary... watch this */ - bNodeStack *nsout[MAX_SOCKET]; /* arbitrary... watch this */ - bNodeExec *nodeexec; - bNode *node; - bNodeSocket *sock; - int n, totnode= 0, group_edit= 0; - - /* if we are in group edit, viewer nodes get skipped when group has viewer */ - for (node= ntree->nodes.first; node; node= node->next) - if (node->type==NODE_GROUP && (node->flag & NODE_GROUP_EDIT)) - if (ntreeHasType((bNodeTree *)node->id, CMP_NODE_VIEWER)) - group_edit= 1; - - /* NB: using the exec data list here to have valid dependency sort */ - for (n=0, nodeexec=exec->nodeexec; n < exec->totnodes; ++n, ++nodeexec) { - int a; - node = nodeexec->node; - - node_get_stack(node, exec->stack, nsin, nsout); - - /* test the outputs */ - /* skip value-only nodes (should be in type!) */ - if (!node_only_value(node)) { - for (a=0, sock= node->outputs.first; sock; sock= sock->next, a++) { - if (nsout[a]->data==NULL && nsout[a]->hasoutput) { - node->need_exec= 1; - break; - } - } - } - - /* test the inputs */ - for (a=0, sock= node->inputs.first; sock; sock= sock->next, a++) { - /* skip viewer nodes in bg render or group edit */ - if ( ELEM(node->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER) && (G.background || group_edit)) - node->need_exec= 0; - /* is sock in use? */ - else if (sock->link) { - bNodeLink *link= sock->link; - - /* this is the test for a cyclic case */ - if (link->fromnode==NULL || link->tonode==NULL); - else if (link->fromnode->level >= link->tonode->level && link->tonode->level!=0xFFF) { - if (link->fromnode->need_exec) { - node->need_exec= 1; - break; - } - } - else { - node->need_exec= 0; - printf("Node %s skipped, cyclic dependency\n", node->name); - } - } - } - - if (node->need_exec) { - - /* free output buffers */ - for (a=0, sock= node->outputs.first; sock; sock= sock->next, a++) { - if (nsout[a]->data) { - free_compbuf(nsout[a]->data); - nsout[a]->data= NULL; - } - } - totnode++; - /* printf("node needs exec %s\n", node->name); */ - - /* tag for getExecutableNode() */ - node->exec= 0; - } - else { - /* tag for getExecutableNode() */ - node->exec= NODE_READY|NODE_FINISHED|NODE_SKIPPED; - - } - } - - /* last step: set the stack values for only-value nodes */ - /* just does all now, compared to a full buffer exec this is nothing */ - if (totnode) { - for (n=0, nodeexec=exec->nodeexec; n < exec->totnodes; ++n, ++nodeexec) { - node = nodeexec->node; - if (node->need_exec==0 && node_only_value(node)) { - if (node->typeinfo->execfunc) { - node_get_stack(node, exec->stack, nsin, nsout); - node->typeinfo->execfunc(thd->rd, node, nsin, nsout); - } - } - } - } - - return totnode; -} - -/* while executing tree, free buffers from nodes that are not needed anymore */ -static void freeExecutableNode(bNodeTreeExec *exec) -{ - /* node outputs can be freed when: - * - not a render result or image node - * - when node outputs go to nodes all being set NODE_FINISHED - */ - bNodeTree *ntree = exec->nodetree; - bNodeExec *nodeexec; - bNode *node; - bNodeSocket *sock; - int n; - - /* set exec flag for finished nodes that might need freed */ - for (node= ntree->nodes.first; node; node= node->next) { - if (node->type!=CMP_NODE_R_LAYERS) - if (node->exec & NODE_FINISHED) - node->exec |= NODE_FREEBUFS; - } - /* clear this flag for input links that are not done yet. - * Using the exec data for valid dependency sort. - */ - for (n=0, nodeexec=exec->nodeexec; n < exec->totnodes; ++n, ++nodeexec) { - node = nodeexec->node; - if ((node->exec & NODE_FINISHED)==0) { - for (sock= node->inputs.first; sock; sock= sock->next) - if (sock->link) - sock->link->fromnode->exec &= ~NODE_FREEBUFS; - } - } - /* now we can free buffers */ - for (node= ntree->nodes.first; node; node= node->next) { - if (node->exec & NODE_FREEBUFS) { - for (sock= node->outputs.first; sock; sock= sock->next) { - bNodeStack *ns= node_get_socket_stack(exec->stack, sock); - if (ns && ns->data) { - free_compbuf(ns->data); - ns->data= NULL; - // printf("freed buf node %s\n", node->name); - } - } - } - } -} - -static bNodeExec *getExecutableNode(bNodeTreeExec *exec) -{ - bNodeExec *nodeexec; - bNodeSocket *sock; - int n; - - for (n=0, nodeexec=exec->nodeexec; n < exec->totnodes; ++n, ++nodeexec) { - if (nodeexec->node->exec==0) { - /* input sockets should be ready */ - for (sock= nodeexec->node->inputs.first; sock; sock= sock->next) { - if (sock->link && sock->link->fromnode) - if ((sock->link->fromnode->exec & NODE_READY)==0) - break; - } - if (sock==NULL) - return nodeexec; - } - } - return NULL; -} - -/* check if texture nodes need exec or end */ -static void ntree_composite_texnode(bNodeTree *ntree, int init) -{ - bNode *node; - - for (node= ntree->nodes.first; node; node= node->next) { - if (node->type==CMP_NODE_TEXTURE && node->id) { - Tex *tex= (Tex *)node->id; - if (tex->nodetree && tex->use_nodes) { - /* has internal flag to detect it only does it once */ - if (init) { - if (!tex->nodetree->execdata) - tex->nodetree->execdata = ntreeTexBeginExecTree(tex->nodetree, 1); - } - else - ntreeTexEndExecTree(tex->nodetree->execdata, 1); - tex->nodetree->execdata = NULL; - } - } - } - -} - -/* optimized tree execute test for compositing */ -static void ntreeCompositExecTreeOld(bNodeTree *ntree, RenderData *rd, int do_preview) -{ - bNodeExec *nodeexec; - bNode *node; - ListBase threads; - ThreadData thdata; - int totnode, curnode, rendering = TRUE, n; - bNodeTreeExec *exec = ntree->execdata; - - if (do_preview) - ntreeInitPreview(ntree, 0, 0); - - if (!ntree->execdata) { - /* XXX this is the top-level tree, so we use the ntree->execdata pointer. */ - exec = ntreeCompositBeginExecTree(ntree, 1); - } - ntree_composite_texnode(ntree, 1); - - /* prevent unlucky accidents */ - if (G.background) - rd->scemode &= ~R_COMP_CROP; - - /* setup callerdata for thread callback */ - thdata.rd= rd; - thdata.stack= exec->stack; - - /* fixed seed, for example noise texture */ - BLI_srandom(rd->cfra); - - /* sets need_exec tags in nodes */ - curnode = totnode= setExecutableNodes(exec, &thdata); - - BLI_init_threads(&threads, exec_composite_node, rd->threads); - - while (rendering) { - - if (BLI_available_threads(&threads)) { - nodeexec= getExecutableNode(exec); - if (nodeexec) { - node = nodeexec->node; - if (ntree->progress && totnode) - ntree->progress(ntree->prh, (1.0f - curnode/(float)totnode)); - if (ntree->stats_draw) { - char str[128]; - BLI_snprintf(str, sizeof(str), "Compositing %d %s", curnode, node->name); - ntree->stats_draw(ntree->sdh, str); - } - curnode--; - - node->threaddata = &thdata; - node->exec= NODE_PROCESSING; - BLI_insert_thread(&threads, nodeexec); - } - else - PIL_sleep_ms(50); - } - else - PIL_sleep_ms(50); - - rendering= 0; - /* test for ESC */ - if (ntree->test_break && ntree->test_break(ntree->tbh)) { - for (node= ntree->nodes.first; node; node= node->next) - node->exec |= NODE_READY; - } - - /* check for ready ones, and if we need to continue */ - for (n=0, nodeexec=exec->nodeexec; n < exec->totnodes; ++n, ++nodeexec) { - node = nodeexec->node; - if (node->exec & NODE_READY) { - if ((node->exec & NODE_FINISHED)==0) { - BLI_remove_thread(&threads, nodeexec); /* this waits for running thread to finish btw */ - node->exec |= NODE_FINISHED; - - /* freeing unused buffers */ - if (rd->scemode & R_COMP_FREE) - freeExecutableNode(exec); - } - } - else rendering= 1; - } - } - - BLI_end_threads(&threads); - - /* XXX top-level tree uses the ntree->execdata pointer */ - ntreeCompositEndExecTree(exec, 1); -} -#endif /* WITH_COMPOSITOR_LEGACY */ -#endif /* WITH_COMPOSITOR */ - void *COM_linker_hack = NULL; void ntreeCompositExecTree(bNodeTree *ntree, RenderData *rd, int rendering, int do_preview, @@ -699,16 +361,7 @@ void ntreeCompositExecTree(bNodeTree *ntree, RenderData *rd, int rendering, int const ColorManagedDisplaySettings *display_settings) { #ifdef WITH_COMPOSITOR -#ifdef WITH_COMPOSITOR_LEGACY - if (G.debug_value == 200) - { - ntreeCompositExecTreeOld(ntree, rd, do_preview); - } - else -#endif - { - COM_execute(rd, ntree, rendering, view_settings, display_settings); - } + COM_execute(rd, ntree, rendering, view_settings, display_settings); #else (void)ntree, (void)rd, (void)rendering, (void)do_preview; (void)view_settings, (void)display_settings; diff --git a/source/blender/nodes/composite/node_composite_util.c b/source/blender/nodes/composite/node_composite_util.c deleted file mode 100644 index c4b48b83b16..00000000000 --- a/source/blender/nodes/composite/node_composite_util.c +++ /dev/null @@ -1,1412 +0,0 @@ -/* - * ***** BEGIN GPL LICENSE BLOCK ***** - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * The Original Code is Copyright (C) 2006 Blender Foundation. - * All rights reserved. - * - * The Original Code is: all of this file. - * - * Contributor(s): none yet. - * - * ***** END GPL LICENSE BLOCK ***** - */ - -/** \file blender/nodes/composite/node_composite_util.c - * \ingroup nodes - */ - -#include "node_composite_util.h" - -#ifdef WITH_COMPOSITOR_LEGACY - -#include <limits.h> - -CompBuf *alloc_compbuf(int sizex, int sizey, int type, int alloc) -{ - CompBuf *cbuf= MEM_callocN(sizeof(CompBuf), "compbuf"); - - cbuf->x= sizex; - cbuf->y= sizey; - cbuf->xrad= sizex/2; - cbuf->yrad= sizey/2; - - cbuf->type= type; - if (alloc) { - if (cbuf->type==CB_RGBA) - cbuf->rect= MEM_mapallocN(4*sizeof(float)*sizex*sizey, "compbuf RGBA rect"); - else if (cbuf->type==CB_VEC3) - cbuf->rect= MEM_mapallocN(3*sizeof(float)*sizex*sizey, "compbuf Vector3 rect"); - else if (cbuf->type==CB_VEC2) - cbuf->rect= MEM_mapallocN(2*sizeof(float)*sizex*sizey, "compbuf Vector2 rect"); - else - cbuf->rect= MEM_mapallocN(sizeof(float)*sizex*sizey, "compbuf Fac rect"); - cbuf->malloc= 1; - } - cbuf->disprect.xmin = 0; - cbuf->disprect.ymin = 0; - cbuf->disprect.xmax = sizex; - cbuf->disprect.ymax = sizey; - - return cbuf; -} - -CompBuf *dupalloc_compbuf(CompBuf *cbuf) -{ - CompBuf *dupbuf= alloc_compbuf(cbuf->x, cbuf->y, cbuf->type, 1); - if (dupbuf) { - memcpy(dupbuf->rect, cbuf->rect, cbuf->type*sizeof(float)*cbuf->x*cbuf->y); - - dupbuf->xof= cbuf->xof; - dupbuf->yof= cbuf->yof; - } - return dupbuf; -} - -/* instead of reference counting, we create a list */ -CompBuf *pass_on_compbuf(CompBuf *cbuf) -{ - CompBuf *dupbuf= (cbuf)? alloc_compbuf(cbuf->x, cbuf->y, cbuf->type, 0): NULL; - CompBuf *lastbuf; - - if (dupbuf) { - dupbuf->rect= cbuf->rect; - dupbuf->xof= cbuf->xof; - dupbuf->yof= cbuf->yof; - dupbuf->malloc= 0; - - /* get last buffer in list, and append dupbuf */ - for (lastbuf= cbuf; lastbuf; lastbuf= lastbuf->next) - if (lastbuf->next==NULL) - break; - lastbuf->next= dupbuf; - dupbuf->prev= lastbuf; - } - return dupbuf; -} - - -void free_compbuf(CompBuf *cbuf) -{ - /* check referencing, then remove from list and set malloc tag */ - if (cbuf->prev || cbuf->next) { - if (cbuf->prev) - cbuf->prev->next= cbuf->next; - if (cbuf->next) - cbuf->next->prev= cbuf->prev; - if (cbuf->malloc) { - if (cbuf->prev) - cbuf->prev->malloc= 1; - else - cbuf->next->malloc= 1; - cbuf->malloc= 0; - } - } - - if (cbuf->malloc && cbuf->rect) - MEM_freeN(cbuf->rect); - - MEM_freeN(cbuf); -} - -void print_compbuf(char *str, CompBuf *cbuf) -{ - printf("Compbuf %s %d %d %p\n", str, cbuf->x, cbuf->y, (void *)cbuf->rect); - -} - -void compbuf_set_node(CompBuf *cbuf, bNode *node) -{ - if (cbuf) cbuf->node = node; -} - - -CompBuf *get_cropped_compbuf(rcti *drect, float *rectf, int rectx, int recty, int type) -{ - CompBuf *cbuf; - rcti disprect= *drect; - float *outfp; - int dx, y; - - if (disprect.xmax>rectx) disprect.xmax = rectx; - if (disprect.ymax>recty) disprect.ymax = recty; - if (disprect.xmin>= disprect.xmax) return NULL; - if (disprect.ymin>= disprect.ymax) return NULL; - - cbuf= alloc_compbuf(BLI_rcti_size_x(&disprect), BLI_rcti_size_y(&disprect), type, 1); - outfp= cbuf->rect; - rectf += type*(disprect.ymin*rectx + disprect.xmin); - dx= type*cbuf->x; - for (y=cbuf->y; y>0; y--, outfp+=dx, rectf+=type*rectx) - memcpy(outfp, rectf, sizeof(float)*dx); - - return cbuf; -} - -CompBuf *scalefast_compbuf(CompBuf *inbuf, int newx, int newy) -{ - CompBuf *outbuf; - float *rectf, *newrectf, *rf; - int x, y, c, pixsize= inbuf->type; - int ofsx, ofsy, stepx, stepy; - - if (inbuf->x==newx && inbuf->y==newy) - return dupalloc_compbuf(inbuf); - - outbuf= alloc_compbuf(newx, newy, inbuf->type, 1); - newrectf= outbuf->rect; - - stepx = (65536.0 * (inbuf->x - 1.0) / (newx - 1.0)) + 0.5; - stepy = (65536.0 * (inbuf->y - 1.0) / (newy - 1.0)) + 0.5; - ofsy = 32768; - - for (y = newy; y > 0 ; y--) { - rectf = inbuf->rect; - rectf += pixsize * (ofsy >> 16) * inbuf->x; - - ofsy += stepy; - ofsx = 32768; - - for (x = newx ; x>0 ; x--) { - - rf= rectf + pixsize*(ofsx >> 16); - for (c=0; c<pixsize; c++) - newrectf[c] = rf[c]; - - newrectf+= pixsize; - - ofsx += stepx; - } - } - - return outbuf; -} - -void typecheck_compbuf_color(float *out, float *in, int outtype, int intype) -{ - if (intype == outtype) { - memcpy(out, in, sizeof(float)*outtype); - } - else if (outtype==CB_VAL) { - if (intype==CB_VEC2) { - *out= 0.5f*(in[0]+in[1]); - } - else if (intype==CB_VEC3) { - *out= 0.333333f*(in[0]+in[1]+in[2]); - } - else if (intype==CB_RGBA) { - *out = rgb_to_bw(in); - } - } - else if (outtype==CB_VEC2) { - if (intype==CB_VAL) { - out[0] = in[0]; - out[1] = in[0]; - } - else if (intype==CB_VEC3) { - out[0] = in[0]; - out[1] = in[1]; - } - else if (intype==CB_RGBA) { - out[0] = in[0]; - out[1] = in[1]; - } - } - else if (outtype==CB_VEC3) { - if (intype==CB_VAL) { - out[0] = in[0]; - out[1] = in[0]; - out[2] = in[0]; - } - else if (intype==CB_VEC2) { - out[0] = in[0]; - out[1] = in[1]; - out[2] = 0.0f; - } - else if (intype==CB_RGBA) { - out[0] = in[0]; - out[1] = in[1]; - out[2] = in[2]; - } - } - else if (outtype==CB_RGBA) { - if (intype==CB_VAL) { - out[0] = in[0]; - out[1] = in[0]; - out[2] = in[0]; - out[3] = 1.0f; - } - else if (intype==CB_VEC2) { - out[0] = in[0]; - out[1] = in[1]; - out[2] = 0.0f; - out[3] = 1.0f; - } - else if (intype==CB_VEC3) { - out[0] = in[0]; - out[1] = in[1]; - out[2] = in[2]; - out[3] = 1.0f; - } - } -} - -CompBuf *typecheck_compbuf(CompBuf *inbuf, int type) -{ - if (inbuf && inbuf->type!=type) { - CompBuf *outbuf; - float *inrf, *outrf; - int x; - - outbuf= alloc_compbuf(inbuf->x, inbuf->y, type, 1); - - /* warning note: xof and yof are applied in pixelprocessor, but should be copied otherwise? */ - outbuf->xof= inbuf->xof; - outbuf->yof= inbuf->yof; - - if (inbuf->rect_procedural) { - outbuf->rect_procedural= inbuf->rect_procedural; - copy_v3_v3(outbuf->procedural_size, inbuf->procedural_size); - copy_v3_v3(outbuf->procedural_offset, inbuf->procedural_offset); - outbuf->procedural_type= inbuf->procedural_type; - outbuf->node= inbuf->node; - return outbuf; - } - - inrf= inbuf->rect; - outrf= outbuf->rect; - x= inbuf->x*inbuf->y; - - if (type==CB_VAL) { - if (inbuf->type==CB_VEC2) { - for (; x>0; x--, outrf+= 1, inrf+= 2) - *outrf= 0.5f*(inrf[0]+inrf[1]); - } - else if (inbuf->type==CB_VEC3) { - for (; x>0; x--, outrf+= 1, inrf+= 3) - *outrf= 0.333333f*(inrf[0]+inrf[1]+inrf[2]); - } - else if (inbuf->type==CB_RGBA) { - for (; x>0; x--, outrf+= 1, inrf+= 4) - *outrf = rgb_to_bw(inrf); - } - } - else if (type==CB_VEC2) { - if (inbuf->type==CB_VAL) { - for (; x>0; x--, outrf+= 2, inrf+= 1) { - outrf[0] = inrf[0]; - outrf[1] = inrf[0]; - } - } - else if (inbuf->type==CB_VEC3) { - for (; x>0; x--, outrf+= 2, inrf+= 3) { - outrf[0] = inrf[0]; - outrf[1] = inrf[1]; - } - } - else if (inbuf->type==CB_RGBA) { - for (; x>0; x--, outrf+= 2, inrf+= 4) { - outrf[0] = inrf[0]; - outrf[1] = inrf[1]; - } - } - } - else if (type==CB_VEC3) { - if (inbuf->type==CB_VAL) { - for (; x>0; x--, outrf+= 3, inrf+= 1) { - outrf[0] = inrf[0]; - outrf[1] = inrf[0]; - outrf[2] = inrf[0]; - } - } - else if (inbuf->type==CB_VEC2) { - for (; x>0; x--, outrf+= 3, inrf+= 2) { - outrf[0] = inrf[0]; - outrf[1] = inrf[1]; - outrf[2] = 0.0f; - } - } - else if (inbuf->type==CB_RGBA) { - for (; x>0; x--, outrf+= 3, inrf+= 4) { - outrf[0] = inrf[0]; - outrf[1] = inrf[1]; - outrf[2] = inrf[2]; - } - } - } - else if (type==CB_RGBA) { - if (inbuf->type==CB_VAL) { - for (; x>0; x--, outrf+= 4, inrf+= 1) { - outrf[0] = inrf[0]; - outrf[1] = inrf[0]; - outrf[2] = inrf[0]; - outrf[3] = 1.0f; - } - } - else if (inbuf->type==CB_VEC2) { - for (; x>0; x--, outrf+= 4, inrf+= 2) { - outrf[0] = inrf[0]; - outrf[1] = inrf[1]; - outrf[2] = 0.0f; - outrf[3] = 1.0f; - } - } - else if (inbuf->type==CB_VEC3) { - for (; x>0; x--, outrf+= 4, inrf+= 3) { - outrf[0] = inrf[0]; - outrf[1] = inrf[1]; - outrf[2] = inrf[2]; - outrf[3] = 1.0f; - } - } - } - - return outbuf; - } - return inbuf; -} - -float *compbuf_get_pixel(CompBuf *cbuf, float *defcol, float *use, int x, int y, int xrad, int yrad) -{ - if (cbuf) { - if (cbuf->rect_procedural) { - cbuf->rect_procedural(cbuf, use, (float)x/(float)xrad, (float)y/(float)yrad); - return use; - } - else { - static float col[4] = {0.0f, 0.0f, 0.0f, 0.0f}; - - /* map coords */ - x-= cbuf->xof; - y-= cbuf->yof; - - if (y<-cbuf->yrad || y>= -cbuf->yrad+cbuf->y) return col; - if (x<-cbuf->xrad || x>= -cbuf->xrad+cbuf->x) return col; - - return cbuf->rect + cbuf->type*( (cbuf->yrad+y)*cbuf->x + (cbuf->xrad+x) ); - } - } - else return defcol; -} - -/* **************************************************** */ - -static CompBuf *composit_check_compbuf(CompBuf *cbuf, int type, CompBuf *outbuf) -{ - /* check type */ - CompBuf *dbuf= typecheck_compbuf(cbuf, type); - - /* if same as output and translated, duplicate so pixels don't interfere */ - if (dbuf == outbuf && !dbuf->rect_procedural && (dbuf->xof || dbuf->yof)) - dbuf= dupalloc_compbuf(dbuf); - - return dbuf; -} - -/* Pixel-to-Pixel operation, 1 Image in, 1 out */ -void composit1_pixel_processor(bNode *node, CompBuf *out, CompBuf *src_buf, float *src_col, - void (*func)(bNode *, float *, float *), - int src_type) -{ - CompBuf *src_use; - float *outfp=out->rect, *srcfp; - float color[4]; /* local color if compbuf is procedural */ - int xrad, yrad, x, y; - - src_use= composit_check_compbuf(src_buf, src_type, out); - - xrad= out->xrad; - yrad= out->yrad; - - for (y= -yrad; y<-yrad+out->y; y++) { - for (x= -xrad; x<-xrad+out->x; x++, outfp+=out->type) { - srcfp= compbuf_get_pixel(src_use, src_col, color, x, y, xrad, yrad); - func(node, outfp, srcfp); - } - } - - if (src_use!=src_buf) - free_compbuf(src_use); -} - -/* Pixel-to-Pixel operation, 2 Images in, 1 out */ -void composit2_pixel_processor(bNode *node, CompBuf *out, CompBuf *src_buf, float *src_col, - CompBuf *fac_buf, float *fac, void (*func)(bNode *, float *, float *, float *), - int src_type, int fac_type) -{ - CompBuf *src_use, *fac_use; - float *outfp=out->rect, *srcfp, *facfp; - float color[4]; /* local color if compbuf is procedural */ - int xrad, yrad, x, y; - - src_use= composit_check_compbuf(src_buf, src_type, out); - fac_use= composit_check_compbuf(fac_buf, fac_type, out); - - xrad= out->xrad; - yrad= out->yrad; - - for (y= -yrad; y<-yrad+out->y; y++) { - for (x= -xrad; x<-xrad+out->x; x++, outfp+=out->type) { - srcfp= compbuf_get_pixel(src_use, src_col, color, x, y, xrad, yrad); - facfp= compbuf_get_pixel(fac_use, fac, color, x, y, xrad, yrad); - - func(node, outfp, srcfp, facfp); - } - } - if (src_use!=src_buf) - free_compbuf(src_use); - if (fac_use!=fac_buf) - free_compbuf(fac_use); -} - -/* Pixel-to-Pixel operation, 3 Images in, 1 out */ -void composit3_pixel_processor(bNode *node, CompBuf *out, CompBuf *src1_buf, float *src1_col, CompBuf *src2_buf, float *src2_col, - CompBuf *fac_buf, float *fac, void (*func)(bNode *, float *, float *, float *, float *), - int src1_type, int src2_type, int fac_type) -{ - CompBuf *src1_use, *src2_use, *fac_use; - float *outfp=out->rect, *src1fp, *src2fp, *facfp; - float color[4]; /* local color if compbuf is procedural */ - int xrad, yrad, x, y; - - src1_use= composit_check_compbuf(src1_buf, src1_type, out); - src2_use= composit_check_compbuf(src2_buf, src2_type, out); - fac_use= composit_check_compbuf(fac_buf, fac_type, out); - - xrad= out->xrad; - yrad= out->yrad; - - for (y= -yrad; y<-yrad+out->y; y++) { - for (x= -xrad; x<-xrad+out->x; x++, outfp+=out->type) { - src1fp= compbuf_get_pixel(src1_use, src1_col, color, x, y, xrad, yrad); - src2fp= compbuf_get_pixel(src2_use, src2_col, color, x, y, xrad, yrad); - facfp= compbuf_get_pixel(fac_use, fac, color, x, y, xrad, yrad); - - func(node, outfp, src1fp, src2fp, facfp); - } - } - - if (src1_use!=src1_buf) - free_compbuf(src1_use); - if (src2_use!=src2_buf) - free_compbuf(src2_use); - if (fac_use!=fac_buf) - free_compbuf(fac_use); -} - -/* Pixel-to-Pixel operation, 4 Images in, 1 out */ -void composit4_pixel_processor(bNode *node, CompBuf *out, CompBuf *src1_buf, float *src1_col, CompBuf *fac1_buf, float *fac1, - CompBuf *src2_buf, float *src2_col, CompBuf *fac2_buf, float *fac2, - void (*func)(bNode *, float *, float *, float *, float *, float *), - int src1_type, int fac1_type, int src2_type, int fac2_type) -{ - CompBuf *src1_use, *src2_use, *fac1_use, *fac2_use; - float *outfp=out->rect, *src1fp, *src2fp, *fac1fp, *fac2fp; - float color[4]; /* local color if compbuf is procedural */ - int xrad, yrad, x, y; - - src1_use= composit_check_compbuf(src1_buf, src1_type, out); - src2_use= composit_check_compbuf(src2_buf, src2_type, out); - fac1_use= composit_check_compbuf(fac1_buf, fac1_type, out); - fac2_use= composit_check_compbuf(fac2_buf, fac2_type, out); - - xrad= out->xrad; - yrad= out->yrad; - - for (y= -yrad; y<-yrad+out->y; y++) { - for (x= -xrad; x<-xrad+out->x; x++, outfp+=out->type) { - src1fp= compbuf_get_pixel(src1_use, src1_col, color, x, y, xrad, yrad); - src2fp= compbuf_get_pixel(src2_use, src2_col, color, x, y, xrad, yrad); - fac1fp= compbuf_get_pixel(fac1_use, fac1, color, x, y, xrad, yrad); - fac2fp= compbuf_get_pixel(fac2_use, fac2, color, x, y, xrad, yrad); - - func(node, outfp, src1fp, fac1fp, src2fp, fac2fp); - } - } - - if (src1_use!=src1_buf) - free_compbuf(src1_use); - if (src2_use!=src2_buf) - free_compbuf(src2_use); - if (fac1_use!=fac1_buf) - free_compbuf(fac1_use); - if (fac2_use!=fac2_buf) - free_compbuf(fac2_use); -} - - -CompBuf *valbuf_from_rgbabuf(CompBuf *cbuf, int channel) -{ - CompBuf *valbuf= alloc_compbuf(cbuf->x, cbuf->y, CB_VAL, 1); - float *valf, *rectf; - int tot; - - /* warning note: xof and yof are applied in pixelprocessor, but should be copied otherwise? */ - valbuf->xof= cbuf->xof; - valbuf->yof= cbuf->yof; - - valf= valbuf->rect; - - /* defaults to returning alpha channel */ - if ((channel < CHAN_R) || (channel > CHAN_A)) channel = CHAN_A; - - rectf= cbuf->rect + channel; - - for (tot= cbuf->x*cbuf->y; tot>0; tot--, valf++, rectf+=4) - *valf= *rectf; - - return valbuf; -} - -void valbuf_to_rgbabuf(CompBuf *valbuf, CompBuf *cbuf, int channel) -{ - float *valf, *rectf; - int tot; - - valf= valbuf->rect; - - /* defaults to returning alpha channel */ - if ((channel < CHAN_R) || (channel > CHAN_A)) channel = CHAN_A; - - rectf = cbuf->rect + channel; - - for (tot= cbuf->x*cbuf->y; tot>0; tot--, valf++, rectf+=4) - *rectf = *valf; -} - -static CompBuf *generate_procedural_preview(CompBuf *cbuf, int newx, int newy) -{ - CompBuf *outbuf; - float *outfp; - int xrad, yrad, x, y; - - outbuf= alloc_compbuf(newx, newy, CB_RGBA, 1); - - outfp= outbuf->rect; - xrad= outbuf->xrad; - yrad= outbuf->yrad; - - for (y= -yrad; y<-yrad+outbuf->y; y++) - for (x= -xrad; x<-xrad+outbuf->x; x++, outfp+=outbuf->type) - cbuf->rect_procedural(cbuf, outfp, (float)x/(float)xrad, (float)y/(float)yrad); - - return outbuf; -} - -/* OCIO_TODO: this function is only used by legacy compositor system only, which would likely be removed soon, - * keep check for old color management flag for now - */ -void generate_preview(void *data, bNode *node, CompBuf *stackbuf) -{ - RenderData *rd= data; - bNodePreview *preview= node->preview; - int xsize, ysize; - int profile_from= (rd->color_mgt_flag & R_COLOR_MANAGEMENT)? IB_PROFILE_LINEAR_RGB: IB_PROFILE_SRGB; - int predivide= TRUE; - int dither= 0; - unsigned char *rect; - - if (preview && stackbuf) { - CompBuf *cbuf, *stackbuf_use; - - if (stackbuf->rect==NULL && stackbuf->rect_procedural==NULL) return; - - stackbuf_use= typecheck_compbuf(stackbuf, CB_RGBA); - - if (stackbuf->x > stackbuf->y) { - xsize= 140; - ysize= (140*stackbuf->y)/stackbuf->x; - } - else { - ysize= 140; - xsize= (140*stackbuf->x)/stackbuf->y; - } - - if (stackbuf_use->rect_procedural) - cbuf= generate_procedural_preview(stackbuf_use, xsize, ysize); - else - cbuf= scalefast_compbuf(stackbuf_use, xsize, ysize); - - /* convert to byte for preview */ - rect= MEM_callocN(sizeof(unsigned char)*4*xsize*ysize, "bNodePreview.rect"); - - IMB_buffer_byte_from_float(rect, cbuf->rect, - 4, dither, IB_PROFILE_SRGB, profile_from, predivide, - xsize, ysize, xsize, xsize); - - free_compbuf(cbuf); - if (stackbuf_use!=stackbuf) - free_compbuf(stackbuf_use); - - // BLI_lock_thread(LOCK_PREVIEW); - - if (preview->rect) - MEM_freeN(preview->rect); - preview->xsize= xsize; - preview->ysize= ysize; - preview->rect= rect; - - // BLI_unlock_thread(LOCK_PREVIEW); - } -} - -void do_rgba_to_yuva(bNode *UNUSED(node), float *out, float *in) -{ - rgb_to_yuv(in[0], in[1], in[2], &out[0], &out[1], &out[2]); - out[3]=in[3]; -} - -void do_rgba_to_hsva(bNode *UNUSED(node), float *out, float *in) -{ - rgb_to_hsv(in[0], in[1], in[2], &out[0], &out[1], &out[2]); - out[3]=in[3]; -} - -void do_rgba_to_ycca(bNode *UNUSED(node), float *out, float *in) -{ - rgb_to_ycc(in[0], in[1], in[2], &out[0], &out[1], &out[2], BLI_YCC_ITU_BT601); - out[3]=in[3]; -} - -void do_yuva_to_rgba(bNode *UNUSED(node), float *out, float *in) -{ - yuv_to_rgb(in[0], in[1], in[2], &out[0], &out[1], &out[2]); - out[3]=in[3]; -} - -void do_hsva_to_rgba(bNode *UNUSED(node), float *out, float *in) -{ - hsv_to_rgb(in[0], in[1], in[2], &out[0], &out[1], &out[2]); - out[3]=in[3]; -} - -void do_ycca_to_rgba(bNode *UNUSED(node), float *out, float *in) -{ - ycc_to_rgb(in[0], in[1], in[2], &out[0], &out[1], &out[2], BLI_YCC_ITU_BT601); - out[3]=in[3]; -} - -void do_copy_rgba(bNode *UNUSED(node), float *out, float *in) -{ - copy_v4_v4(out, in); -} - -void do_copy_rgb(bNode *UNUSED(node), float *out, float *in) -{ - copy_v3_v3(out, in); - out[3] = 1.0f; -} - -void do_copy_value(bNode *UNUSED(node), float *out, float *in) -{ - out[0] = in[0]; -} - -void do_copy_a_rgba(bNode *UNUSED(node), float *out, float *in, float *fac) -{ - copy_v3_v3(out, in); - out[3] = *fac; -} - -/* only accepts RGBA buffers */ -void gamma_correct_compbuf(CompBuf *img, int inversed) -{ - float *drect; - int x; - - if (img->type!=CB_RGBA) return; - - drect= img->rect; - if (inversed) { - for (x=img->x*img->y; x>0; x--, drect+=4) { - if (drect[0]>0.0f) drect[0] = sqrt(drect[0]); else drect[0] = 0.0f; - if (drect[1]>0.0f) drect[1] = sqrt(drect[1]); else drect[1] = 0.0f; - if (drect[2]>0.0f) drect[2] = sqrt(drect[2]); else drect[2] = 0.0f; - } - } - else { - for (x=img->x*img->y; x>0; x--, drect+=4) { - if (drect[0]>0.0f) drect[0]*= drect[0]; else drect[0] = 0.0f; - if (drect[1]>0.0f) drect[1]*= drect[1]; else drect[1] = 0.0f; - if (drect[2]>0.0f) drect[2]*= drect[2]; else drect[2] = 0.0f; - } - } -} - -void premul_compbuf(CompBuf *img, int inversed) -{ - float *drect; - int x; - - if (img->type!=CB_RGBA) return; - - drect= img->rect; - if (inversed) { - for (x=img->x*img->y; x>0; x--, drect+=4) { - if (fabsf(drect[3]) < 1e-5f) { - drect[0] = 0.0f; - drect[1] = 0.0f; - drect[2] = 0.0f; - } - else { - drect[0] /= drect[3]; - drect[1] /= drect[3]; - drect[2] /= drect[3]; - } - } - } - else { - for (x=img->x*img->y; x>0; x--, drect+=4) { - drect[0] *= drect[3]; - drect[1] *= drect[3]; - drect[2] *= drect[3]; - } - } -} - - - -/* - * 2D Fast Hartley Transform, used for convolution - */ - -typedef float fREAL; - -// returns next highest power of 2 of x, as well it's log2 in L2 -static unsigned int nextPow2(unsigned int x, unsigned int* L2) -{ - unsigned int pw, x_notpow2 = x & (x-1); - *L2 = 0; - while (x>>=1) ++(*L2); - pw = 1 << (*L2); - if (x_notpow2) { (*L2)++; pw<<=1; } - return pw; -} - -//------------------------------------------------------------------------------ - -// from FXT library by Joerg Arndt, faster in order bitreversal -// use: r = revbin_upd(r, h) where h = N>>1 -static unsigned int revbin_upd(unsigned int r, unsigned int h) -{ - while (!((r^=h)&h)) h >>= 1; - return r; -} -//------------------------------------------------------------------------------ -static void FHT(fREAL* data, unsigned int M, unsigned int inverse) -{ - double tt, fc, dc, fs, ds, a = M_PI; - fREAL t1, t2; - int n2, bd, bl, istep, k, len = 1 << M, n = 1; - - int i, j = 0; - unsigned int Nh = len >> 1; - for (i=1;i<(len-1);++i) { - j = revbin_upd(j, Nh); - if (j>i) { - t1 = data[i]; - data[i] = data[j]; - data[j] = t1; - } - } - - do { - fREAL* data_n = &data[n]; - - istep = n << 1; - for (k=0; k<len; k+=istep) { - t1 = data_n[k]; - data_n[k] = data[k] - t1; - data[k] += t1; - } - - n2 = n >> 1; - if (n>2) { - fc = dc = cos(a); - fs = ds = sqrt(1.0 - fc*fc); //sin(a); - bd = n-2; - for (bl=1; bl<n2; bl++) { - fREAL* data_nbd = &data_n[bd]; - fREAL* data_bd = &data[bd]; - for (k=bl; k<len; k+=istep) { - t1 = fc*data_n[k] + fs*data_nbd[k]; - t2 = fs*data_n[k] - fc*data_nbd[k]; - data_n[k] = data[k] - t1; - data_nbd[k] = data_bd[k] - t2; - data[k] += t1; - data_bd[k] += t2; - } - tt = fc*dc - fs*ds; - fs = fs*dc + fc*ds; - fc = tt; - bd -= 2; - } - } - - if (n>1) { - for (k=n2; k<len; k+=istep) { - t1 = data_n[k]; - data_n[k] = data[k] - t1; - data[k] += t1; - } - } - - n = istep; - a *= 0.5; - } while (n<len); - - if (inverse) { - fREAL sc = (fREAL)1 / (fREAL)len; - for (k=0; k<len; ++k) - data[k] *= sc; - } -} -//------------------------------------------------------------------------------ -/* 2D Fast Hartley Transform, Mx/My -> log2 of width/height, - * nzp -> the row where zero pad data starts, - * inverse -> see above */ -static void FHT2D(fREAL *data, unsigned int Mx, unsigned int My, - unsigned int nzp, unsigned int inverse) -{ - unsigned int i, j, Nx, Ny, maxy; - fREAL t; - - Nx = 1 << Mx; - Ny = 1 << My; - - // rows (forward transform skips 0 pad data) - maxy = inverse ? Ny : nzp; - for (j=0; j<maxy; ++j) - FHT(&data[Nx*j], Mx, inverse); - - // transpose data - if (Nx==Ny) { // square - for (j=0; j<Ny; ++j) - for (i=j+1; i<Nx; ++i) { - unsigned int op = i + (j << Mx), np = j + (i << My); - t=data[op], data[op]=data[np], data[np]=t; - } - } - else { // rectangular - unsigned int k, Nym = Ny-1, stm = 1 << (Mx + My); - for (i=0; stm>0; i++) { - #define PRED(k) (((k & Nym) << Mx) + (k >> My)) - for (j=PRED(i); j>i; j=PRED(j)); - if (j < i) continue; - for (k=i, j=PRED(i); j!=i; k=j, j=PRED(j), stm--) { - t=data[j], data[j]=data[k], data[k]=t; - } - #undef PRED - stm--; - } - } - // swap Mx/My & Nx/Ny - i = Nx, Nx = Ny, Ny = i; - i = Mx, Mx = My, My = i; - - // now columns == transposed rows - for (j=0; j<Ny; ++j) - FHT(&data[Nx*j], Mx, inverse); - - // finalize - for (j=0; j<=(Ny >> 1); j++) { - unsigned int jm = (Ny - j) & (Ny-1); - unsigned int ji = j << Mx; - unsigned int jmi = jm << Mx; - for (i=0; i<=(Nx >> 1); i++) { - unsigned int im = (Nx - i) & (Nx-1); - fREAL A = data[ji + i]; - fREAL B = data[jmi + i]; - fREAL C = data[ji + im]; - fREAL D = data[jmi + im]; - fREAL E = (fREAL)0.5*((A + D) - (B + C)); - data[ji + i] = A - E; - data[jmi + i] = B + E; - data[ji + im] = C + E; - data[jmi + im] = D - E; - } - } - -} - -//------------------------------------------------------------------------------ - -/* 2D convolution calc, d1 *= d2, M/N - > log2 of width/height */ -static void fht_convolve(fREAL* d1, fREAL* d2, unsigned int M, unsigned int N) -{ - fREAL a, b; - unsigned int i, j, k, L, mj, mL; - unsigned int m = 1 << M, n = 1 << N; - unsigned int m2 = 1 << (M-1), n2 = 1 << (N-1); - unsigned int mn2 = m << (N-1); - - d1[0] *= d2[0]; - d1[mn2] *= d2[mn2]; - d1[m2] *= d2[m2]; - d1[m2 + mn2] *= d2[m2 + mn2]; - for (i=1; i<m2; i++) { - k = m - i; - a = d1[i]*d2[i] - d1[k]*d2[k]; - b = d1[k]*d2[i] + d1[i]*d2[k]; - d1[i] = (b + a)*(fREAL)0.5; - d1[k] = (b - a)*(fREAL)0.5; - a = d1[i + mn2]*d2[i + mn2] - d1[k + mn2]*d2[k + mn2]; - b = d1[k + mn2]*d2[i + mn2] + d1[i + mn2]*d2[k + mn2]; - d1[i + mn2] = (b + a)*(fREAL)0.5; - d1[k + mn2] = (b - a)*(fREAL)0.5; - } - for (j=1; j<n2; j++) { - L = n - j; - mj = j << M; - mL = L << M; - a = d1[mj]*d2[mj] - d1[mL]*d2[mL]; - b = d1[mL]*d2[mj] + d1[mj]*d2[mL]; - d1[mj] = (b + a)*(fREAL)0.5; - d1[mL] = (b - a)*(fREAL)0.5; - a = d1[m2 + mj]*d2[m2 + mj] - d1[m2 + mL]*d2[m2 + mL]; - b = d1[m2 + mL]*d2[m2 + mj] + d1[m2 + mj]*d2[m2 + mL]; - d1[m2 + mj] = (b + a)*(fREAL)0.5; - d1[m2 + mL] = (b - a)*(fREAL)0.5; - } - for (i=1; i<m2; i++) { - k = m - i; - for (j=1; j<n2; j++) { - L = n - j; - mj = j << M; - mL = L << M; - a = d1[i + mj]*d2[i + mj] - d1[k + mL]*d2[k + mL]; - b = d1[k + mL]*d2[i + mj] + d1[i + mj]*d2[k + mL]; - d1[i + mj] = (b + a)*(fREAL)0.5; - d1[k + mL] = (b - a)*(fREAL)0.5; - a = d1[i + mL]*d2[i + mL] - d1[k + mj]*d2[k + mj]; - b = d1[k + mj]*d2[i + mL] + d1[i + mL]*d2[k + mj]; - d1[i + mL] = (b + a)*(fREAL)0.5; - d1[k + mj] = (b - a)*(fREAL)0.5; - } - } -} - -//------------------------------------------------------------------------------ - -void convolve(CompBuf* dst, CompBuf* in1, CompBuf* in2) -{ - fREAL *data1, *data2, *fp; - unsigned int w2, h2, hw, hh, log2_w, log2_h; - fRGB wt, *colp; - int x, y, ch; - int xbl, ybl, nxb, nyb, xbsz, ybsz; - int in2done = FALSE; - - CompBuf* rdst = alloc_compbuf(in1->x, in1->y, in1->type, 1); - - // convolution result width & height - w2 = 2*in2->x - 1; - h2 = 2*in2->y - 1; - // FFT pow2 required size & log2 - w2 = nextPow2(w2, &log2_w); - h2 = nextPow2(h2, &log2_h); - - // alloc space - data1 = (fREAL*)MEM_callocN(3*w2*h2*sizeof(fREAL), "convolve_fast FHT data1"); - data2 = (fREAL*)MEM_callocN(w2*h2*sizeof(fREAL), "convolve_fast FHT data2"); - - // normalize convolutor - wt[0] = wt[1] = wt[2] = 0.f; - for (y=0; y<in2->y; y++) { - colp = (fRGB*)&in2->rect[y*in2->x*in2->type]; - for (x=0; x<in2->x; x++) - add_v3_v3(wt, colp[x]); - } - if (wt[0] != 0.f) wt[0] = 1.f/wt[0]; - if (wt[1] != 0.f) wt[1] = 1.f/wt[1]; - if (wt[2] != 0.f) wt[2] = 1.f/wt[2]; - for (y=0; y<in2->y; y++) { - colp = (fRGB*)&in2->rect[y*in2->x*in2->type]; - for (x=0; x<in2->x; x++) - mul_v3_v3(colp[x], wt); - } - - // copy image data, unpacking interleaved RGBA into separate channels - // only need to calc data1 once - - // block add-overlap - hw = in2->x >> 1; - hh = in2->y >> 1; - xbsz = (w2 + 1) - in2->x; - ybsz = (h2 + 1) - in2->y; - nxb = in1->x / xbsz; - if (in1->x % xbsz) nxb++; - nyb = in1->y / ybsz; - if (in1->y % ybsz) nyb++; - for (ybl=0; ybl<nyb; ybl++) { - for (xbl=0; xbl<nxb; xbl++) { - - // each channel one by one - for (ch=0; ch<3; ch++) { - fREAL* data1ch = &data1[ch*w2*h2]; - - // only need to calc fht data from in2 once, can re-use for every block - if (!in2done) { - // in2, channel ch -> data1 - for (y=0; y<in2->y; y++) { - fp = &data1ch[y*w2]; - colp = (fRGB*)&in2->rect[y*in2->x*in2->type]; - for (x=0; x<in2->x; x++) - fp[x] = colp[x][ch]; - } - } - - // in1, channel ch -> data2 - memset(data2, 0, w2*h2*sizeof(fREAL)); - for (y=0; y<ybsz; y++) { - int yy = ybl*ybsz + y; - if (yy >= in1->y) continue; - fp = &data2[y*w2]; - colp = (fRGB*)&in1->rect[yy*in1->x*in1->type]; - for (x=0; x<xbsz; x++) { - int xx = xbl*xbsz + x; - if (xx >= in1->x) continue; - fp[x] = colp[xx][ch]; - } - } - - // forward FHT - // zero pad data start is different for each == height+1 - if (!in2done) FHT2D(data1ch, log2_w, log2_h, in2->y+1, 0); - FHT2D(data2, log2_w, log2_h, in2->y+1, 0); - - // FHT2D transposed data, row/col now swapped - // convolve & inverse FHT - fht_convolve(data2, data1ch, log2_h, log2_w); - FHT2D(data2, log2_h, log2_w, 0, 1); - // data again transposed, so in order again - - // overlap-add result - for (y=0; y<(int)h2; y++) { - const int yy = ybl*ybsz + y - hh; - if ((yy < 0) || (yy >= in1->y)) continue; - fp = &data2[y*w2]; - colp = (fRGB*)&rdst->rect[yy*in1->x*in1->type]; - for (x=0; x<(int)w2; x++) { - const int xx = xbl*xbsz + x - hw; - if ((xx < 0) || (xx >= in1->x)) continue; - colp[xx][ch] += fp[x]; - } - } - - } - in2done = TRUE; - } - } - - MEM_freeN(data2); - MEM_freeN(data1); - memcpy(dst->rect, rdst->rect, sizeof(float)*dst->x*dst->y*dst->type); - free_compbuf(rdst); -} - - -/* - * - * Utility functions qd_* should probably be integrated better with other functions here. - * - */ -// sets fcol to pixelcolor at (x, y) -void qd_getPixel(CompBuf* src, int x, int y, float* col) -{ - if (src->rect_procedural) { - float bc[4]; - src->rect_procedural(src, bc, (float)x/(float)src->xrad, (float)y/(float)src->yrad); - - switch (src->type) { - /* these fallthrough to get all the channels */ - case CB_RGBA: col[3]=bc[3]; - case CB_VEC3: col[2]=bc[2]; - case CB_VEC2: col[1]=bc[1]; - case CB_VAL: col[0]=bc[0]; - } - } - else if ((x >= 0) && (x < src->x) && (y >= 0) && (y < src->y)) { - float* bc = &src->rect[(x + y*src->x)*src->type]; - switch (src->type) { - /* these fallthrough to get all the channels */ - case CB_RGBA: col[3]=bc[3]; - case CB_VEC3: col[2]=bc[2]; - case CB_VEC2: col[1]=bc[1]; - case CB_VAL: col[0]=bc[0]; - } - } - else { - switch (src->type) { - /* these fallthrough to get all the channels */ - case CB_RGBA: col[3]=0.0; - case CB_VEC3: col[2]=0.0; - case CB_VEC2: col[1]=0.0; - case CB_VAL: col[0]=0.0; - } - } -} - -// sets pixel (x, y) to color col -void qd_setPixel(CompBuf* src, int x, int y, float* col) -{ - if ((x >= 0) && (x < src->x) && (y >= 0) && (y < src->y)) { - float* bc = &src->rect[(x + y*src->x)*src->type]; - switch (src->type) { - /* these fallthrough to get all the channels */ - case CB_RGBA: bc[3]=col[3]; - case CB_VEC3: bc[2]=col[2]; - case CB_VEC2: bc[1]=col[1]; - case CB_VAL: bc[0]=col[0]; - } - } -} - -// adds fcol to pixelcolor (x, y) -void qd_addPixel(CompBuf* src, int x, int y, float* col) -{ - if ((x >= 0) && (x < src->x) && (y >= 0) && (y < src->y)) { - float* bc = &src->rect[(x + y*src->x)*src->type]; - bc[0] += col[0], bc[1] += col[1], bc[2] += col[2]; - } -} - -// multiplies pixel by factor value f -void qd_multPixel(CompBuf* src, int x, int y, float f) -{ - if ((x >= 0) && (x < src->x) && (y >= 0) && (y < src->y)) { - float* bc = &src->rect[(x + y*src->x)*src->type]; - bc[0] *= f, bc[1] *= f, bc[2] *= f; - } -} - -// bilinear interpolation with wraparound -void qd_getPixelLerpWrap(CompBuf* src, float u, float v, float* col) -{ - const float ufl = floor(u), vfl = floor(v); - const int nx = (int)ufl % src->x, ny = (int)vfl % src->y; - const int x1 = (nx < 0) ? (nx + src->x) : nx; - const int y1 = (ny < 0) ? (ny + src->y) : ny; - const int x2 = (x1 + 1) % src->x, y2 = (y1 + 1) % src->y; - const float* c00 = &src->rect[(x1 + y1*src->x)*src->type]; - const float* c10 = &src->rect[(x2 + y1*src->x)*src->type]; - const float* c01 = &src->rect[(x1 + y2*src->x)*src->type]; - const float* c11 = &src->rect[(x2 + y2*src->x)*src->type]; - const float uf = u - ufl, vf = v - vfl; - const float w00=(1.f-uf)*(1.f-vf), w10=uf*(1.f-vf), w01=(1.f-uf)*vf, w11=uf*vf; - col[0] = w00*c00[0] + w10*c10[0] + w01*c01[0] + w11*c11[0]; - if (src->type != CB_VAL) { - col[1] = w00*c00[1] + w10*c10[1] + w01*c01[1] + w11*c11[1]; - col[2] = w00*c00[2] + w10*c10[2] + w01*c01[2] + w11*c11[2]; - col[3] = w00*c00[3] + w10*c10[3] + w01*c01[3] + w11*c11[3]; - } -} - -// as above, without wrap around -void qd_getPixelLerp(CompBuf* src, float u, float v, float* col) -{ - const float ufl = floor(u), vfl = floor(v); - const int x1 = (int)ufl, y1 = (int)vfl; - const int x2 = (int)ceil(u), y2 = (int)ceil(v); - if ((x2 >= 0) && (y2 >= 0) && (x1 < src->x) && (y1 < src->y)) { - const float B[4] = {0, 0, 0, 0}; - const int ox1 = (x1 < 0), oy1 = (y1 < 0), ox2 = (x2 >= src->x), oy2 = (y2 >= src->y); - const float* c00 = (ox1 || oy1) ? B : &src->rect[(x1 + y1*src->x)*src->type]; - const float* c10 = (ox2 || oy1) ? B : &src->rect[(x2 + y1*src->x)*src->type]; - const float* c01 = (ox1 || oy2) ? B : &src->rect[(x1 + y2*src->x)*src->type]; - const float* c11 = (ox2 || oy2) ? B : &src->rect[(x2 + y2*src->x)*src->type]; - const float uf = u - ufl, vf = v - vfl; - const float w00=(1.f-uf)*(1.f-vf), w10=uf*(1.f-vf), w01=(1.f-uf)*vf, w11=uf*vf; - col[0] = w00*c00[0] + w10*c10[0] + w01*c01[0] + w11*c11[0]; - if (src->type != CB_VAL) { - col[1] = w00*c00[1] + w10*c10[1] + w01*c01[1] + w11*c11[1]; - col[2] = w00*c00[2] + w10*c10[2] + w01*c01[2] + w11*c11[2]; - col[3] = w00*c00[3] + w10*c10[3] + w01*c01[3] + w11*c11[3]; - } - } - else col[0] = col[1] = col[2] = col[3] = 0.f; -} - -// as above, sampling only one channel -void qd_getPixelLerpChan(CompBuf* src, float u, float v, int chan, float* out) -{ - const float ufl = floor(u), vfl = floor(v); - const int x1 = (int)ufl, y1 = (int)vfl; - const int x2 = (int)ceil(u), y2 = (int)ceil(v); - if (chan >= src->type) chan = 0; - if ((x2 >= 0) && (y2 >= 0) && (x1 < src->x) && (y1 < src->y)) { - const float B[4] = {0, 0, 0, 0}; - const int ox1 = (x1 < 0), oy1 = (y1 < 0), ox2 = (x2 >= src->x), oy2 = (y2 >= src->y); - const float* c00 = (ox1 || oy1) ? B : &src->rect[(x1 + y1*src->x)*src->type + chan]; - const float* c10 = (ox2 || oy1) ? B : &src->rect[(x2 + y1*src->x)*src->type + chan]; - const float* c01 = (ox1 || oy2) ? B : &src->rect[(x1 + y2*src->x)*src->type + chan]; - const float* c11 = (ox2 || oy2) ? B : &src->rect[(x2 + y2*src->x)*src->type + chan]; - const float uf = u - ufl, vf = v - vfl; - const float w00=(1.f-uf)*(1.f-vf), w10=uf*(1.f-vf), w01=(1.f-uf)*vf, w11=uf*vf; - out[0] = w00*c00[0] + w10*c10[0] + w01*c01[0] + w11*c11[0]; - } - else *out = 0.f; -} - - -CompBuf* qd_downScaledCopy(CompBuf* src, int scale) -{ - CompBuf* fbuf; - if (scale <= 1) - fbuf = dupalloc_compbuf(src); - else { - int nw = src->x/scale, nh = src->y/scale; - if ((2*(src->x % scale)) > scale) nw++; - if ((2*(src->y % scale)) > scale) nh++; - fbuf = alloc_compbuf(nw, nh, src->type, 1); - { - int x, y, xx, yy, sx, sy, mx, my; - float colsum[4] = {0.0f, 0.0f, 0.0f, 0.0f}; - float fscale = 1.f/(float)(scale*scale); - for (y=0; y<nh; y++) { - fRGB* fcolp = (fRGB*)&fbuf->rect[y*fbuf->x*fbuf->type]; - yy = y*scale; - my = yy + scale; - if (my > src->y) my = src->y; - for (x=0; x<nw; x++) { - xx = x*scale; - mx = xx + scale; - if (mx > src->x) mx = src->x; - zero_v3(colsum); - for (sy=yy; sy<my; sy++) { - fRGB* scolp = (fRGB*)&src->rect[sy*src->x*src->type]; - for (sx=xx; sx<mx; sx++) - add_v3_v3(colsum, scolp[sx]); - } - mul_v3_fl(colsum, fscale); - copy_v3_v3(fcolp[x], colsum); - } - } - } - } - return fbuf; -} - -// fast g.blur, per channel -// xy var. bits 1 & 2 ca be used to blur in x or y direction separately -void IIR_gauss(CompBuf* src, float sigma, int chan, int xy) -{ - double q, q2, sc, cf[4], tsM[9], tsu[3], tsv[3]; - double *X, *Y, *W; - const unsigned int src_width = src->x; - const unsigned int src_height = src->y; - unsigned int i, x, y, sz; - - // <0.5 not valid, though can have a possibly useful sort of sharpening effect - if (sigma < 0.5f) return; - - if ((xy < 1) || (xy > 3)) xy = 3; - - // XXX The YVV macro defined below explicitly expects sources of at least 3x3 pixels, - // so just skiping blur along faulty direction if src's def is below that limit! - if (src_width < 3) xy &= ~(int) 1; - if (src_height < 3) xy &= ~(int) 2; - if (xy < 1) return; - - // see "Recursive Gabor Filtering" by Young/VanVliet - // all factors here in double.prec. Required, because for single.prec it seems to blow up if sigma > ~200 - if (sigma >= 3.556f) - q = 0.9804f * (sigma - 3.556f) + 2.5091f; - else // sigma >= 0.5 - q = (0.0561f * sigma + 0.5784f) * sigma - 0.2568f; - q2 = q * q; - sc = (1.1668 + q) * (3.203729649 + (2.21566 + q) * q); - // no gabor filtering here, so no complex multiplies, just the regular coefs. - // all negated here, so as not to have to recalc Triggs/Sdika matrix - cf[1] = q * (5.788961737 + (6.76492 + 3.0 * q) * q) / sc; - cf[2] = -q2 * (3.38246 + 3.0 * q) / sc; - // 0 & 3 unchanged - cf[3] = q2 * q / sc; - cf[0] = 1.0 - cf[1] - cf[2] - cf[3]; - - // Triggs/Sdika border corrections, - // it seems to work, not entirely sure if it is actually totally correct, - // Besides J.M.Geusebroek's anigauss.c (see http://www.science.uva.nl/~mark), - // found one other implementation by Cristoph Lampert, - // but neither seem to be quite the same, result seems to be ok so far anyway. - // Extra scale factor here to not have to do it in filter, - // though maybe this had something to with the precision errors - sc = cf[0] / ((1.0 + cf[1] - cf[2] + cf[3]) * (1.0 - cf[1] - cf[2] - cf[3]) * (1.0 + cf[2] + (cf[1] - cf[3]) * cf[3])); - tsM[0] = sc * (-cf[3] * cf[1] + 1.0 - cf[3] * cf[3] - cf[2]); - tsM[1] = sc * ((cf[3] + cf[1]) * (cf[2] + cf[3] * cf[1])); - tsM[2] = sc * (cf[3] * (cf[1] + cf[3] * cf[2])); - tsM[3] = sc * (cf[1] + cf[3] * cf[2]); - tsM[4] = sc * (-(cf[2] - 1.0) * (cf[2] + cf[3] * cf[1])); - tsM[5] = sc * (-(cf[3] * cf[1] + cf[3] * cf[3] + cf[2] - 1.0) * cf[3]); - tsM[6] = sc * (cf[3] * cf[1] + cf[2] + cf[1] * cf[1] - cf[2] * cf[2]); - tsM[7] = sc * (cf[1] * cf[2] + cf[3] * cf[2] * cf[2] - cf[1] * cf[3] * cf[3] - cf[3] * cf[3] * cf[3] - cf[3] * cf[2] + cf[3]); - tsM[8] = sc * (cf[3] * (cf[1] + cf[3] * cf[2])); - -#define YVV(L) \ -{ \ - W[0] = cf[0] * X[0] + cf[1] * X[0] + cf[2] * X[0] + cf[3] * X[0]; \ - W[1] = cf[0] * X[1] + cf[1] * W[0] + cf[2] * X[0] + cf[3] * X[0]; \ - W[2] = cf[0] * X[2] + cf[1] * W[1] + cf[2] * W[0] + cf[3] * X[0]; \ - for (i = 3; i < L; i++) { \ - W[i] = cf[0] * X[i] + cf[1] * W[i - 1] + cf[2] * W[i - 2] + cf[3] * W[i - 3]; \ - } \ - tsu[0] = W[L - 1] - X[L - 1]; \ - tsu[1] = W[L - 2] - X[L - 1]; \ - tsu[2] = W[L - 3] - X[L - 1]; \ - tsv[0] = tsM[0] * tsu[0] + tsM[1] * tsu[1] + tsM[2] * tsu[2] + X[L - 1]; \ - tsv[1] = tsM[3] * tsu[0] + tsM[4] * tsu[1] + tsM[5] * tsu[2] + X[L - 1]; \ - tsv[2] = tsM[6] * tsu[0] + tsM[7] * tsu[1] + tsM[8] * tsu[2] + X[L - 1]; \ - Y[L - 1] = cf[0] * W[L - 1] + cf[1] * tsv[0] + cf[2] * tsv[1] + cf[3] * tsv[2]; \ - Y[L - 2] = cf[0] * W[L - 2] + cf[1] * Y[L - 1] + cf[2] * tsv[0] + cf[3] * tsv[1]; \ - Y[L - 3] = cf[0] * W[L - 3] + cf[1] * Y[L - 2] + cf[2] * Y[L - 1] + cf[3] * tsv[0]; \ - /* 'i != UINT_MAX' is really 'i >= 0', but necessary for unsigned int wrapping */ \ - for (i = L - 4; i != UINT_MAX; i--) { \ - Y[i] = cf[0] * W[i] + cf[1] * Y[i + 1] + cf[2] * Y[i + 2] + cf[3] * Y[i + 3]; \ - } \ -} (void)0 - - // intermediate buffers - sz = MAX2(src_width, src_height); - X = MEM_callocN(sz * sizeof(double), "IIR_gauss X buf"); - Y = MEM_callocN(sz * sizeof(double), "IIR_gauss Y buf"); - W = MEM_callocN(sz * sizeof(double), "IIR_gauss W buf"); - if (xy & 1) { // H - for (y = 0; y < src_height; ++y) { - const int yx = y * src_width; - for (x = 0; x < src_width; ++x) - X[x] = src->rect[(x + yx) * src->type + chan]; - YVV(src_width); - for (x = 0; x < src_width; ++x) - src->rect[(x + yx) * src->type + chan] = Y[x]; - } - } - if (xy & 2) { // V - for (x = 0; x < src_width; ++x) { - for (y = 0; y < src_height; ++y) - X[y] = src->rect[(x + y * src_width) * src->type + chan]; - YVV(src_height); - for (y = 0; y < src_height; ++y) - src->rect[(x + y * src_width) * src->type + chan] = Y[y]; - } - } - - MEM_freeN(X); - MEM_freeN(W); - MEM_freeN(Y); -#undef YVV -} - -#endif /* WITH_COMPOSITOR_LEGACY */ diff --git a/source/blender/nodes/composite/node_composite_util.h b/source/blender/nodes/composite/node_composite_util.h index f2719ee0779..a3c4bffe018 100644 --- a/source/blender/nodes/composite/node_composite_util.h +++ b/source/blender/nodes/composite/node_composite_util.h @@ -33,177 +33,30 @@ #ifndef __NODE_COMPOSITE_UTIL_H__ #define __NODE_COMPOSITE_UTIL_H__ -#include <stdlib.h> -#include <string.h> -#include <math.h> - -#include "MEM_guardedalloc.h" - -#include "DNA_camera_types.h" /* qdn: defocus node, need camera info */ -#include "DNA_color_types.h" #include "DNA_ID.h" -#include "DNA_image_types.h" -#include "DNA_material_types.h" #include "DNA_movieclip_types.h" #include "DNA_node_types.h" -#include "DNA_object_types.h" -#include "DNA_scene_types.h" -#include "DNA_texture_types.h" #include "BLI_math.h" #include "BLI_blenlib.h" -#include "BLI_rand.h" -#include "BLI_threads.h" -#include "BLI_utildefines.h" -#include "BLI_utildefines.h" #include "BLF_translation.h" -#include "BKE_blender.h" -#include "BKE_camera.h" #include "BKE_colortools.h" -#include "BKE_global.h" #include "BKE_image.h" -#include "BKE_main.h" -#include "BKE_material.h" -#include "BKE_movieclip.h" -#include "BKE_node.h" #include "BKE_texture.h" #include "BKE_tracking.h" -#include "BKE_library.h" -#include "BKE_object.h" - #include "node_util.h" #include "IMB_imbuf_types.h" #include "IMB_imbuf.h" #include "RE_pipeline.h" -#include "RE_shader_ext.h" -#include "RE_render_ext.h" /* only for forward declarations */ #include "NOD_composite.h" #define CMP_SCALE_MAX 12000 -#ifdef WITH_COMPOSITOR_LEGACY - -/* *************************** operations support *************************** */ - -/* general signal that's in output sockets, and goes over the wires */ -typedef struct CompBuf { - float *rect; - int x, y, xrad, yrad; - short type, malloc; - rcti disprect; /* cropped part of image */ - int xof, yof; /* relative to center of target image */ - - void (*rect_procedural)(struct CompBuf *, float *, float, float); - float procedural_size[3], procedural_offset[3]; - int procedural_type; - bNode *node; /* only in use for procedural bufs */ - - struct CompBuf *next, *prev; /* for pass-on, works nicer than reference counting */ -} CompBuf; - -/* defines also used for pixel size */ -#define CB_RGBA 4 -#define CB_VEC4 4 -#define CB_VEC3 3 -#define CB_VEC2 2 -#define CB_VAL 1 - -/* defines for RGBA channels */ -#define CHAN_R 0 -#define CHAN_G 1 -#define CHAN_B 2 -#define CHAN_A 3 - - - -CompBuf *alloc_compbuf(int sizex, int sizey, int type, int alloc); -CompBuf *dupalloc_compbuf(CompBuf *cbuf); -CompBuf *pass_on_compbuf(CompBuf *cbuf); -void free_compbuf(CompBuf *cbuf); -void print_compbuf(char *str, CompBuf *cbuf); -void compbuf_set_node(struct CompBuf *cbuf, struct bNode *node); - -CompBuf *get_cropped_compbuf(rcti *drect, float *rectf, int rectx, int recty, int type); -CompBuf *scalefast_compbuf(CompBuf *inbuf, int newx, int newy); -CompBuf *typecheck_compbuf(CompBuf *inbuf, int type); -void typecheck_compbuf_color(float *out, float *in, int outtype, int intype); - -/* **************************************************** */ - -float *compbuf_get_pixel(CompBuf *cbuf, float *defcol, float *use, int x, int y, int xrad, int yrad); - -/* Pixel-to-Pixel operation, 1 Image in, 1 out */ -void composit1_pixel_processor(bNode *node, CompBuf *out, CompBuf *src_buf, float *src_col, - void (*func)(bNode *, float *, float *), - int src_type); -/* Pixel-to-Pixel operation, 2 Images in, 1 out */ -void composit2_pixel_processor(bNode *node, CompBuf *out, CompBuf *src_buf, float *src_col, - CompBuf *fac_buf, float *fac, void (*func)(bNode *, float *, float *, float *), - int src_type, int fac_type); - -/* Pixel-to-Pixel operation, 3 Images in, 1 out */ -void composit3_pixel_processor(bNode *node, CompBuf *out, CompBuf *src1_buf, float *src1_col, CompBuf *src2_buf, float *src2_col, - CompBuf *fac_buf, float *fac, void (*func)(bNode *, float *, float *, float *, float *), - int src1_type, int src2_type, int fac_type); - -/* Pixel-to-Pixel operation, 4 Images in, 1 out */ -void composit4_pixel_processor(bNode *node, CompBuf *out, CompBuf *src1_buf, float *src1_col, CompBuf *fac1_buf, float *fac1, - CompBuf *src2_buf, float *src2_col, CompBuf *fac2_buf, float *fac2, - void (*func)(bNode *, float *, float *, float *, float *, float *), - int src1_type, int fac1_type, int src2_type, int fac2_type); - -CompBuf *valbuf_from_rgbabuf(CompBuf *cbuf, int channel); -void valbuf_to_rgbabuf(CompBuf *valbuf, CompBuf *cbuf, int channel); -void generate_preview(void *data, bNode *node, CompBuf *stackbuf); - -void do_copy_rgba(bNode *node, float *out, float *in); -void do_copy_rgb(bNode *node, float *out, float *in); -void do_copy_value(bNode *node, float *out, float *in); -void do_copy_a_rgba(bNode *node, float *out, float *in, float *fac); - -void do_rgba_to_yuva(bNode *node, float *out, float *in); -void do_rgba_to_hsva(bNode *node, float *out, float *in); -void do_rgba_to_ycca(bNode *node, float *out, float *in); -void do_yuva_to_rgba(bNode *node, float *out, float *in); -void do_hsva_to_rgba(bNode *node, float *out, float *in); -void do_ycca_to_rgba(bNode *node, float *out, float *in); - -void gamma_correct_compbuf(CompBuf *img, int inversed); -void premul_compbuf(CompBuf *img, int inversed); -void convolve(CompBuf* dst, CompBuf* in1, CompBuf* in2); - -extern void node_ID_title_cb(void *node_v, void *unused_v); - - -/* utility functions used by glare, tonemap and lens distortion */ -/* soms macros for color handling */ -typedef float fRGB[4]; -/* multiply c2 by color rgb, rgb as separate arguments */ -#define fRGB_rgbmult(c, r, g, b) { c[0]*=(r); c[1]*=(g); c[2]*=(b); } (void)0 - -void qd_getPixel(CompBuf* src, int x, int y, float* col); -void qd_setPixel(CompBuf* src, int x, int y, float* col); -void qd_addPixel(CompBuf* src, int x, int y, float* col); -void qd_multPixel(CompBuf* src, int x, int y, float f); -void qd_getPixelLerpWrap(CompBuf* src, float u, float v, float* col); -void qd_getPixelLerp(CompBuf* src, float u, float v, float* col); -void qd_getPixelLerpChan(CompBuf* src, float u, float v, int chan, float* out); -CompBuf* qd_downScaledCopy(CompBuf* src, int scale); -void IIR_gauss(CompBuf* src, float sigma, int chan, int xy); -/* end utility funcs */ - -/* transformations */ - -CompBuf* node_composit_transform(CompBuf *cbuf, float x, float y, float angle, float scale, int filter_type); -float *node_composit_get_float_buffer(RenderData *rd, ImBuf *ibuf, int *alloc); - -#endif - -#endif /* WITH_COMPOSITOR_LEGACY */ +#endif /* __NODE_COMPOSITE_UTIL_H__ */ diff --git a/source/blender/nodes/composite/nodes/node_composite_alphaOver.c b/source/blender/nodes/composite/nodes/node_composite_alphaOver.c index 71b71c9dd4a..2654aa94be0 100644 --- a/source/blender/nodes/composite/nodes/node_composite_alphaOver.c +++ b/source/blender/nodes/composite/nodes/node_composite_alphaOver.c @@ -43,103 +43,6 @@ static bNodeSocketTemplate cmp_node_alphaover_out[] = { { -1, 0, "" } }; -#ifdef WITH_COMPOSITOR_LEGACY - -static void do_alphaover_premul(bNode *UNUSED(node), float *out, float *src, float *over, float *fac) -{ - - /* Zero alpha values should still permit an add of RGB data */ - if (over[3]<0.0f) { - copy_v4_v4(out, src); - } - else if (fac[0]==1.0f && over[3]>=1.0f) { - copy_v4_v4(out, over); - } - else { - float mul= 1.0f - fac[0]*over[3]; - - out[0] = (mul*src[0]) + fac[0]*over[0]; - out[1] = (mul*src[1]) + fac[0]*over[1]; - out[2] = (mul*src[2]) + fac[0]*over[2]; - out[3] = (mul*src[3]) + fac[0]*over[3]; - } -} - -/* result will be still premul, but the over part is premulled */ -static void do_alphaover_key(bNode *UNUSED(node), float *out, float *src, float *over, float *fac) -{ - - if (over[3]<=0.0f) { - copy_v4_v4(out, src); - } - else if (fac[0]==1.0f && over[3]>=1.0f) { - copy_v4_v4(out, over); - } - else { - float premul= fac[0]*over[3]; - float mul= 1.0f - premul; - - out[0] = (mul*src[0]) + premul*over[0]; - out[1] = (mul*src[1]) + premul*over[1]; - out[2] = (mul*src[2]) + premul*over[2]; - out[3] = (mul*src[3]) + fac[0]*over[3]; - } -} - -/* result will be still premul, but the over part is premulled */ -static void do_alphaover_mixed(bNode *node, float *out, float *src, float *over, float *fac) -{ - - if (over[3]<=0.0f) { - copy_v4_v4(out, src); - } - else if (fac[0]==1.0f && over[3]>=1.0f) { - copy_v4_v4(out, over); - } - else { - NodeTwoFloats *ntf= node->storage; - float addfac= 1.0f - ntf->x + over[3]*ntf->x; - float premul= fac[0]*addfac; - float mul= 1.0f - fac[0]*over[3]; - - out[0] = (mul*src[0]) + premul*over[0]; - out[1] = (mul*src[1]) + premul*over[1]; - out[2] = (mul*src[2]) + premul*over[2]; - out[3] = (mul*src[3]) + fac[0]*over[3]; - } -} - - -static void node_composit_exec_alphaover(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out) -{ - /* stack order in: col col */ - /* stack order out: col */ - if (out[0]->hasoutput==0) - return; - - /* input no image? then only color operation */ - if (in[1]->data==NULL && in[2]->data==NULL) { - do_alphaover_premul(node, out[0]->vec, in[1]->vec, in[2]->vec, in[0]->vec); - } - else { - /* make output size of input image */ - CompBuf *cbuf= in[1]->data?in[1]->data:in[2]->data; - CompBuf *stackbuf= alloc_compbuf(cbuf->x, cbuf->y, CB_RGBA, 1); /* allocs */ - NodeTwoFloats *ntf= node->storage; - - if (ntf->x != 0.0f) - composit3_pixel_processor(node, stackbuf, in[1]->data, in[1]->vec, in[2]->data, in[2]->vec, in[0]->data, in[0]->vec, do_alphaover_mixed, CB_RGBA, CB_RGBA, CB_VAL); - else if (node->custom1) - composit3_pixel_processor(node, stackbuf, in[1]->data, in[1]->vec, in[2]->data, in[2]->vec, in[0]->data, in[0]->vec, do_alphaover_key, CB_RGBA, CB_RGBA, CB_VAL); - else - composit3_pixel_processor(node, stackbuf, in[1]->data, in[1]->vec, in[2]->data, in[2]->vec, in[0]->data, in[0]->vec, do_alphaover_premul, CB_RGBA, CB_RGBA, CB_VAL); - - out[0]->data= stackbuf; - } -} - -#endif /* WITH_COMPOSITOR_LEGACY */ - static void node_alphaover_init(bNodeTree *UNUSED(ntree), bNode *node, bNodeTemplate *UNUSED(ntemp)) { node->storage= MEM_callocN(sizeof(NodeTwoFloats), "NodeTwoFloats"); @@ -154,9 +57,6 @@ void register_node_type_cmp_alphaover(bNodeTreeType *ttype) node_type_size(&ntype, 80, 40, 120); node_type_init(&ntype, node_alphaover_init); node_type_storage(&ntype, "NodeTwoFloats", node_free_standard_storage, node_copy_standard_storage); -#ifdef WITH_COMPOSITOR_LEGACY - node_type_exec(&ntype, node_composit_exec_alphaover); -#endif nodeRegisterType(ttype, &ntype); } diff --git a/source/blender/nodes/composite/nodes/node_composite_bilateralblur.c b/source/blender/nodes/composite/nodes/node_composite_bilateralblur.c index 7674ace42a3..34cc9a90615 100644 --- a/source/blender/nodes/composite/nodes/node_composite_bilateralblur.c +++ b/source/blender/nodes/composite/nodes/node_composite_bilateralblur.c @@ -43,221 +43,6 @@ static bNodeSocketTemplate cmp_node_bilateralblur_out[] = { { -1, 0, "" } }; -#ifdef WITH_COMPOSITOR_LEGACY - -#define INIT_C3 \ - mean0 = 1; \ - mean1[0] = src[0]; \ - mean1[1] = src[1]; \ - mean1[2] = src[2]; \ - mean1[3] = src[3]; \ - (void)0 - -/* finds color distances */ -#define COLOR_DISTANCE_C3(c1, c2) \ - ((c1[0] - c2[0]) * (c1[0] - c2[0]) + \ - (c1[1] - c2[1]) * (c1[1] - c2[1]) + \ - (c1[2] - c2[2]) * (c1[2] - c2[2]) + \ - (c1[3] - c2[3]) * (c1[3] - c2[3])) - -/* this is the main kernel function for comparing color distances - * and adding them weighted to the final color */ -#define KERNEL_ELEMENT_C3(k) \ - temp_color = src + deltas[k]; \ - ref_color = ref + deltas[k]; \ - w = weight_tab[k] + \ - (double)COLOR_DISTANCE_C3(ref, ref_color) * i2sigma_color; \ - w = 1.0 / (w * w + 1); \ - mean0 += w; \ - mean1[0] += (double)temp_color[0] * w; \ - mean1[1] += (double)temp_color[1] * w; \ - mean1[2] += (double)temp_color[2] * w; \ - mean1[3] += (double)temp_color[3] * w; \ - (void)0 - -/* write blurred values to image */ -#define UPDATE_OUTPUT_C3 \ - mean0 = 1.0 / mean0; \ - dest[x * pix + 0] = mean1[0] * mean0; \ - dest[x * pix + 1] = mean1[1] * mean0; \ - dest[x * pix + 2] = mean1[2] * mean0; \ - dest[x * pix + 3] = mean1[3] * mean0; \ - (void)0 - -/* initializes deltas for fast access to neighbor pixels */ -#define INIT_3X3_DELTAS(deltas, step, nch) \ - ((deltas)[0] = (nch), (deltas)[1] = -(step) + (nch), \ - (deltas)[2] = -(step), (deltas)[3] = -(step) - (nch), \ - (deltas)[4] = -(nch), (deltas)[5] = (step) - (nch), \ - (deltas)[6] = (step), (deltas)[7] = (step) + (nch)); \ - (void)0 - - -/* code of this node was heavily inspired by the smooth function of opencv library. - * The main change is an optional image input */ -static void node_composit_exec_bilateralblur(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out) -{ - NodeBilateralBlurData *nbbd = node->storage; - CompBuf *new, *source, *img = in[0]->data, *refimg = in[1]->data; - double mean0, w, i2sigma_color, i2sigma_space; - double mean1[4]; - double weight_tab[8]; - float *src, *dest, *ref, *temp_color, *ref_color; - float sigma_color, sigma_space; - int imgx, imgy, x, y, pix, i, step; - int deltas[8]; - short found_determinator = 0; - - if (img == NULL || out[0]->hasoutput == 0) - return; - - if (img->type != CB_RGBA) { - img = typecheck_compbuf(in[0]->data, CB_RGBA); - } - - imgx = img->x; - imgy = img->y; - pix = img->type; - step = pix * imgx; - - if (refimg) { - if (refimg->x == imgx && refimg->y == imgy) { - if (ELEM3(refimg->type, CB_VAL, CB_VEC2, CB_VEC3)) { - refimg = typecheck_compbuf(in[1]->data, CB_RGBA); - found_determinator = 1; - } - } - } - else { - refimg = img; - } - - /* allocs */ - source = dupalloc_compbuf(img); - new = alloc_compbuf(imgx, imgy, pix, 1); - - /* accept image offsets from other nodes */ - new->xof = img->xof; - new->yof = img->yof; - - /* bilateral code properties */ - sigma_color = nbbd->sigma_color; - sigma_space = nbbd->sigma_space; - - i2sigma_color = 1.0f / (sigma_color * sigma_color); - i2sigma_space = 1.0f / (sigma_space * sigma_space); - - INIT_3X3_DELTAS(deltas, step, pix); - - weight_tab[0] = weight_tab[2] = weight_tab[4] = weight_tab[6] = i2sigma_space; - weight_tab[1] = weight_tab[3] = weight_tab[5] = weight_tab[7] = i2sigma_space * 2; - - /* iterations */ - for (i = 0; i < nbbd->iter; i++) { - src = source->rect; - ref = refimg->rect; - dest = new->rect; - /*goes through image, there are more loops for 1st/last line and all other lines*/ - /*kernel element accumulates surrounding colors, which are then written with the update_output function*/ - for (x = 0; x < imgx; x++, src += pix, ref += pix) { - INIT_C3; - - KERNEL_ELEMENT_C3(6); - - if (x > 0) { - KERNEL_ELEMENT_C3(5); - KERNEL_ELEMENT_C3(4); - } - - if (x < imgx - 1) { - KERNEL_ELEMENT_C3(7); - KERNEL_ELEMENT_C3(0); - } - - UPDATE_OUTPUT_C3; - } - - dest += step; - - for (y = 1; y < imgy - 1; y++, dest += step, src += pix, ref += pix) { - x = 0; - - INIT_C3; - - KERNEL_ELEMENT_C3(0); - KERNEL_ELEMENT_C3(1); - KERNEL_ELEMENT_C3(2); - KERNEL_ELEMENT_C3(6); - KERNEL_ELEMENT_C3(7); - - UPDATE_OUTPUT_C3; - - src += pix; - ref += pix; - - for (x = 1; x < imgx - 1; x++, src += pix, ref += pix) { - INIT_C3; - - KERNEL_ELEMENT_C3(0); - KERNEL_ELEMENT_C3(1); - KERNEL_ELEMENT_C3(2); - KERNEL_ELEMENT_C3(3); - KERNEL_ELEMENT_C3(4); - KERNEL_ELEMENT_C3(5); - KERNEL_ELEMENT_C3(6); - KERNEL_ELEMENT_C3(7); - - UPDATE_OUTPUT_C3; - } - - INIT_C3; - - KERNEL_ELEMENT_C3(2); - KERNEL_ELEMENT_C3(3); - KERNEL_ELEMENT_C3(4); - KERNEL_ELEMENT_C3(5); - KERNEL_ELEMENT_C3(6); - - UPDATE_OUTPUT_C3; - } - - for (x = 0; x < imgx; x++, src += pix, ref += pix) { - INIT_C3; - - KERNEL_ELEMENT_C3(2); - - if (x > 0) { - KERNEL_ELEMENT_C3(3); - KERNEL_ELEMENT_C3(4); - } - if (x < imgx - 1) { - KERNEL_ELEMENT_C3(1); - KERNEL_ELEMENT_C3(0); - } - - UPDATE_OUTPUT_C3; - } - - if (node->exec & NODE_BREAK) break; - - SWAP(CompBuf, *source, *new); - } - - if (img != in[0]->data) - free_compbuf(img); - - if (found_determinator == 1) { - if (refimg != in[1]->data) - free_compbuf(refimg); - } - - out[0]->data = source; - - free_compbuf(new); -} - -#endif /* WITH_COMPOSITOR_LEGACY */ - static void node_composit_init_bilateralblur(bNodeTree *UNUSED(ntree), bNode *node, bNodeTemplate *UNUSED(ntemp)) { NodeBilateralBlurData *nbbd = MEM_callocN(sizeof(NodeBilateralBlurData), "node bilateral blur data"); @@ -275,9 +60,6 @@ void register_node_type_cmp_bilateralblur(bNodeTreeType *ttype) node_type_size(&ntype, 150, 120, 200); node_type_init(&ntype, node_composit_init_bilateralblur); node_type_storage(&ntype, "NodeBilateralBlurData", node_free_standard_storage, node_copy_standard_storage); -#ifdef WITH_COMPOSITOR_LEGACY - node_type_exec(&ntype, node_composit_exec_bilateralblur); -#endif nodeRegisterType(ttype, &ntype); } diff --git a/source/blender/nodes/composite/nodes/node_composite_blur.c b/source/blender/nodes/composite/nodes/node_composite_blur.c index eb7f7763afb..9d19f9667bc 100644 --- a/source/blender/nodes/composite/nodes/node_composite_blur.c +++ b/source/blender/nodes/composite/nodes/node_composite_blur.c @@ -44,686 +44,6 @@ static bNodeSocketTemplate cmp_node_blur_out[] = { { -1, 0, "" } }; -#ifdef WITH_COMPOSITOR_LEGACY - -static float *make_gausstab(int filtertype, int rad) -{ - float *gausstab, sum, val; - int i, n; - - n = 2 * rad + 1; - - gausstab = (float *) MEM_mallocN(n * sizeof(float), "gauss"); - - sum = 0.0f; - for (i = -rad; i <= rad; i++) { - val = RE_filter_value(filtertype, (float)i / (float)rad); - sum += val; - gausstab[i + rad] = val; - } - - sum = 1.0f / sum; - for (i = 0; i < n; i++) - gausstab[i] *= sum; - - return gausstab; -} - -static float *make_bloomtab(int rad) -{ - float *bloomtab, val; - int i, n; - - n = 2 * rad + 1; - - bloomtab = (float *) MEM_mallocN(n * sizeof(float), "bloom"); - - for (i = -rad; i <= rad; i++) { - val = powf(1.0f - fabsf((float)i) / ((float)rad), 4.0f); - bloomtab[i + rad] = val; - } - - return bloomtab; -} - -/* both input images of same type, either 4 or 1 channel */ -static void blur_single_image(bNode *node, CompBuf *new, CompBuf *img, float scale) -{ - NodeBlurData *nbd = node->storage; - CompBuf *work; - register float sum, val; - float rval, gval, bval, aval; - float *gausstab, *gausstabcent; - int rad, imgx = img->x, imgy = img->y; - int x, y, pix = img->type; - int i, bigstep; - float *src, *dest; - - /* helper image */ - work = alloc_compbuf(imgx, imgy, img->type, 1); /* allocs */ - - /* horizontal */ - if (nbd->sizex == 0) { - memcpy(work->rect, img->rect, sizeof(float) * img->type * imgx * imgy); - } - else { - rad = scale * (float)nbd->sizex; - if (rad > imgx / 2) - rad = imgx / 2; - else if (rad < 1) - rad = 1; - - gausstab = make_gausstab(nbd->filtertype, rad); - gausstabcent = gausstab + rad; - - for (y = 0; y < imgy; y++) { - float *srcd = img->rect + pix * (y * img->x); - - dest = work->rect + pix * (y * img->x); - - for (x = 0; x < imgx; x++) { - int minr = x - rad < 0 ? -x : -rad; - int maxr = x + rad > imgx ? imgx - x : rad; - - src = srcd + pix * (x + minr); - - sum = gval = rval = bval = aval = 0.0f; - for (i = minr; i < maxr; i++) { - val = gausstabcent[i]; - sum += val; - rval += val * (*src++); - if (pix == 4) { - gval += val * (*src++); - bval += val * (*src++); - aval += val * (*src++); - } - } - sum = 1.0f / sum; - *dest++ = rval * sum; - if (pix == 4) { - *dest++ = gval * sum; - *dest++ = bval * sum; - *dest++ = aval * sum; - } - } - if (node->exec & NODE_BREAK) - break; - } - - /* vertical */ - MEM_freeN(gausstab); - } - - if (nbd->sizey == 0) { - memcpy(new->rect, work->rect, sizeof(float) * img->type * imgx * imgy); - } - else { - rad = scale * (float)nbd->sizey; - if (rad > imgy / 2) - rad = imgy / 2; - else if (rad < 1) - rad = 1; - - gausstab = make_gausstab(nbd->filtertype, rad); - gausstabcent = gausstab + rad; - - bigstep = pix * imgx; - for (x = 0; x < imgx; x++) { - float *srcd = work->rect + pix * x; - - dest = new->rect + pix * x; - - for (y = 0; y < imgy; y++) { - int minr = y - rad < 0 ? -y : -rad; - int maxr = y + rad > imgy ? imgy - y : rad; - - src = srcd + bigstep * (y + minr); - - sum = gval = rval = bval = aval = 0.0f; - for (i = minr; i < maxr; i++) { - val = gausstabcent[i]; - sum += val; - rval += val * src[0]; - if (pix == 4) { - gval += val * src[1]; - bval += val * src[2]; - aval += val * src[3]; - } - src += bigstep; - } - sum = 1.0f / sum; - dest[0] = rval * sum; - if (pix == 4) { - dest[1] = gval * sum; - dest[2] = bval * sum; - dest[3] = aval * sum; - } - dest += bigstep; - } - if (node->exec & NODE_BREAK) - break; - } - MEM_freeN(gausstab); - } - - free_compbuf(work); -} - -/* reference has to be mapped 0-1, and equal in size */ -static void bloom_with_reference(CompBuf *new, CompBuf *img, CompBuf *UNUSED(ref), float UNUSED(fac), NodeBlurData *nbd) -{ - CompBuf *wbuf; - register float val; - float radxf, radyf; - float **maintabs; - float *gausstabx, *gausstabcenty; - float *gausstaby, *gausstabcentx; - int radx, rady, imgx = img->x, imgy = img->y; - int x, y; - int i, j; - float *src, *dest, *wb; - - wbuf = alloc_compbuf(imgx, imgy, CB_VAL, 1); - - /* horizontal */ - radx = (float)nbd->sizex; - if (radx > imgx / 2) - radx = imgx / 2; - else if (radx < 1) - radx = 1; - - /* vertical */ - rady = (float)nbd->sizey; - if (rady > imgy / 2) - rady = imgy / 2; - else if (rady < 1) - rady = 1; - - x = MAX2(radx, rady); - maintabs = MEM_mallocN(x * sizeof(void *), "gauss array"); - for (i = 0; i < x; i++) - maintabs[i] = make_bloomtab(i + 1); - - /* vars to store before we go */ -// refd= ref->rect; - src = img->rect; - - radxf = (float)radx; - radyf = (float)rady; - - for (y = 0; y < imgy; y++) { - for (x = 0; x < imgx; x++, src += 4) { //, refd++) { - -// int refradx= (int)(refd[0]*radxf); -// int refrady= (int)(refd[0]*radyf); - - int refradx = (int)(radxf * 0.3f * src[3] * (src[0] + src[1] + src[2])); - int refrady = (int)(radyf * 0.3f * src[3] * (src[0] + src[1] + src[2])); - - if (refradx > radx) refradx = radx; - else if (refradx < 1) refradx = 1; - if (refrady > rady) refrady = rady; - else if (refrady < 1) refrady = 1; - - if (refradx == 1 && refrady == 1) { - wb = wbuf->rect + (y * imgx + x); - dest = new->rect + 4 * (y * imgx + x); - wb[0] += 1.0f; - dest[0] += src[0]; - dest[1] += src[1]; - dest[2] += src[2]; - dest[3] += src[3]; - } - else { - int minxr = x - refradx < 0 ? -x : -refradx; - int maxxr = x + refradx > imgx ? imgx - x : refradx; - int minyr = y - refrady < 0 ? -y : -refrady; - int maxyr = y + refrady > imgy ? imgy - y : refrady; - - float *destd = new->rect + 4 * ( (y + minyr) * imgx + x + minxr); - float *wbufd = wbuf->rect + ( (y + minyr) * imgx + x + minxr); - - gausstabx = maintabs[refradx - 1]; - gausstabcentx = gausstabx + refradx; - gausstaby = maintabs[refrady - 1]; - gausstabcenty = gausstaby + refrady; - - for (i = minyr; i < maxyr; i++, destd += 4 * imgx, wbufd += imgx) { - dest = destd; - wb = wbufd; - for (j = minxr; j < maxxr; j++, dest += 4, wb++) { - - val = gausstabcenty[i] * gausstabcentx[j]; - wb[0] += val; - dest[0] += val * src[0]; - dest[1] += val * src[1]; - dest[2] += val * src[2]; - dest[3] += val * src[3]; - } - } - } - } - } - - x = imgx * imgy; - dest = new->rect; - wb = wbuf->rect; - while (x--) { - val = 1.0f / wb[0]; - dest[0] *= val; - dest[1] *= val; - dest[2] *= val; - dest[3] *= val; - wb++; - dest += 4; - } - - free_compbuf(wbuf); - - x = MAX2(radx, rady); - for (i = 0; i < x; i++) - MEM_freeN(maintabs[i]); - MEM_freeN(maintabs); - -} - -#if 0 -static float hexagon_filter(float fi, float fj) -{ - fi = fabs(fi); - fj = fabs(fj); - - if (fj > 0.33f) { - fj = (fj - 0.33f) / 0.66f; - if (fi + fj > 1.0f) - return 0.0f; - else - return 1.0f; - } - else return 1.0f; -} -#endif - -/* uses full filter, no horizontal/vertical optimize possible */ -/* both images same type, either 1 or 4 channels */ -static void bokeh_single_image(bNode *node, CompBuf *new, CompBuf *img, float fac) -{ - NodeBlurData *nbd = node->storage; - register float val; - float radxf, radyf; - float *gausstab, *dgauss; - int radx, rady, imgx = img->x, imgy = img->y; - int x, y, pix = img->type; - int i, j, n; - float *src = NULL, *dest, *srcd = NULL; - - /* horizontal */ - radxf = fac * (float)nbd->sizex; - if (radxf > imgx / 2.0f) - radxf = imgx / 2.0f; - else if (radxf < 1.0f) - radxf = 1.0f; - - /* vertical */ - radyf = fac * (float)nbd->sizey; - if (radyf > imgy / 2.0f) - radyf = imgy / 2.0f; - else if (radyf < 1.0f) - radyf = 1.0f; - - radx = ceil(radxf); - rady = ceil(radyf); - - n = (2 * radx + 1) * (2 * rady + 1); - - /* create a full filter image */ - gausstab = MEM_mallocN(sizeof(float) * n, "filter tab"); - dgauss = gausstab; - val = 0.0f; - for (j = -rady; j <= rady; j++) { - for (i = -radx; i <= radx; i++, dgauss++) { - float fj = (float)j / radyf; - float fi = (float)i / radxf; - float dist = sqrt(fj * fj + fi * fi); - - // *dgauss= hexagon_filter(fi, fj); - *dgauss = RE_filter_value(nbd->filtertype, dist); - - val += *dgauss; - } - } - - if (val != 0.0f) { - val = 1.0f / val; - for (j = n - 1; j >= 0; j--) - gausstab[j] *= val; - } - else gausstab[4] = 1.0f; - - for (y = -rady + 1; y < imgy + rady - 1; y++) { - - if (y <= 0) srcd = img->rect; - else if (y < imgy) srcd += pix * imgx; - else srcd = img->rect + pix * (imgy - 1) * imgx; - - for (x = -radx + 1; x < imgx + radx - 1; x++) { - int minxr = x - radx < 0 ? -x : -radx; - int maxxr = x + radx >= imgx ? imgx - x - 1 : radx; - int minyr = y - rady < 0 ? -y : -rady; - int maxyr = y + rady > imgy - 1 ? imgy - y - 1 : rady; - - float *destd = new->rect + pix * ( (y + minyr) * imgx + x + minxr); - float *dgausd = gausstab + (minyr + rady) * (2 * radx + 1) + minxr + radx; - - if (x <= 0) src = srcd; - else if (x < imgx) src += pix; - else src = srcd + pix * (imgx - 1); - - for (i = minyr; i <= maxyr; i++, destd += pix * imgx, dgausd += 2 * radx + 1) { - dest = destd; - dgauss = dgausd; - for (j = minxr; j <= maxxr; j++, dest += pix, dgauss++) { - val = *dgauss; - if (val != 0.0f) { - dest[0] += val * src[0]; - if (pix > 1) { - dest[1] += val * src[1]; - dest[2] += val * src[2]; - dest[3] += val * src[3]; - } - } - } - } - } - if (node->exec & NODE_BREAK) - break; - } - - MEM_freeN(gausstab); -} - - -/* reference has to be mapped 0-1, and equal in size */ -static void blur_with_reference(bNode *node, CompBuf *new, CompBuf *img, CompBuf *ref) -{ - NodeBlurData *nbd = node->storage; - CompBuf *blurbuf, *ref_use; - register float sum, val; - float rval, gval, bval, aval, radxf, radyf; - float **maintabs; - float *gausstabx, *gausstabcenty; - float *gausstaby, *gausstabcentx; - int radx, rady, imgx = img->x, imgy = img->y; - int x, y, pix = img->type; - int i, j; - float *src, *dest, *refd, *blurd; - float defcol[4] = {1.0f, 1.0f, 1.0f, 1.0f}; /* default color for compbuf_get_pixel */ - float proccol[4]; /* local color if compbuf is procedural */ - int refradx, refrady; - - if (ref->x != img->x || ref->y != img->y) - return; - - ref_use = typecheck_compbuf(ref, CB_VAL); - - /* trick is; we blur the reference image... but only works with clipped values*/ - blurbuf = alloc_compbuf(imgx, imgy, CB_VAL, 1); - blurbuf->xof = ref_use->xof; - blurbuf->yof = ref_use->yof; - blurd = blurbuf->rect; - refd = ref_use->rect; - for (x = imgx * imgy; x > 0; x--, refd++, blurd++) { - if (refd[0] < 0.0f) blurd[0] = 0.0f; - else if (refd[0] > 1.0f) blurd[0] = 1.0f; - else blurd[0] = refd[0]; - } - - blur_single_image(node, blurbuf, blurbuf, 1.0f); - - /* horizontal */ - radx = (float)nbd->sizex; - if (radx > imgx / 2) - radx = imgx / 2; - else if (radx < 1) - radx = 1; - - /* vertical */ - rady = (float)nbd->sizey; - if (rady > imgy / 2) - rady = imgy / 2; - else if (rady < 1) - rady = 1; - - x = MAX2(radx, rady); - maintabs = MEM_mallocN(x * sizeof(void *), "gauss array"); - for (i = 0; i < x; i++) - maintabs[i] = make_gausstab(nbd->filtertype, i + 1); - - dest = new->rect; - radxf = (float)radx; - radyf = (float)rady; - - for (y = 0; y < imgy; y++) { - for (x = 0; x < imgx; x++, dest += pix) { - refd = compbuf_get_pixel(blurbuf, defcol, proccol, x - blurbuf->xrad, y - blurbuf->yrad, blurbuf->xrad, blurbuf->yrad); - refradx = (int)(refd[0] * radxf); - refrady = (int)(refd[0] * radyf); - - if (refradx > radx) refradx = radx; - else if (refradx < 1) refradx = 1; - if (refrady > rady) refrady = rady; - else if (refrady < 1) refrady = 1; - - if (refradx == 1 && refrady == 1) { - src = img->rect + pix * (y * imgx + x); - if (pix == 1) - dest[0] = src[0]; - else - copy_v4_v4(dest, src); - } - else { - int minxr = x - refradx < 0 ? -x : -refradx; - int maxxr = x + refradx > imgx ? imgx - x : refradx; - int minyr = y - refrady < 0 ? -y : -refrady; - int maxyr = y + refrady > imgy ? imgy - y : refrady; - - float *srcd = img->rect + pix * ( (y + minyr) * imgx + x + minxr); - - gausstabx = maintabs[refradx - 1]; - gausstabcentx = gausstabx + refradx; - gausstaby = maintabs[refrady - 1]; - gausstabcenty = gausstaby + refrady; - - sum = gval = rval = bval = aval = 0.0f; - - for (i = minyr; i < maxyr; i++, srcd += pix * imgx) { - src = srcd; - for (j = minxr; j < maxxr; j++, src += pix) { - - val = gausstabcenty[i] * gausstabcentx[j]; - sum += val; - rval += val * src[0]; - if (pix > 1) { - gval += val * src[1]; - bval += val * src[2]; - aval += val * src[3]; - } - } - } - sum = 1.0f / sum; - dest[0] = rval * sum; - if (pix > 1) { - dest[1] = gval * sum; - dest[2] = bval * sum; - dest[3] = aval * sum; - } - } - } - if (node->exec & NODE_BREAK) - break; - } - - free_compbuf(blurbuf); - - x = MAX2(radx, rady); - for (i = 0; i < x; i++) - MEM_freeN(maintabs[i]); - MEM_freeN(maintabs); - - if (ref_use != ref) - free_compbuf(ref_use); -} - -static void node_composit_exec_blur(void *data, bNode *node, bNodeStack **in, bNodeStack **out) -{ - CompBuf *new, *img = in[0]->data; - NodeBlurData *nbd = node->storage; - - if (img == NULL) return; - - /* store image in size that is needed for absolute/relative conversions on ui level */ - nbd->image_in_width = img->x; - nbd->image_in_height = img->y; - - if (out[0]->hasoutput == 0) return; - - if (nbd->relative) { - if (nbd->aspect == CMP_NODE_BLUR_ASPECT_NONE) { - nbd->sizex = (int)(nbd->percentx * 0.01f * nbd->image_in_width); - nbd->sizey = (int)(nbd->percenty * 0.01f * nbd->image_in_height); - } - else if (nbd->aspect == CMP_NODE_BLUR_ASPECT_Y) { - nbd->sizex = (int)(nbd->percentx * 0.01f * nbd->image_in_width); - nbd->sizey = (int)(nbd->percenty * 0.01f * nbd->image_in_width); - } - else if (nbd->aspect == CMP_NODE_BLUR_ASPECT_X) { - nbd->sizex = (int)(nbd->percentx * 0.01f * nbd->image_in_height); - nbd->sizey = (int)(nbd->percenty * 0.01f * nbd->image_in_height); - } - } - - if (nbd->sizex == 0 && nbd->sizey == 0) { - new = pass_on_compbuf(img); - out[0]->data = new; - } - else if (nbd->filtertype == R_FILTER_FAST_GAUSS) { - if (in[1]->vec[0] < 0.001f) { /* time node inputs can be a tiny value */ - new = pass_on_compbuf(img); - } - else { - // TODO: can this be mapped with reference, too? - const float sx = ((float)nbd->sizex * in[1]->vec[0]) / 2.0f, sy = ((float)nbd->sizey * in[1]->vec[0]) / 2.0f; - int c; - - if ((img == NULL) || (out[0]->hasoutput == 0)) return; - - if (img->type == CB_VEC2) - new = typecheck_compbuf(img, CB_VAL); - else if (img->type == CB_VEC3) - new = typecheck_compbuf(img, CB_RGBA); - else - new = dupalloc_compbuf(img); - - if ((sx == sy) && (sx > 0.f)) { - for (c = 0; c < new->type; ++c) - IIR_gauss(new, sx, c, 3); - } - else { - if (sx > 0.f) { - for (c = 0; c < new->type; ++c) - IIR_gauss(new, sx, c, 1); - } - if (sy > 0.f) { - for (c = 0; c < new->type; ++c) - IIR_gauss(new, sy, c, 2); - } - } - } - out[0]->data = new; - } - else { - /* All non fast gauss blur methods */ - if (img->type == CB_VEC2 || img->type == CB_VEC3) { - img = typecheck_compbuf(in[0]->data, CB_RGBA); - } - - /* if fac input, we do it different */ - if (in[1]->data) { - CompBuf *gammabuf; - - /* make output size of input image */ - new = alloc_compbuf(img->x, img->y, img->type, 1); /* allocs */ - - /* accept image offsets from other nodes */ - new->xof = img->xof; - new->yof = img->yof; - - if (nbd->gamma) { - gammabuf = dupalloc_compbuf(img); - gamma_correct_compbuf(gammabuf, 0); - } - else gammabuf = img; - - blur_with_reference(node, new, gammabuf, in[1]->data); - - if (nbd->gamma) { - gamma_correct_compbuf(new, 1); - free_compbuf(gammabuf); - } - if (node->exec & NODE_BREAK) { - free_compbuf(new); - new = NULL; - } - out[0]->data = new; - } - else { - - if (in[1]->vec[0] <= 0.001f) { /* time node inputs can be a tiny value */ - new = pass_on_compbuf(img); - } - else { - CompBuf *gammabuf; - - /* make output size of input image */ - new = alloc_compbuf(img->x, img->y, img->type, 1); /* allocs */ - - /* accept image offsets from other nodes */ - new->xof = img->xof; - new->yof = img->yof; - - if (nbd->gamma) { - gammabuf = dupalloc_compbuf(img); - gamma_correct_compbuf(gammabuf, 0); - } - else gammabuf = img; - - if (nbd->bokeh) - bokeh_single_image(node, new, gammabuf, in[1]->vec[0]); - else if (1) - blur_single_image(node, new, gammabuf, in[1]->vec[0]); - else /* bloom experimental... */ - bloom_with_reference(new, gammabuf, NULL, in[1]->vec[0], nbd); - - if (nbd->gamma) { - gamma_correct_compbuf(new, 1); - free_compbuf(gammabuf); - } - if (node->exec & NODE_BREAK) { - free_compbuf(new); - new = NULL; - } - } - out[0]->data = new; - } - if (img != in[0]->data) - free_compbuf(img); - } - - generate_preview(data, node, out[0]->data); -} - -#endif /* WITH_COMPOSITOR_LEGACY */ - static void node_composit_init_blur(bNodeTree *UNUSED(ntree), bNode *node, bNodeTemplate *UNUSED(ntemp)) { NodeBlurData *data = MEM_callocN(sizeof(NodeBlurData), "node blur data"); @@ -740,9 +60,6 @@ void register_node_type_cmp_blur(bNodeTreeType *ttype) node_type_size(&ntype, 120, 80, 200); node_type_init(&ntype, node_composit_init_blur); node_type_storage(&ntype, "NodeBlurData", node_free_standard_storage, node_copy_standard_storage); -#ifdef WITH_COMPOSITOR_LEGACY - node_type_exec(&ntype, node_composit_exec_blur); -#endif nodeRegisterType(ttype, &ntype); } diff --git a/source/blender/nodes/composite/nodes/node_composite_brightness.c b/source/blender/nodes/composite/nodes/node_composite_brightness.c index ecf572f59c7..719423edcf8 100644 --- a/source/blender/nodes/composite/nodes/node_composite_brightness.c +++ b/source/blender/nodes/composite/nodes/node_composite_brightness.c @@ -47,54 +47,6 @@ static bNodeSocketTemplate cmp_node_brightcontrast_out[] = { { -1, 0, "" } }; -#ifdef WITH_COMPOSITOR_LEGACY - -static void do_brightnesscontrast(bNode *UNUSED(node), float *out, float *in, float *in_brightness, float *in_contrast) -{ - float i; - int c; - float a, b, v; - float brightness = (*in_brightness) / 100.0f; - float contrast = *in_contrast; - float delta = contrast / 200.0f; - a = 1.0f - delta * 2.0f; - /* - * The algorithm is by Werner D. Streidt - * (http://visca.com/ffactory/archives/5-99/msg00021.html) - * Extracted of OpenCV demhist.c - */ - if (contrast > 0) { - a = 1.0f / a; - b = a * (brightness - delta); - } - else { - delta *= -1; - b = a * (brightness + delta); - } - - for (c=0; c<3; c++) { - i = in[c]; - v = a*i + b; - out[c] = v; - } -} - -static void node_composit_exec_brightcontrast(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out) -{ - if (out[0]->hasoutput==0) - return; - - if (in[0]->data) { - CompBuf *stackbuf, *cbuf= typecheck_compbuf(in[0]->data, CB_RGBA); - stackbuf= dupalloc_compbuf(cbuf); - composit3_pixel_processor(node, stackbuf, in[0]->data, in[0]->vec, in[1]->data, in[1]->vec, in[2]->data, in[2]->vec, do_brightnesscontrast, CB_RGBA, CB_VAL, CB_VAL); - out[0]->data = stackbuf; - if (cbuf != in[0]->data) - free_compbuf(cbuf); - } -} - -#endif /* WITH_COMPOSITOR_LEGACY */ void register_node_type_cmp_brightcontrast(bNodeTreeType *ttype) { @@ -103,9 +55,6 @@ void register_node_type_cmp_brightcontrast(bNodeTreeType *ttype) node_type_base(ttype, &ntype, CMP_NODE_BRIGHTCONTRAST, "Bright/Contrast", NODE_CLASS_OP_COLOR, NODE_OPTIONS); node_type_socket_templates(&ntype, cmp_node_brightcontrast_in, cmp_node_brightcontrast_out); node_type_size(&ntype, 140, 100, 320); -#ifdef WITH_COMPOSITOR_LEGACY - node_type_exec(&ntype, node_composit_exec_brightcontrast); -#endif nodeRegisterType(ttype, &ntype); } diff --git a/source/blender/nodes/composite/nodes/node_composite_channelMatte.c b/source/blender/nodes/composite/nodes/node_composite_channelMatte.c index 40dbbbb8dca..a54a8507882 100644 --- a/source/blender/nodes/composite/nodes/node_composite_channelMatte.c +++ b/source/blender/nodes/composite/nodes/node_composite_channelMatte.c @@ -45,153 +45,6 @@ static bNodeSocketTemplate cmp_node_channel_matte_out[] ={ {-1, 0, ""} }; -#ifdef WITH_COMPOSITOR_LEGACY - -static void do_normalized_rgba_to_ycca2(bNode *UNUSED(node), float *out, float *in) -{ - /*normalize to the range 0.0 to 1.0) */ - rgb_to_ycc(in[0], in[1], in[2], &out[0], &out[1], &out[2], BLI_YCC_ITU_BT601); - out[0]=(out[0])/255.0f; - out[1]=(out[1])/255.0f; - out[2]=(out[2])/255.0f; - out[3]=in[3]; -} - -static void do_normalized_ycca_to_rgba2(bNode *UNUSED(node), float *out, float *in) -{ - /*un-normalize the normalize from above */ - in[0]=in[0]*255.0f; - in[1]=in[1]*255.0f; - in[2]=in[2]*255.0f; - ycc_to_rgb(in[0], in[1], in[2], &out[0], &out[1], &out[2], BLI_YCC_ITU_BT601); - out[3]=in[3]; -} - - -static void do_channel_matte(bNode *node, float *out, float *in) -{ - NodeChroma *c=(NodeChroma *)node->storage; - float alpha=0.0; - - switch (c->algorithm) { - case 0: { /* Alpha=key_channel-limit channel */ - int key_channel=node->custom2-1; - int limit_channel=c->channel-1; - alpha=in[key_channel]-in[limit_channel]; - break; - } - case 1: { /* Alpha=G-MAX(R, B) */ - switch (node->custom2) { - case 1: - { - alpha=in[0]-MAX2(in[1], in[2]); - break; - } - case 2: - { - alpha=in[1]-MAX2(in[0], in[2]); - break; - } - case 3: - { - alpha=in[2]-MAX2(in[0], in[1]); - break; - } - default: - break; - } - break; - } - default: - break; - } - - /*flip because 0.0 is transparent, not 1.0*/ - alpha=1-alpha; - - /* test range*/ - if (alpha>c->t1) { - alpha=in[3]; /*whatever it was prior */ - } - else if (alpha<c->t2) { - alpha=0.0; - } - else {/*blend */ - alpha=(alpha-c->t2)/(c->t1-c->t2); - } - - - /* don't make something that was more transparent less transparent */ - if (alpha<in[3]) { - out[3]=alpha; - } - else { - out[3]=in[3]; - } -} - -static void node_composit_exec_channel_matte(void *data, bNode *node, bNodeStack **in, bNodeStack **out) -{ - CompBuf *cbuf; - CompBuf *outbuf; - - if (in[0]->hasinput==0) return; - if (in[0]->data==NULL) return; - if (out[0]->hasoutput==0 && out[1]->hasoutput==0) return; - - cbuf=typecheck_compbuf(in[0]->data, CB_RGBA); - - outbuf=dupalloc_compbuf(cbuf); - - /*convert to colorspace*/ - switch (node->custom1) { - case CMP_NODE_CHANNEL_MATTE_CS_RGB: - break; - case CMP_NODE_CHANNEL_MATTE_CS_HSV: /*HSV*/ - composit1_pixel_processor(node, outbuf, cbuf, in[1]->vec, do_rgba_to_hsva, CB_RGBA); - break; - case CMP_NODE_CHANNEL_MATTE_CS_YUV: /*YUV*/ - composit1_pixel_processor(node, outbuf, cbuf, in[1]->vec, do_rgba_to_yuva, CB_RGBA); - break; - case CMP_NODE_CHANNEL_MATTE_CS_YCC: /*YCC*/ - composit1_pixel_processor(node, outbuf, cbuf, in[1]->vec, do_normalized_rgba_to_ycca2, CB_RGBA); - break; - default: - break; - } - - /*use the selected channel information to do the key */ - composit1_pixel_processor(node, outbuf, outbuf, in[1]->vec, do_channel_matte, CB_RGBA); - - /*convert back to RGB colorspace in place*/ - switch (node->custom1) { - case CMP_NODE_CHANNEL_MATTE_CS_RGB: /*RGB*/ - break; - case CMP_NODE_CHANNEL_MATTE_CS_HSV: /*HSV*/ - composit1_pixel_processor(node, outbuf, outbuf, in[1]->vec, do_hsva_to_rgba, CB_RGBA); - break; - case CMP_NODE_CHANNEL_MATTE_CS_YUV: /*YUV*/ - composit1_pixel_processor(node, outbuf, outbuf, in[1]->vec, do_yuva_to_rgba, CB_RGBA); - break; - case CMP_NODE_CHANNEL_MATTE_CS_YCC: /*YCC*/ - composit1_pixel_processor(node, outbuf, outbuf, in[1]->vec, do_normalized_ycca_to_rgba2, CB_RGBA); - break; - default: - break; - } - - generate_preview(data, node, outbuf); - out[0]->data=outbuf; - if (out[1]->hasoutput) - out[1]->data=valbuf_from_rgbabuf(outbuf, CHAN_A); - - if (cbuf!=in[0]->data) - free_compbuf(cbuf); - -} - -#endif /* WITH_COMPOSITOR_LEGACY */ - static void node_composit_init_channel_matte(bNodeTree *UNUSED(ntree), bNode *node, bNodeTemplate *UNUSED(ntemp)) { NodeChroma *c= MEM_callocN(sizeof(NodeChroma), "node chroma"); @@ -216,9 +69,6 @@ void register_node_type_cmp_channel_matte(bNodeTreeType *ttype) node_type_size(&ntype, 200, 80, 250); node_type_init(&ntype, node_composit_init_channel_matte); node_type_storage(&ntype, "NodeChroma", node_free_standard_storage, node_copy_standard_storage); -#ifdef WITH_COMPOSITOR_LEGACY - node_type_exec(&ntype, node_composit_exec_channel_matte); -#endif nodeRegisterType(ttype, &ntype); } diff --git a/source/blender/nodes/composite/nodes/node_composite_chromaMatte.c b/source/blender/nodes/composite/nodes/node_composite_chromaMatte.c index f343f806d57..83c8bbc9a1e 100644 --- a/source/blender/nodes/composite/nodes/node_composite_chromaMatte.c +++ b/source/blender/nodes/composite/nodes/node_composite_chromaMatte.c @@ -45,136 +45,6 @@ static bNodeSocketTemplate cmp_node_chroma_out[] = { {-1, 0, ""} }; -#ifdef WITH_COMPOSITOR_LEGACY - -static void do_rgba_to_ycca_normalized(bNode *UNUSED(node), float *out, float *in) -{ - rgb_to_ycc(in[0], in[1], in[2], &out[0], &out[1], &out[2], BLI_YCC_ITU_BT601); - - //normalize to 0..1.0 - out[0]=out[0]/255.0f; - out[1]=out[1]/255.0f; - out[2]=out[2]/255.0f; - - //rescale to -1.0..1.0 - out[0]=(out[0]*2.0f)-1.0f; - out[1]=(out[1]*2.0f)-1.0f; - out[2]=(out[2]*2.0f)-1.0f; - - // out[0]=((out[0])-16)/255.0; - // out[1]=((out[1])-128)/255.0; - // out[2]=((out[2])-128)/255.0; - out[3]=in[3]; -} - -static void do_ycca_to_rgba_normalized(bNode *UNUSED(node), float *out, float *in) -{ - /*un-normalize the normalize from above */ - in[0]=(in[0]+1.0f)/2.0f; - in[1]=(in[1]+1.0f)/2.0f; - in[2]=(in[2]+1.0f)/2.0f; - - in[0]=(in[0]*255.0f); - in[1]=(in[1]*255.0f); - in[2]=(in[2]*255.0f); - - // in[0]=(in[0]*255.0)+16; - // in[1]=(in[1]*255.0)+128; - // in[2]=(in[2]*255.0)+128; - ycc_to_rgb(in[0], in[1], in[2], &out[0], &out[1], &out[2], BLI_YCC_ITU_BT601); - out[3]=in[3]; -} - -static void do_chroma_key(bNode *node, float *out, float *in) -{ - NodeChroma *c; - float x, z, alpha; - float theta, beta, angle, angle2; - float kfg; - - c=node->storage; - - /* Algorithm from book "Video Demistified," does not include the spill reduction part */ - - /* find theta, the angle that the color space should be rotated based on key chroma values*/ - theta=atan2(c->key[2], c->key[1]); - - /*rotate the cb and cr into x/z space */ - x=in[1]*cosf(theta)+in[2]*sinf(theta); - z=in[2]*cosf(theta)-in[1]*sinf(theta); - - /*if within the acceptance angle */ - angle=c->t1; /* t1 is radians. */ - - /* if kfg is <0 then the pixel is outside of the key color */ - kfg= x-(fabsf(z)/tanf(angle/2.0f)); - - copy_v3_v3(out, in); - - if (kfg>0.0f) { /* found a pixel that is within key color */ - beta=atan2(z, x); - angle2=c->t2; /* t2 is radians. */ - - /* if beta is within the cutoff angle */ - if (fabsf(beta) < (angle2/2.0f)) { - alpha=0.0; - } - else { - alpha=1.0f-(kfg/c->fstrength); - } - - /* don't make something that was more transparent less transparent */ - if (alpha<in[3]) { - out[3]=alpha; - } - else { - out[3]=in[3]; - } - } - else { /* make pixel just as transparent as it was before */ - out[3]=in[3]; - } -} - -static void node_composit_exec_chroma_matte(void *data, bNode *node, bNodeStack **in, bNodeStack **out) -{ - CompBuf *cbuf; - CompBuf *chromabuf; - NodeChroma *c; - - if (in[0]->hasinput==0) return; - if (in[0]->data==NULL) return; - if (out[0]->hasoutput==0 && out[1]->hasoutput==0) return; - - cbuf= typecheck_compbuf(in[0]->data, CB_RGBA); - - chromabuf= dupalloc_compbuf(cbuf); - - c=node->storage; - - /*convert rgbbuf to normalized chroma space*/ - composit1_pixel_processor(node, chromabuf, cbuf, in[0]->vec, do_rgba_to_ycca_normalized, CB_RGBA); - /*convert key to normalized chroma color space */ - do_rgba_to_ycca_normalized(node, c->key, in[1]->vec); - - /*per pixel chroma key*/ - composit1_pixel_processor(node, chromabuf, chromabuf, in[0]->vec, do_chroma_key, CB_RGBA); - - /*convert back*/ - composit1_pixel_processor(node, chromabuf, chromabuf, in[0]->vec, do_ycca_to_rgba_normalized, CB_RGBA); - - out[0]->data= chromabuf; - if (out[1]->hasoutput) - out[1]->data= valbuf_from_rgbabuf(chromabuf, CHAN_A); - - generate_preview(data, node, chromabuf); - - if (cbuf!=in[0]->data) - free_compbuf(cbuf); -} - -#endif /* WITH_COMPOSITOR_LEGACY */ - static void node_composit_init_chroma_matte(bNodeTree *UNUSED(ntree), bNode *node, bNodeTemplate *UNUSED(ntemp)) { NodeChroma *c= MEM_callocN(sizeof(NodeChroma), "node chroma"); @@ -195,9 +65,6 @@ void register_node_type_cmp_chroma_matte(bNodeTreeType *ttype) node_type_size(&ntype, 200, 80, 300); node_type_init(&ntype, node_composit_init_chroma_matte); node_type_storage(&ntype, "NodeChroma", node_free_standard_storage, node_copy_standard_storage); -#ifdef WITH_COMPOSITOR_LEGACY - node_type_exec(&ntype, node_composit_exec_chroma_matte); -#endif nodeRegisterType(ttype, &ntype); } diff --git a/source/blender/nodes/composite/nodes/node_composite_colorMatte.c b/source/blender/nodes/composite/nodes/node_composite_colorMatte.c index 07a6647d976..1642d9283c3 100644 --- a/source/blender/nodes/composite/nodes/node_composite_colorMatte.c +++ b/source/blender/nodes/composite/nodes/node_composite_colorMatte.c @@ -45,77 +45,6 @@ static bNodeSocketTemplate cmp_node_color_out[] = { {-1, 0, ""} }; -#ifdef WITH_COMPOSITOR_LEGACY - -static void do_color_key(bNode *node, float *out, float *in) -{ - float h_wrap; - NodeChroma *c; - c=node->storage; - - - copy_v3_v3(out, in); - - if ( - /* do hue last because it needs to wrap, and does some more checks */ - - /* sat */ (fabsf(in[1]-c->key[1]) < c->t2) && - /* val */ (fabsf(in[2]-c->key[2]) < c->t3) && - - /* multiply by 2 because it wraps on both sides of the hue, - * otherwise 0.5 would key all hue's */ - - /* hue */ ((h_wrap= 2.0f * fabsf(in[0]-c->key[0])) < c->t1 || (2.0f - h_wrap) < c->t1) - ) { - out[3]=0.0; /*make transparent*/ - } - - else { /*pixel is outside key color */ - out[3]=in[3]; /* make pixel just as transparent as it was before */ - } -} - -static void node_composit_exec_color_matte(void *data, bNode *node, bNodeStack **in, bNodeStack **out) -{ - CompBuf *cbuf; - CompBuf *colorbuf; - NodeChroma *c; - - if (in[0]->hasinput==0) return; - if (in[0]->data==NULL) return; - if (out[0]->hasoutput==0 && out[1]->hasoutput==0) return; - - cbuf= typecheck_compbuf(in[0]->data, CB_RGBA); - - colorbuf= dupalloc_compbuf(cbuf); - - c=node->storage; - - /*convert rgbbuf to hsv*/ - composit1_pixel_processor(node, colorbuf, cbuf, in[0]->vec, do_rgba_to_hsva, CB_RGBA); - - /*convert key to hsv*/ - do_rgba_to_hsva(node, c->key, in[1]->vec); - - - /*per pixel color key*/ - composit1_pixel_processor(node, colorbuf, colorbuf, in[0]->vec, do_color_key, CB_RGBA); - - /*convert back*/ - composit1_pixel_processor(node, colorbuf, colorbuf, in[0]->vec, do_hsva_to_rgba, CB_RGBA); - - out[0]->data= colorbuf; - if (out[1]->hasoutput) - out[1]->data= valbuf_from_rgbabuf(colorbuf, CHAN_A); - - generate_preview(data, node, colorbuf); - - if (cbuf!=in[0]->data) - free_compbuf(cbuf); -} - -#endif /* WITH_COMPOSITOR_LEGACY */ - static void node_composit_init_color_matte(bNodeTree *UNUSED(ntree), bNode *node, bNodeTemplate *UNUSED(ntemp)) { NodeChroma *c= MEM_callocN(sizeof(NodeChroma), "node color"); @@ -136,9 +65,6 @@ void register_node_type_cmp_color_matte(bNodeTreeType *ttype) node_type_size(&ntype, 200, 80, 300); node_type_init(&ntype, node_composit_init_color_matte); node_type_storage(&ntype, "NodeChroma", node_free_standard_storage, node_copy_standard_storage); -#ifdef WITH_COMPOSITOR_LEGACY - node_type_exec(&ntype, node_composit_exec_color_matte); -#endif nodeRegisterType(ttype, &ntype); } diff --git a/source/blender/nodes/composite/nodes/node_composite_colorSpill.c b/source/blender/nodes/composite/nodes/node_composite_colorSpill.c index 44a5ac9e968..3679a65b238 100644 --- a/source/blender/nodes/composite/nodes/node_composite_colorSpill.c +++ b/source/blender/nodes/composite/nodes/node_composite_colorSpill.c @@ -43,281 +43,6 @@ static bNodeSocketTemplate cmp_node_color_spill_out[] = { {-1, 0, ""} }; -#ifdef WITH_COMPOSITOR_LEGACY - -#define AVG(a, b) ((a + b) / 2) - - -static void do_simple_spillmap_red(bNode *node, float* out, float *in) -{ - NodeColorspill *ncs; - ncs=node->storage; - out[0]=in[0]-( ncs->limscale * in[ncs->limchan] ); -} - -static void do_simple_spillmap_red_fac(bNode *node, float* out, float *in, float *fac) -{ - NodeColorspill *ncs; - ncs=node->storage; - - out[0] = *fac * (in[0]-( ncs->limscale * in[ncs->limchan])); -} - -static void do_simple_spillmap_green(bNode *node, float* out, float *in) -{ - NodeColorspill *ncs; - ncs=node->storage; - out[0]=in[1]-( ncs->limscale * in[ncs->limchan] ); -} - -static void do_simple_spillmap_green_fac(bNode *node, float* out, float *in, float *fac) -{ - NodeColorspill *ncs; - ncs=node->storage; - - out[0] = *fac * (in[1]-( ncs->limscale * in[ncs->limchan])); -} - -static void do_simple_spillmap_blue(bNode *node, float* out, float *in) -{ - NodeColorspill *ncs; - ncs=node->storage; - out[0]=in[2]-( ncs->limscale * in[ncs->limchan] ); -} - -static void do_simple_spillmap_blue_fac(bNode *node, float* out, float *in, float *fac) -{ - NodeColorspill *ncs; - ncs=node->storage; - - out[0] = *fac * (in[2]-( ncs->limscale * in[ncs->limchan])); -} - -static void do_average_spillmap_red(bNode *node, float* out, float *in) -{ - NodeColorspill *ncs; - ncs=node->storage; - out[0]=in[0]-(ncs->limscale * AVG(in[1], in[2]) ); -} - -static void do_average_spillmap_red_fac(bNode *node, float* out, float *in, float *fac) -{ - NodeColorspill *ncs; - ncs=node->storage; - - out[0] = *fac * (in[0]-(ncs->limscale * AVG(in[1], in[2]) )); -} - -static void do_average_spillmap_green(bNode *node, float* out, float *in) -{ - NodeColorspill *ncs; - ncs=node->storage; - out[0]=in[1]-(ncs->limscale * AVG(in[0], in[2]) ); -} - -static void do_average_spillmap_green_fac(bNode *node, float* out, float *in, float *fac) -{ - NodeColorspill *ncs; - ncs=node->storage; - - out[0] = *fac * (in[0]-(ncs->limscale * AVG(in[0], in[2]) )); -} - -static void do_average_spillmap_blue(bNode *node, float* out, float *in) -{ - NodeColorspill *ncs; - ncs=node->storage; - out[0]=in[2]-(ncs->limscale * AVG(in[0], in[1]) ); -} - -static void do_average_spillmap_blue_fac(bNode *node, float* out, float *in, float *fac) -{ - NodeColorspill *ncs; - ncs=node->storage; - - out[0] = *fac * (in[0]-(ncs->limscale * AVG(in[0], in[1]) )); -} - -static void do_apply_spillmap_red(bNode *node, float* out, float *in, float *map) -{ - NodeColorspill *ncs; - ncs=node->storage; - if (map[0]>0) { - out[0]=in[0]-(ncs->uspillr*map[0]); - out[1]=in[1]+(ncs->uspillg*map[0]); - out[2]=in[2]+(ncs->uspillb*map[0]); - } - else { - out[0]=in[0]; - out[1]=in[1]; - out[2]=in[2]; - } -} - -static void do_apply_spillmap_green(bNode *node, float* out, float *in, float *map) -{ - NodeColorspill *ncs; - ncs=node->storage; - if (map[0]>0) { - out[0]=in[0]+(ncs->uspillr*map[0]); - out[1]=in[1]-(ncs->uspillg*map[0]); - out[2]=in[2]+(ncs->uspillb*map[0]); - } - else { - out[0]=in[0]; - out[1]=in[1]; - out[2]=in[2]; - } -} - -static void do_apply_spillmap_blue(bNode *node, float* out, float *in, float *map) -{ - NodeColorspill *ncs; - ncs=node->storage; - if (map[0]>0) { - out[0]=in[0]+(ncs->uspillr*map[0]); - out[1]=in[1]+(ncs->uspillg*map[0]); - out[2]=in[2]-(ncs->uspillb*map[0]); - } - else { - out[0]=in[0]; - out[1]=in[1]; - out[2]=in[2]; - } -} - -static void node_composit_exec_color_spill(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out) -{ - /* Originally based on the information from the book "The Art and Science of Digital Composition" and - * discussions from vfxtalk.com .*/ - CompBuf *cbuf; - /* CompBuf *mask; */ /* UNUSED */ - CompBuf *rgbbuf; - CompBuf *spillmap; - NodeColorspill *ncs; - ncs=node->storage; - - /* early out for missing connections */ - if (out[0]->hasoutput==0 ) return; - if (in[0]->hasinput==0) return; - if (in[0]->data==NULL) return; - - cbuf=typecheck_compbuf(in[0]->data, CB_RGBA); - /* mask= */ /* UNUSED */ typecheck_compbuf(in[1]->data, CB_VAL); - spillmap=alloc_compbuf(cbuf->x, cbuf->y, CB_VAL, 1); - rgbbuf=dupalloc_compbuf(cbuf); - - switch (node->custom1) { - case 1: /*red spill*/ - { - switch (node->custom2) { - case 0: /* simple limit */ - { - if ((in[1]->data==NULL) && (in[1]->vec[0] >= 1.f)) { - composit1_pixel_processor(node, spillmap, cbuf, in[0]->vec, do_simple_spillmap_red, CB_RGBA); - } - else { - composit2_pixel_processor(node, spillmap, cbuf, in[0]->vec, in[1]->data, in[1]->vec, do_simple_spillmap_red_fac, CB_RGBA, CB_VAL); - } - break; - } - case 1: /* average limit */ - { - if ((in[1]->data==NULL) && (in[1]->vec[0] >= 1.f)) { - composit1_pixel_processor(node, spillmap, cbuf, in[0]->vec, do_average_spillmap_red, CB_RGBA); - } - else { - composit2_pixel_processor(node, spillmap, cbuf, in[0]->vec, in[1]->data, in[1]->vec, do_average_spillmap_red_fac, CB_RGBA, CB_VAL); - } - break; - } - } - if (ncs->unspill==0) { - ncs->uspillr=1.0f; - ncs->uspillg=0.0f; - ncs->uspillb=0.0f; - } - composit2_pixel_processor(node, rgbbuf, cbuf, in[0]->vec, spillmap, NULL, do_apply_spillmap_red, CB_RGBA, CB_VAL); - break; - } - case 2: /*green spill*/ - { - switch (node->custom2) { - case 0: /* simple limit */ - { - if ((in[1]->data==NULL) && (in[1]->vec[0] >= 1.f)) { - composit1_pixel_processor(node, spillmap, cbuf, in[0]->vec, do_simple_spillmap_green, CB_RGBA); - } - else { - composit2_pixel_processor(node, spillmap, cbuf, in[0]->vec, in[1]->data, in[1]->vec, do_simple_spillmap_green_fac, CB_RGBA, CB_VAL); - } - break; - } - case 1: /* average limit */ - { - if ((in[1]->data==NULL) && (in[1]->vec[0] >= 1.f)) { - composit1_pixel_processor(node, spillmap, cbuf, in[0]->vec, do_average_spillmap_green, CB_RGBA); - } - else { - composit2_pixel_processor(node, spillmap, cbuf, in[0]->vec, in[1]->data, in[1]->vec, do_average_spillmap_green_fac, CB_RGBA, CB_VAL); - } - break; - } - } - if (ncs->unspill==0) { - ncs->uspillr=0.0f; - ncs->uspillg=1.0f; - ncs->uspillb=0.0f; - } - composit2_pixel_processor(node, rgbbuf, cbuf, in[0]->vec, spillmap, NULL, do_apply_spillmap_green, CB_RGBA, CB_VAL); - break; - } - case 3: /*blue spill*/ - { - switch (node->custom2) { - case 0: /* simple limit */ - { - if ((in[1]->data==NULL) && (in[1]->vec[0] >= 1.f)) { - composit1_pixel_processor(node, spillmap, cbuf, in[0]->vec, do_simple_spillmap_blue, CB_RGBA); - } - else { - composit2_pixel_processor(node, spillmap, cbuf, in[0]->vec, in[1]->data, in[1]->vec, do_simple_spillmap_blue_fac, CB_RGBA, CB_VAL); - } - break; - } - case 1: /* average limit */ - { - if ((in[1]->data==NULL) && (in[1]->vec[0] >= 1.f)) { - composit1_pixel_processor(node, spillmap, cbuf, in[0]->vec, do_average_spillmap_blue, CB_RGBA); - } - else { - composit2_pixel_processor(node, spillmap, cbuf, in[0]->vec, in[1]->data, in[1]->vec, do_average_spillmap_blue_fac, CB_RGBA, CB_VAL); - } - break; - } - } - if (ncs->unspill==0) { - ncs->uspillr=0.0f; - ncs->uspillg=0.0f; - ncs->uspillb=1.0f; - } - composit2_pixel_processor(node, rgbbuf, cbuf, in[0]->vec, spillmap, NULL, do_apply_spillmap_blue, CB_RGBA, CB_VAL); - break; - } - default: - break; - } - - out[0]->data=rgbbuf; - - if (cbuf!=in[0]->data) - free_compbuf(cbuf); - - free_compbuf(spillmap); -} - -#endif /* WITH_COMPOSITOR_LEGACY */ - static void node_composit_init_color_spill(bNodeTree *UNUSED(ntree), bNode *node, bNodeTemplate *UNUSED(ntemp)) { NodeColorspill *ncs= MEM_callocN(sizeof(NodeColorspill), "node colorspill"); @@ -338,9 +63,6 @@ void register_node_type_cmp_color_spill(bNodeTreeType *ttype) node_type_size(&ntype, 140, 80, 200); node_type_init(&ntype, node_composit_init_color_spill); node_type_storage(&ntype, "NodeColorspill", node_free_standard_storage, node_copy_standard_storage); -#ifdef WITH_COMPOSITOR_LEGACY - node_type_exec(&ntype, node_composit_exec_color_spill); -#endif nodeRegisterType(ttype, &ntype); } diff --git a/source/blender/nodes/composite/nodes/node_composite_colorbalance.c b/source/blender/nodes/composite/nodes/node_composite_colorbalance.c index 0927724d3fb..da9ce64d994 100644 --- a/source/blender/nodes/composite/nodes/node_composite_colorbalance.c +++ b/source/blender/nodes/composite/nodes/node_composite_colorbalance.c @@ -46,138 +46,6 @@ static bNodeSocketTemplate cmp_node_colorbalance_out[] = { {-1, 0, ""} }; -#ifdef WITH_COMPOSITOR_LEGACY - -/* this function implements ASC-CDL according to the spec at http://www.asctech.org/ - * Slope - * S = in * slope - * Offset - * O = S + offset - * = (in * slope) + offset - * Power - * out = Clamp(O) ^ power - * = Clamp((in * slope) + offset) ^ power - */ -BLI_INLINE float colorbalance_cdl(float in, float offset, float power, float slope) -{ - float x = in * slope + offset; - - /* prevent NaN */ - CLAMP(x, 0.0f, 1.0f); - - return powf(x, power); -} - -/* note: lift_lgg is just 2-lift, gamma_inv is 1.0/gamma */ -BLI_INLINE float colorbalance_lgg(float in, float lift_lgg, float gamma_inv, float gain) -{ - /* 1:1 match with the sequencer with linear/srgb conversions, the conversion isn't pretty - * but best keep it this way, since testing for durian shows a similar calculation - * without lin/srgb conversions gives bad results (over-saturated shadows) with colors - * slightly below 1.0. some correction can be done but it ends up looking bad for shadows or lighter tones - campbell */ - float x= (((linearrgb_to_srgb(in) - 1.0f) * lift_lgg) + 1.0f) * gain; - - /* prevent NaN */ - if (x < 0.f) x = 0.f; - - return powf(srgb_to_linearrgb(x), gamma_inv); -} - -static void do_colorbalance_cdl(bNode *node, float* out, float *in) -{ - NodeColorBalance *n= (NodeColorBalance *)node->storage; - - out[0] = colorbalance_cdl(in[0], n->lift[0], n->gamma[0], n->gain[0]); - out[1] = colorbalance_cdl(in[1], n->lift[1], n->gamma[1], n->gain[1]); - out[2] = colorbalance_cdl(in[2], n->lift[2], n->gamma[2], n->gain[2]); - out[3] = in[3]; -} - -static void do_colorbalance_cdl_fac(bNode *node, float* out, float *in, float *fac) -{ - NodeColorBalance *n= (NodeColorBalance *)node->storage; - const float mfac= 1.0f - *fac; - - out[0] = mfac*in[0] + *fac * colorbalance_cdl(in[0], n->lift[0], n->gamma[0], n->gain[0]); - out[1] = mfac*in[1] + *fac * colorbalance_cdl(in[1], n->lift[1], n->gamma[1], n->gain[1]); - out[2] = mfac*in[2] + *fac * colorbalance_cdl(in[2], n->lift[2], n->gamma[2], n->gain[2]); - out[3] = in[3]; -} - -static void do_colorbalance_lgg(bNode *node, float* out, float *in) -{ - NodeColorBalance *n= (NodeColorBalance *)node->storage; - - out[0] = colorbalance_lgg(in[0], n->lift_lgg[0], n->gamma_inv[0], n->gain[0]); - out[1] = colorbalance_lgg(in[1], n->lift_lgg[1], n->gamma_inv[1], n->gain[1]); - out[2] = colorbalance_lgg(in[2], n->lift_lgg[2], n->gamma_inv[2], n->gain[2]); - out[3] = in[3]; -} - -static void do_colorbalance_lgg_fac(bNode *node, float* out, float *in, float *fac) -{ - NodeColorBalance *n= (NodeColorBalance *)node->storage; - const float mfac= 1.0f - *fac; - - out[0] = mfac*in[0] + *fac * colorbalance_lgg(in[0], n->lift_lgg[0], n->gamma_inv[0], n->gain[0]); - out[1] = mfac*in[1] + *fac * colorbalance_lgg(in[1], n->lift_lgg[1], n->gamma_inv[1], n->gain[1]); - out[2] = mfac*in[2] + *fac * colorbalance_lgg(in[2], n->lift_lgg[2], n->gamma_inv[2], n->gain[2]); - out[3] = in[3]; -} - -static void node_composit_exec_colorbalance(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out) -{ - CompBuf *cbuf= in[1]->data; - CompBuf *stackbuf; - - /* stack order input: fac, image */ - /* stack order output: image */ - if (out[0]->hasoutput==0) return; - - if (in[0]->vec[0] == 0.f && in[0]->data == NULL) { - out[0]->data = pass_on_compbuf(cbuf); - return; - } - - { - NodeColorBalance *n= (NodeColorBalance *)node->storage; - int c; - - for (c = 0; c < 3; c++) { - n->lift_lgg[c] = 2.0f - n->lift[c]; - n->gamma_inv[c] = (n->gamma[c] != 0.0f) ? 1.0f/n->gamma[c] : 1000000.0f; - } - } - - if (cbuf) { - stackbuf= alloc_compbuf(cbuf->x, cbuf->y, CB_RGBA, 1); /* create output based on image input */ - - if (node->custom1 == 0) { - /* lift gamma gain */ - if ((in[0]->data==NULL) && (in[0]->vec[0] >= 1.f)) { - composit1_pixel_processor(node, stackbuf, in[1]->data, in[1]->vec, do_colorbalance_lgg, CB_RGBA); - } - else { - composit2_pixel_processor(node, stackbuf, in[1]->data, in[1]->vec, in[0]->data, in[0]->vec, do_colorbalance_lgg_fac, CB_RGBA, CB_VAL); - } - } - else { - /* offset/power/slope : ASC-CDL */ - if ((in[0]->data==NULL) && (in[0]->vec[0] >= 1.f)) { - composit1_pixel_processor(node, stackbuf, in[1]->data, in[1]->vec, do_colorbalance_cdl, CB_RGBA); - } - else { - composit2_pixel_processor(node, stackbuf, in[1]->data, in[1]->vec, in[0]->data, in[0]->vec, do_colorbalance_cdl_fac, CB_RGBA, CB_VAL); - } - - } - - out[0]->data=stackbuf; - } -} - -#endif /* WITH_COMPOSITOR_LEGACY */ - static void node_composit_init_colorbalance(bNodeTree *UNUSED(ntree), bNode *node, bNodeTemplate *UNUSED(ntemp)) { NodeColorBalance *n= node->storage= MEM_callocN(sizeof(NodeColorBalance), "node colorbalance"); @@ -196,9 +64,6 @@ void register_node_type_cmp_colorbalance(bNodeTreeType *ttype) node_type_size(&ntype, 400, 200, 400); node_type_init(&ntype, node_composit_init_colorbalance); node_type_storage(&ntype, "NodeColorBalance", node_free_standard_storage, node_copy_standard_storage); -#ifdef WITH_COMPOSITOR_LEGACY - node_type_exec(&ntype, node_composit_exec_colorbalance); -#endif nodeRegisterType(ttype, &ntype); } diff --git a/source/blender/nodes/composite/nodes/node_composite_common.c b/source/blender/nodes/composite/nodes/node_composite_common.c index 10b81cdaaa0..4307232a41e 100644 --- a/source/blender/nodes/composite/nodes/node_composite_common.c +++ b/source/blender/nodes/composite/nodes/node_composite_common.c @@ -183,9 +183,6 @@ static void group_free_internal(bNodeTreeExec *gexec) for (i = 0, ns = gexec->stack; i < gexec->stacksize; ++i, ++ns) { if (!ns->external && !ns->is_copy) { if (ns->data) { -#ifdef WITH_COMPOSITOR_LEGACY - free_compbuf(ns->data); -#endif ns->data = NULL; } } diff --git a/source/blender/nodes/composite/nodes/node_composite_composite.c b/source/blender/nodes/composite/nodes/node_composite_composite.c index cb932b6a8de..ca12b500e5b 100644 --- a/source/blender/nodes/composite/nodes/node_composite_composite.c +++ b/source/blender/nodes/composite/nodes/node_composite_composite.c @@ -39,65 +39,6 @@ static bNodeSocketTemplate cmp_node_composite_in[] = { { -1, 0, "" } }; -#ifdef WITH_COMPOSITOR_LEGACY - -/* applies to render pipeline */ -static void node_composit_exec_composite(void *data, bNode *node, bNodeStack **in, bNodeStack **UNUSED(out)) -{ - /* image assigned to output */ - /* stack order input sockets: col, alpha, z */ - - if (node->flag & NODE_DO_OUTPUT) { /* only one works on out */ - Scene *scene= (Scene *)node->id; - RenderData *rd= data; - - if (scene && (rd->scemode & R_DOCOMP)) { - Render *re= RE_GetRender(scene->id.name); - RenderResult *rr= RE_AcquireResultWrite(re); - if (rr) { - CompBuf *outbuf, *zbuf=NULL; - - if (rr->rectf) - MEM_freeN(rr->rectf); - outbuf= alloc_compbuf(rr->rectx, rr->recty, CB_RGBA, 1); - - if (in[1]->data==NULL) - composit1_pixel_processor(node, outbuf, in[0]->data, in[0]->vec, do_copy_rgba, CB_RGBA); - else - composit2_pixel_processor(node, outbuf, in[0]->data, in[0]->vec, in[1]->data, in[1]->vec, do_copy_a_rgba, CB_RGBA, CB_VAL); - - if (in[2]->data) { - if (rr->rectz) - MEM_freeN(rr->rectz); - zbuf= alloc_compbuf(rr->rectx, rr->recty, CB_VAL, 1); - composit1_pixel_processor(node, zbuf, in[2]->data, in[2]->vec, do_copy_value, CB_VAL); - rr->rectz= zbuf->rect; - zbuf->malloc= 0; - free_compbuf(zbuf); - } - generate_preview(data, node, outbuf); - - /* we give outbuf to rr... */ - rr->rectf= outbuf->rect; - outbuf->malloc= 0; - free_compbuf(outbuf); - - /* signal for imageviewer to refresh (it converts to byte rects...) */ - BKE_image_signal(BKE_image_verify_viewer(IMA_TYPE_R_RESULT, "Render Result"), NULL, IMA_SIGNAL_FREE); - - RE_ReleaseResult(re); - return; - } - else - RE_ReleaseResult(re); - } - } - if (in[0]->data) - generate_preview(data, node, in[0]->data); -} - -#endif /* WITH_COMPOSITOR_LEGACY */ - void register_node_type_cmp_composite(bNodeTreeType *ttype) { static bNodeType ntype; @@ -105,9 +46,6 @@ void register_node_type_cmp_composite(bNodeTreeType *ttype) node_type_base(ttype, &ntype, CMP_NODE_COMPOSITE, "Composite", NODE_CLASS_OUTPUT, NODE_PREVIEW); node_type_socket_templates(&ntype, cmp_node_composite_in, NULL); node_type_size(&ntype, 80, 60, 200); -#ifdef WITH_COMPOSITOR_LEGACY - node_type_exec(&ntype, node_composit_exec_composite); -#endif /* Do not allow muting for this node. */ node_type_internal_links(&ntype, NULL); diff --git a/source/blender/nodes/composite/nodes/node_composite_crop.c b/source/blender/nodes/composite/nodes/node_composite_crop.c index ad51fae1998..90d48a543ad 100644 --- a/source/blender/nodes/composite/nodes/node_composite_crop.c +++ b/source/blender/nodes/composite/nodes/node_composite_crop.c @@ -43,68 +43,6 @@ static bNodeSocketTemplate cmp_node_crop_out[] = { { -1, 0, "" } }; -#ifdef WITH_COMPOSITOR_LEGACY - -static void node_composit_exec_crop(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out) -{ - if (in[0]->data) { - NodeTwoXYs *ntxy= node->storage; - CompBuf *cbuf= in[0]->data; - CompBuf *stackbuf; - int x, y; - float *srcfp, *outfp; - rcti outputrect; - - if (node->custom2) { - ntxy->x1= cbuf->x* ntxy->fac_x1; - ntxy->x2= cbuf->x* ntxy->fac_x2; - ntxy->y1= cbuf->y* ntxy->fac_y1; - ntxy->y2= cbuf->y* ntxy->fac_y2; - } - - /* check input image size */ - if (cbuf->x <= ntxy->x1 + 1) - ntxy->x1= cbuf->x - 1; - - if (cbuf->y <= ntxy->y1 + 1) - ntxy->y1= cbuf->y - 1; - - if (cbuf->x <= ntxy->x2 + 1) - ntxy->x2= cbuf->x - 1; - - if (cbuf->y <= ntxy->y2 + 1) - ntxy->y2= cbuf->y - 1; - - /* figure out the minimums and maximums */ - outputrect.xmax=MAX2(ntxy->x1, ntxy->x2) + 1; - outputrect.xmin=MIN2(ntxy->x1, ntxy->x2); - outputrect.ymax=MAX2(ntxy->y1, ntxy->y2) + 1; - outputrect.ymin=MIN2(ntxy->y1, ntxy->y2); - - if (node->custom1) { - /* this option crops the image size too */ - stackbuf= get_cropped_compbuf(&outputrect, cbuf->rect, cbuf->x, cbuf->y, cbuf->type); - } - else { - /* this option won't crop the size of the image as well */ - /* allocate memory for the output image */ - stackbuf = alloc_compbuf(cbuf->x, cbuf->y, cbuf->type, 1); - - /* select the cropped part of the image and set it to the output */ - for (y=outputrect.ymin; y<outputrect.ymax; y++) { - srcfp= cbuf->rect + (y * cbuf->x + outputrect.xmin) * cbuf->type; - outfp= stackbuf->rect + (y * stackbuf->x + outputrect.xmin) * stackbuf->type; - for (x=outputrect.xmin; x<outputrect.xmax; x++, outfp+= stackbuf->type, srcfp+= cbuf->type) - memcpy(outfp, srcfp, sizeof(float)*stackbuf->type); - } - } - - out[0]->data= stackbuf; - } -} - -#endif /* WITH_COMPOSITOR_LEGACY */ - static void node_composit_init_crop(bNodeTree *UNUSED(ntree), bNode *node, bNodeTemplate *UNUSED(ntemp)) { NodeTwoXYs *nxy= MEM_callocN(sizeof(NodeTwoXYs), "node xy data"); @@ -124,9 +62,6 @@ void register_node_type_cmp_crop(bNodeTreeType *ttype) node_type_size(&ntype, 140, 100, 320); node_type_init(&ntype, node_composit_init_crop); node_type_storage(&ntype, "NodeTwoXYs", node_free_standard_storage, node_copy_standard_storage); -#ifdef WITH_COMPOSITOR_LEGACY - node_type_exec(&ntype, node_composit_exec_crop); -#endif nodeRegisterType(ttype, &ntype); } diff --git a/source/blender/nodes/composite/nodes/node_composite_curves.c b/source/blender/nodes/composite/nodes/node_composite_curves.c index a1999ec8887..9f40159baf3 100644 --- a/source/blender/nodes/composite/nodes/node_composite_curves.c +++ b/source/blender/nodes/composite/nodes/node_composite_curves.c @@ -41,25 +41,6 @@ static bNodeSocketTemplate cmp_node_time_out[] = { { -1, 0, "" } }; -#ifdef WITH_COMPOSITOR_LEGACY - -static void node_composit_exec_curves_time(void *data, bNode *node, bNodeStack **UNUSED(in), bNodeStack **out) -{ - RenderData *rd= data; - /* stack order output: fac */ - float fac= 0.0f; - - if (node->custom1 < node->custom2) - fac= (rd->cfra - node->custom1)/(float)(node->custom2-node->custom1); - - curvemapping_initialize(node->storage); - fac = curvemapping_evaluateF(node->storage, 0, fac); - - out[0]->vec[0] = CLAMPIS(fac, 0.0f, 1.0f); -} - -#endif /* WITH_COMPOSITOR_LEGACY */ - static void node_composit_init_curves_time(bNodeTree *UNUSED(ntree), bNode *node, bNodeTemplate *UNUSED(ntemp)) { node->custom1= 1; @@ -76,9 +57,6 @@ void register_node_type_cmp_curve_time(bNodeTreeType *ttype) node_type_size(&ntype, 140, 100, 320); node_type_init(&ntype, node_composit_init_curves_time); node_type_storage(&ntype, "CurveMapping", node_free_curves, node_copy_curves); -#ifdef WITH_COMPOSITOR_LEGACY - node_type_exec(&ntype, node_composit_exec_curves_time); -#endif nodeRegisterType(ttype, &ntype); } @@ -96,19 +74,6 @@ static bNodeSocketTemplate cmp_node_curve_vec_out[] = { { -1, 0, "" } }; -#ifdef WITH_COMPOSITOR_LEGACY - -static void node_composit_exec_curve_vec(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out) -{ - /* stack order input: vec */ - /* stack order output: vec */ - - curvemapping_initialize(node->storage); - curvemapping_evaluate_premulRGBF(node->storage, out[0]->vec, in[0]->vec); -} - -#endif /* WITH_COMPOSITOR_LEGACY */ - static void node_composit_init_curve_vec(bNodeTree *UNUSED(ntree), bNode *node, bNodeTemplate *UNUSED(ntemp)) { node->storage= curvemapping_add(3, -1.0f, -1.0f, 1.0f, 1.0f); @@ -123,9 +88,6 @@ void register_node_type_cmp_curve_vec(bNodeTreeType *ttype) node_type_size(&ntype, 200, 140, 320); node_type_init(&ntype, node_composit_init_curve_vec); node_type_storage(&ntype, "CurveMapping", node_free_curves, node_copy_curves); -#ifdef WITH_COMPOSITOR_LEGACY - node_type_exec(&ntype, node_composit_exec_curve_vec); -#endif nodeRegisterType(ttype, &ntype); } @@ -145,67 +107,6 @@ static bNodeSocketTemplate cmp_node_curve_rgb_out[] = { { -1, 0, "" } }; -#ifdef WITH_COMPOSITOR_LEGACY - -static void do_curves(bNode *node, float *out, float *in) -{ - curvemapping_initialize(node->storage); - curvemapping_evaluate_premulRGBF(node->storage, out, in); - out[3] = in[3]; -} - -static void do_curves_fac(bNode *node, float *out, float *in, float *fac) -{ - curvemapping_initialize(node->storage); - - if (*fac >= 1.0f) - curvemapping_evaluate_premulRGBF(node->storage, out, in); - else if (*fac <= 0.0f) { - copy_v3_v3(out, in); - } - else { - float col[4], mfac= 1.0f-*fac; - curvemapping_evaluate_premulRGBF(node->storage, col, in); - out[0] = mfac*in[0] + *fac*col[0]; - out[1] = mfac*in[1] + *fac*col[1]; - out[2] = mfac*in[2] + *fac*col[2]; - } - out[3] = in[3]; -} - -static void node_composit_exec_curve_rgb(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out) -{ - /* stack order input: fac, image, black level, white level */ - /* stack order output: image */ - - if (out[0]->hasoutput==0) - return; - - curvemapping_initialize(node->storage); - - /* input no image? then only color operation */ - if (in[1]->data==NULL) { - curvemapping_evaluateRGBF(node->storage, out[0]->vec, in[1]->vec); - } - else { - /* make output size of input image */ - CompBuf *cbuf= in[1]->data; - CompBuf *stackbuf= alloc_compbuf(cbuf->x, cbuf->y, CB_RGBA, 1); /* allocs */ - - curvemapping_set_black_white(node->storage, in[2]->vec, in[3]->vec); - - if (in[0]->data==NULL && in[0]->vec[0] == 1.0f) - composit1_pixel_processor(node, stackbuf, in[1]->data, in[1]->vec, do_curves, CB_RGBA); - else - composit2_pixel_processor(node, stackbuf, in[1]->data, in[1]->vec, in[0]->data, in[0]->vec, do_curves_fac, CB_RGBA, CB_VAL); - - out[0]->data= stackbuf; - } - -} - -#endif /* WITH_COMPOSITOR_LEGACY */ - static void node_composit_init_curve_rgb(bNodeTree *UNUSED(ntree), bNode *node, bNodeTemplate *UNUSED(ntemp)) { node->storage= curvemapping_add(4, 0.0f, 0.0f, 1.0f, 1.0f); @@ -220,9 +121,6 @@ void register_node_type_cmp_curve_rgb(bNodeTreeType *ttype) node_type_size(&ntype, 200, 140, 320); node_type_init(&ntype, node_composit_init_curve_rgb); node_type_storage(&ntype, "CurveMapping", node_free_curves, node_copy_curves); -#ifdef WITH_COMPOSITOR_LEGACY - node_type_exec(&ntype, node_composit_exec_curve_rgb); -#endif nodeRegisterType(ttype, &ntype); } diff --git a/source/blender/nodes/composite/nodes/node_composite_defocus.c b/source/blender/nodes/composite/nodes/node_composite_defocus.c index 27ce0f7c4a7..88787cc869e 100644 --- a/source/blender/nodes/composite/nodes/node_composite_defocus.c +++ b/source/blender/nodes/composite/nodes/node_composite_defocus.c @@ -44,830 +44,6 @@ static bNodeSocketTemplate cmp_node_defocus_out[] = { { -1, 0, "" } }; -#ifdef WITH_COMPOSITOR_LEGACY - -// line coefs for point sampling & scancon. data. -typedef struct BokehCoeffs { - float x0, y0, dx, dy; - float ls_x, ls_y; - float min_x, min_y, max_x, max_y; -} BokehCoeffs; - -// returns array of BokehCoeffs -// returns length of array in 'len_bkh', -// radius squared of inscribed disk in 'inradsq', needed in getWeight() test, -// BKH[8] is the data returned for the bokeh shape & bkh_b[4] is it's 2d bound -static void makeBokeh(char bktype, char ro, int* len_bkh, float* inradsq, BokehCoeffs BKH[8], float bkh_b[4]) -{ - float x0, x1, y0, y1, dx, dy, iDxy; - /* ro now is in radians. */ - float w = MAX2(1e-6f, ro); // never reported stangely enough, but a zero offset causes missing center line... - float wi = DEG2RADF(360.f/bktype); - int i, ov, nv; - - // bktype must be at least 3 & <= 8 - bktype = (bktype<3) ? 3 : ((bktype>8) ? 8 : bktype); - *len_bkh = bktype; - *inradsq = -1.f; - - for (i=0; i<(*len_bkh); i++) { - x0 = cos(w); - y0 = sin(w); - w += wi; - x1 = cos(w); - y1 = sin(w); - if ((*inradsq)<0.f) { - // radius squared of inscribed disk - float idx=(x0+x1)*0.5f, idy=(y0+y1)*0.5f; - *inradsq = idx*idx + idy*idy; - } - BKH[i].x0 = x0; - BKH[i].y0 = y0; - dx = x1-x0, dy = y1-y0; - iDxy = 1.f / sqrtf(dx*dx + dy*dy); - dx *= iDxy; - dy *= iDxy; - BKH[i].dx = dx; - BKH[i].dy = dy; - } - - // precalc scanconversion data - // bokeh bound, not transformed, for scanconvert - bkh_b[0] = bkh_b[2] = 1e10f; // xmin/ymin - bkh_b[1] = bkh_b[3] = -1e10f; // xmax/ymax - ov = (*len_bkh) - 1; - for (nv=0; nv<(*len_bkh); nv++) { - bkh_b[0] = MIN2(bkh_b[0], BKH[nv].x0); // xmin - bkh_b[1] = MAX2(bkh_b[1], BKH[nv].x0); // xmax - bkh_b[2] = MIN2(bkh_b[2], BKH[nv].y0); // ymin - bkh_b[3] = MAX2(bkh_b[3], BKH[nv].y0); // ymax - BKH[nv].min_x = MIN2(BKH[ov].x0, BKH[nv].x0); - BKH[nv].max_x = MAX2(BKH[ov].x0, BKH[nv].x0); - BKH[nv].min_y = MIN2(BKH[ov].y0, BKH[nv].y0); - BKH[nv].max_y = MAX2(BKH[ov].y0, BKH[nv].y0); - dy = BKH[nv].y0 - BKH[ov].y0; - BKH[nv].ls_x = (BKH[nv].x0 - BKH[ov].x0) / ((dy==0.f) ? 1.f : dy); - BKH[nv].ls_y = (BKH[nv].ls_x==0.f) ? 1.f : (1.f/BKH[nv].ls_x); - ov = nv; - } -} - -// test if u/v inside shape & returns weight value -static float getWeight(BokehCoeffs* BKH, int len_bkh, float u, float v, float rad, float inradsq) -{ - BokehCoeffs* bc = BKH; - float cdist, irad = (rad==0.f) ? 1.f : (1.f/rad); - u *= irad; - v *= irad; - - // early out test1: if point outside outer unit disk, it cannot be inside shape - cdist = u*u + v*v; - if (cdist>1.f) return 0.f; - - // early out test2: if point inside or on inner disk, point must be inside shape - if (cdist<=inradsq) return 1.f; - - while (len_bkh--) { - if ((bc->dy*(u - bc->x0) - bc->dx*(v - bc->y0)) > 0.f) return 0.f; - bc++; - } - return 1.f; -} - -// QMC.seq. for sampling, A.Keller, EMS -static float RI_vdC(unsigned int bits, unsigned int r) -{ - bits = ( bits << 16) | ( bits >> 16); - bits = ((bits & 0x00ff00ff) << 8) | ((bits & 0xff00ff00) >> 8); - bits = ((bits & 0x0f0f0f0f) << 4) | ((bits & 0xf0f0f0f0) >> 4); - bits = ((bits & 0x33333333) << 2) | ((bits & 0xcccccccc) >> 2); - bits = ((bits & 0x55555555) << 1) | ((bits & 0xaaaaaaaa) >> 1); - bits ^= r; - return (float)((double)bits / 4294967296.0); -} - -// single channel IIR gaussian filtering -// much faster than anything else, constant time independent of width -// should extend to multichannel and make this a node, could be useful -// note: this is an almost exact copy of 'IIR_gauss' -static void IIR_gauss_single(CompBuf *buf, float sigma) -{ - double q, q2, sc, cf[4], tsM[9], tsu[3], tsv[3]; - float *X, *Y, *W; - const unsigned int src_width = buf->x; - const unsigned int src_height = buf->y; - unsigned int i, x, y, sz; - - // single channel only for now - if (buf->type != CB_VAL) return; - - // <0.5 not valid, though can have a possibly useful sort of sharpening effect - if (sigma < 0.5f) return; - - // see "Recursive Gabor Filtering" by Young/VanVliet - // all factors here in double.prec. Required, because for single.prec it seems to blow up if sigma > ~200 - if (sigma >= 3.556f) - q = 0.9804f * (sigma - 3.556f) + 2.5091f; - else // sigma >= 0.5 - q = (0.0561f * sigma + 0.5784f) * sigma - 0.2568f; - q2 = q * q; - sc = (1.1668 + q) * (3.203729649 + (2.21566 + q) * q); - // no gabor filtering here, so no complex multiplies, just the regular coefs. - // all negated here, so as not to have to recalc Triggs/Sdika matrix - cf[1] = q * (5.788961737 + (6.76492 + 3.0 * q) * q) / sc; - cf[2] = -q2 * (3.38246 + 3.0 * q) / sc; - // 0 & 3 unchanged - cf[3] = q2 * q / sc; - cf[0] = 1.0 - cf[1] - cf[2] - cf[3]; - - // Triggs/Sdika border corrections, - // it seems to work, not entirely sure if it is actually totally correct, - // Besides J.M.Geusebroek's anigauss.c (see http://www.science.uva.nl/~mark), - // found one other implementation by Cristoph Lampert, - // but neither seem to be quite the same, result seems to be ok so far anyway. - // Extra scale factor here to not have to do it in filter, - // though maybe this had something to with the precision errors - sc = cf[0] / ((1.0 + cf[1] - cf[2] + cf[3]) * (1.0 - cf[1] - cf[2] - cf[3]) * (1.0 + cf[2] + (cf[1] - cf[3]) * cf[3])); - tsM[0] = sc * (-cf[3] * cf[1] + 1.0 - cf[3] * cf[3] - cf[2]); - tsM[1] = sc * ((cf[3] + cf[1]) * (cf[2] + cf[3] * cf[1])); - tsM[2] = sc * (cf[3] * (cf[1] + cf[3] * cf[2])); - tsM[3] = sc * (cf[1] + cf[3] * cf[2]); - tsM[4] = sc * (-(cf[2] - 1.0) * (cf[2] + cf[3] * cf[1])); - tsM[5] = sc * (-(cf[3] * cf[1] + cf[3] * cf[3] + cf[2] - 1.0) * cf[3]); - tsM[6] = sc * (cf[3] * cf[1] + cf[2] + cf[1] * cf[1] - cf[2] * cf[2]); - tsM[7] = sc * (cf[1] * cf[2] + cf[3] * cf[2] * cf[2] - cf[1] * cf[3] * cf[3] - cf[3] * cf[3] * cf[3] - cf[3] * cf[2] + cf[3]); - tsM[8] = sc * (cf[3] * (cf[1] + cf[3] * cf[2])); - -#define YVV(L) \ -{ \ - W[0] = cf[0] * X[0] + cf[1] * X[0] + cf[2] * X[0] + cf[3] * X[0]; \ - W[1] = cf[0] * X[1] + cf[1] * W[0] + cf[2] * X[0] + cf[3] * X[0]; \ - W[2] = cf[0] * X[2] + cf[1] * W[1] + cf[2] * W[0] + cf[3] * X[0]; \ - for (i = 3; i < L; i++) { \ - W[i] = cf[0] * X[i] + cf[1] * W[i - 1] + cf[2] * W[i - 2] + cf[3] * W[i - 3]; \ - } \ - tsu[0] = W[L - 1] - X[L - 1]; \ - tsu[1] = W[L - 2] - X[L - 1]; \ - tsu[2] = W[L - 3] - X[L - 1]; \ - tsv[0] = tsM[0] * tsu[0] + tsM[1] * tsu[1] + tsM[2] * tsu[2] + X[L - 1]; \ - tsv[1] = tsM[3] * tsu[0] + tsM[4] * tsu[1] + tsM[5] * tsu[2] + X[L - 1]; \ - tsv[2] = tsM[6] * tsu[0] + tsM[7] * tsu[1] + tsM[8] * tsu[2] + X[L - 1]; \ - Y[L - 1] = cf[0] * W[L - 1] + cf[1] * tsv[0] + cf[2] * tsv[1] + cf[3] * tsv[2]; \ - Y[L - 2] = cf[0] * W[L - 2] + cf[1] * Y[L - 1] + cf[2] * tsv[0] + cf[3] * tsv[1]; \ - Y[L - 3] = cf[0] * W[L - 3] + cf[1] * Y[L - 2] + cf[2] * Y[L - 1] + cf[3] * tsv[0]; \ - /* 'i != UINT_MAX' is really 'i >= 0', but necessary for unsigned int wrapping */ \ - for (i = L - 4; i != UINT_MAX; i--) { \ - Y[i] = cf[0] * W[i] + cf[1] * Y[i + 1] + cf[2] * Y[i + 2] + cf[3] * Y[i + 3]; \ - } \ -} (void)0 - - // intermediate buffers - sz = MAX2(src_width, src_height); - Y = MEM_callocN(sz * sizeof(float), "IIR_gauss Y buf"); - W = MEM_callocN(sz * sizeof(float), "IIR_gauss W buf"); - // H - for (y = 0; y < src_height; y++) { - X = &buf->rect[y * src_width]; - YVV(src_width); - memcpy(X, Y, sizeof(float) * src_width); - } - // V - X = MEM_callocN(src_height * sizeof(float), "IIR_gauss X buf"); - for (x = 0; x < src_width; x++) { - for (y = 0; y < src_height; y++) - X[y] = buf->rect[x + y * src_width]; - YVV(src_height); - for (y = 0; y < src_height; y++) - buf->rect[x + y * src_width] = Y[y]; - } - MEM_freeN(X); - - MEM_freeN(W); - MEM_freeN(Y); -#undef YVV -} - -static void defocus_blur(bNode *node, CompBuf *new, CompBuf *img, CompBuf *zbuf, float inpval, int no_zbuf) -{ - NodeDefocus *nqd = node->storage; - CompBuf *wts; // weights buffer - CompBuf *crad; // CoC radius buffer - BokehCoeffs BKH[8]; // bokeh shape data, here never > 8 pts. - float bkh_b[4] = {0}; // shape 2D bound - float cam_fdist=1, cam_invfdist=1, cam_lens=35; - float cam_sensor = DEFAULT_SENSOR_WIDTH; - float dof_sp, maxfgc, bk_hn_theta=0, inradsq=0; - int y, len_bkh=0, ydone = FALSE; - float aspect, aperture; - int minsz; - //float bcrad, nmaxc, scf; - - // get some required params from the current scene camera - // (ton) this is wrong, needs fixed - Scene *scene= (Scene*)node->id; - Object* camob = (scene)? scene->camera: NULL; - if (camob && camob->type==OB_CAMERA) { - Camera* cam = (Camera*)camob->data; - cam_lens = cam->lens; - cam_fdist = BKE_camera_object_dof_distance(camob); - cam_sensor = BKE_camera_sensor_size(cam->sensor_fit, cam->sensor_x, cam->sensor_y); - if (cam_fdist == 0.0f) cam_fdist = 1e10f; /* if the dof is 0.0 then set it be be far away */ - cam_invfdist = 1.f / cam_fdist; - } - // guess work here.. best match with raytraced result - minsz = MIN2(img->x, img->y); - dof_sp = (float)minsz / ((cam_sensor / 2.0f) / cam_lens); // <- == aspect * MIN2(img->x, img->y) / tan(0.5f * fov); - - // aperture - aspect = (img->x > img->y) ? (img->y / (float)img->x) : (img->x / (float)img->y); - aperture = 0.5f * (cam_lens / (aspect * cam_sensor)) / nqd->fstop; - - // if not disk, make bokeh coefficients and other needed data - if (nqd->bktype!=0) { - makeBokeh(nqd->bktype, nqd->rotation, &len_bkh, &inradsq, BKH, bkh_b); - bk_hn_theta = 0.5 * nqd->bktype * sin(2.0 * M_PI / nqd->bktype); // weight factor - } - - // accumulated weights - wts = alloc_compbuf(img->x, img->y, CB_VAL, 1); - // CoC radius buffer - crad = alloc_compbuf(img->x, img->y, CB_VAL, 1); - - // if 'no_zbuf' flag set (which is always set if input is not an image), - // values are instead interpreted directly as blur radius values - if (no_zbuf) { - // to prevent *reaaallly* big radius values and impossible calculation times, - // limit the maximum to half the image width or height, whichever is smaller - float maxr = 0.5f*(float)MIN2(img->x, img->y); - unsigned int p; - - for (p=0; p<(unsigned int)(img->x*img->y); p++) { - crad->rect[p] = zbuf ? (zbuf->rect[p]*nqd->scale) : inpval; - // bug #5921, limit minimum - crad->rect[p] = MAX2(1e-5f, crad->rect[p]); - crad->rect[p] = MIN2(crad->rect[p], maxr); - // if maxblur!=0, limit maximum - if (nqd->maxblur != 0.f) crad->rect[p] = MIN2(crad->rect[p], nqd->maxblur); - } - } - else { - float wt; - - // actual zbuffer. - // separate foreground from background CoC's - // then blur background and blend in again with foreground, - // improves the 'blurred foreground overlapping in-focus midground' sharp boundary problem. - // wts buffer here used for blendmask - maxfgc = 0.f; // maximum foreground CoC radius - for (y=0; y<img->y; y++) { - unsigned int p = y * img->x; - int x; - for (x=0; x<img->x; x++) { - unsigned int px = p + x; - float iZ = (zbuf->rect[px]==0.f) ? 0.f : (1.f/zbuf->rect[px]); - crad->rect[px] = 0.5f*(aperture*(dof_sp*(cam_invfdist - iZ) - 1.f)); - if (crad->rect[px] <= 0.f) { - wts->rect[px] = 1.f; - crad->rect[px] = -crad->rect[px]; - if (crad->rect[px] > maxfgc) maxfgc = crad->rect[px]; - } - else crad->rect[px] = wts->rect[px] = 0; - } - } - - // fast blur... - // bug #6656 part 1, probably when previous node_composite.c was split into separate files, it was not properly updated - // to include recent cvs commits (well, at least not defocus node), so this part was missing... - wt = min_ff(nqd->maxblur, aperture * 128.0f); - IIR_gauss_single(crad, wt); - IIR_gauss_single(wts, wt); - - // bug #6656 part 2a, although foreground blur is not based anymore on closest object, - // the rescaling op below was still based on that anyway, and unlike the comment in below code, - // the difference is therefore not always that small at all... - // so for now commented out, not sure if this is going to cause other future problems, lets just wait and see... - /* - // find new maximum to scale it back to original - // (could skip this, not strictly necessary, in general, difference is quite small, but just in case...) - nmaxc = 0; - for (p=0; p<(img->x*img->y); p++) - if (crad->rect[p] > nmaxc) nmaxc = crad->rect[p]; - // rescale factor - scf = (nmaxc==0.f) ? 1.f: (maxfgc / nmaxc); - */ - - // and blend... - for (y=0; y<img->y; y++) { - unsigned int p = y*img->x; - int x; - - for (x=0; x<img->x; x++) { - unsigned px = p + x; - if (zbuf->rect[px]!=0.f) { - float iZ = (zbuf->rect[px]==0.f) ? 0.f : (1.f/zbuf->rect[px]); - - // bug #6656 part 2b, do not rescale - /* - bcrad = 0.5f*fabs(aperture*(dof_sp*(cam_invfdist - iZ) - 1.f)); - // scale crad back to original maximum and blend - crad->rect[px] = bcrad + wts->rect[px]*(scf*crad->rect[px] - bcrad); - */ - crad->rect[px] = 0.5f*fabsf(aperture*(dof_sp*(cam_invfdist - iZ) - 1.f)); - - // 'bug' #6615, limit minimum radius to 1 pixel, not really a solution, but somewhat mitigates the problem - crad->rect[px] = MAX2(crad->rect[px], 0.5f); - // if maxblur!=0, limit maximum - if (nqd->maxblur != 0.f) crad->rect[px] = MIN2(crad->rect[px], nqd->maxblur); - } - else crad->rect[px] = 0.f; - // clear weights for next part - wts->rect[px] = 0.f; - } - // esc set by main calling process - if (node->exec & NODE_BREAK) - break; - } - } - - //------------------------------------------------------------------ - // main loop -#ifndef __APPLE__ /* can crash on Mac, see bug #22856, disabled for now */ -#ifdef __INTEL_COMPILER /* icc doesn't like the compound statement -- internal error: 0_1506 */ - #pragma omp parallel for private(y) if (!nqd->preview) schedule(guided) -#else - #pragma omp parallel for private(y) if (!nqd->preview && img->y*img->x > 16384) schedule(guided) -#endif -#endif - for (y=0; y<img->y; y++) { - unsigned int p, p4, zp, cp, cp4; - float *ctcol, u, v, ct_crad, cR2=0; - int x, sx, sy; - - // some sort of visual feedback would be nice, or at least this text in the renderwin header - // but for now just print some info in the console every 8 scanlines. - #pragma omp critical - { - if (((ydone & 7)==0) || (ydone==(img->y-1))) { - if (G.background==0) { - printf("\rdefocus: Processing Line %d of %d ... ", ydone+1, img->y); - fflush(stdout); - } - } - - ydone++; - } - - // esc set by main calling process. don't break because openmp doesn't - // allow it, just continue and do nothing - if (node->exec & NODE_BREAK) - continue; - - zp = y * img->x; - for (x=0; x<img->x; x++) { - cp = zp + x; - cp4 = cp * img->type; - - // Circle of Confusion radius for current pixel - cR2 = ct_crad = crad->rect[cp]; - // skip if zero (border render) - if (ct_crad==0.f) { - // related to bug #5921, forgot output image when skipping 0 radius values - new->rect[cp4] = img->rect[cp4]; - if (new->type != CB_VAL) { - new->rect[cp4+1] = img->rect[cp4+1]; - new->rect[cp4+2] = img->rect[cp4+2]; - new->rect[cp4+3] = img->rect[cp4+3]; - } - continue; - } - cR2 *= cR2; - - // pixel color - ctcol = &img->rect[cp4]; - - if (!nqd->preview) { - int xs, xe, ys, ye; - float lwt, wtcol[4] = {0}, aacol[4] = {0}; - float wt; - - // shape weight - if (nqd->bktype==0) // disk - wt = 1.f/((float)M_PI*cR2); - else - wt = 1.f/(cR2*bk_hn_theta); - - // weighted color - wtcol[0] = wt*ctcol[0]; - if (new->type != CB_VAL) { - wtcol[1] = wt*ctcol[1]; - wtcol[2] = wt*ctcol[2]; - wtcol[3] = wt*ctcol[3]; - } - - // macro for background blur overlap test - // unfortunately, since this is done per pixel, - // it has a very significant negative impact on processing time... - // (eg. aa disk blur without test: 112 sec, vs with test: 176 sec...) - // iff center blur radius > threshold - // and if overlap pixel in focus, do nothing, else add color/weigbt - // (threshold constant is dependent on amount of blur) - #define TESTBG1(c, w) {\ - if (ct_crad > nqd->bthresh) {\ - if (crad->rect[p] > nqd->bthresh) {\ - new->rect[p] += c[0];\ - wts->rect[p] += w;\ - }\ - }\ - else {\ - new->rect[p] += c[0];\ - wts->rect[p] += w;\ - }\ - } - #define TESTBG4(c, w) {\ - if (ct_crad > nqd->bthresh) {\ - if (crad->rect[p] > nqd->bthresh) {\ - new->rect[p4] += c[0];\ - new->rect[p4+1] += c[1];\ - new->rect[p4+2] += c[2];\ - new->rect[p4+3] += c[3];\ - wts->rect[p] += w;\ - }\ - }\ - else {\ - new->rect[p4] += c[0];\ - new->rect[p4+1] += c[1];\ - new->rect[p4+2] += c[2];\ - new->rect[p4+3] += c[3];\ - wts->rect[p] += w;\ - }\ - } - if (nqd->bktype == 0) { - // Disk - int _x, i, j, di; - float Dj, T; - // AA pixel - #define AAPIX(a, b) {\ - int _ny = b;\ - if ((_ny >= 0) && (_ny < new->y)) {\ - int _nx = a;\ - if ((_nx >=0) && (_nx < new->x)) {\ - p = _ny*new->x + _nx;\ - if (new->type==CB_VAL) {\ - TESTBG1(aacol, lwt);\ - }\ - else {\ - p4 = p * new->type;\ - TESTBG4(aacol, lwt);\ - }\ - }\ - }\ - } - // circle scanline - #define CSCAN(a, b) {\ - int _ny = y + b;\ - if ((_ny >= 0) && (_ny < new->y)) {\ - xs = x - a + 1;\ - if (xs < 0) xs = 0;\ - xe = x + a;\ - if (xe > new->x) xe = new->x;\ - p = _ny*new->x + xs;\ - if (new->type==CB_VAL) {\ - for (_x=xs; _x<xe; _x++, p++) TESTBG1(wtcol, wt);\ - }\ - else {\ - p4 = p * new->type;\ - for (_x=xs; _x<xe; _x++, p++, p4+=new->type) TESTBG4(wtcol, wt);\ - }\ - }\ - } - - i = ceil(ct_crad); - j = 0; - T = 0; - while (i > j) { - Dj = sqrt(cR2 - j*j); - Dj -= floorf(Dj); - di = 0; - if (Dj > T) { i--; di = 1; } - T = Dj; - aacol[0] = wtcol[0]*Dj; - if (new->type != CB_VAL) { - aacol[1] = wtcol[1]*Dj; - aacol[2] = wtcol[2]*Dj; - aacol[3] = wtcol[3]*Dj; - } - lwt = wt*Dj; - if (i!=j) { - // outer pixels - AAPIX(x+j, y+i) - AAPIX(x+j, y-i) - if (j) { - AAPIX(x-j, y+i) // BL - AAPIX(x-j, y-i) // TL - } - if (di) { // only when i changed, interior of outer section - CSCAN(j, i) // bottom - CSCAN(j, -i) // top - } - } - // lower mid section - AAPIX(x+i, y+j) - if (i) AAPIX(x-i, y+j) - CSCAN(i, j) - // upper mid section - if (j) { - AAPIX(x+i, y-j) - if (i) AAPIX(x-i, y-j) - CSCAN(i, -j) - } - j++; - } - #undef CSCAN - #undef AAPIX - } - else { - // n-agonal - int ov, nv; - float mind, maxd, lwt; - ys = max_ii((int)floor(bkh_b[2] * ct_crad + y), 0); - ye = min_ii((int)ceil(bkh_b[3] * ct_crad + y), new->y - 1); - for (sy=ys; sy<=ye; sy++) { - float fxs = 1e10f, fxe = -1e10f; - float yf = (sy - y)/ct_crad; - int found = 0; - ov = len_bkh - 1; - mind = maxd = 0; - for (nv=0; nv<len_bkh; nv++) { - if ((BKH[nv].max_y >= yf) && (BKH[nv].min_y <= yf)) { - float tx = BKH[ov].x0 + BKH[nv].ls_x*(yf - BKH[ov].y0); - if (tx < fxs) { fxs = tx; mind = BKH[nv].ls_x; } - if (tx > fxe) { fxe = tx; maxd = BKH[nv].ls_x; } - if (++found == 2) break; - } - ov = nv; - } - if (found) { - fxs = fxs*ct_crad + x; - fxe = fxe*ct_crad + x; - xs = (int)floor(fxs), xe = (int)ceil(fxe); - // AA hack for first and last x pixel, near vertical edges only - if (fabsf(mind) <= 1.f) { - if ((xs >= 0) && (xs < new->x)) { - lwt = 1.f-(fxs - xs); - aacol[0] = wtcol[0]*lwt; - p = xs + sy*new->x; - if (new->type==CB_VAL) { - lwt *= wt; - TESTBG1(aacol, lwt); - } - else { - p4 = p * new->type; - aacol[1] = wtcol[1]*lwt; - aacol[2] = wtcol[2]*lwt; - aacol[3] = wtcol[3]*lwt; - lwt *= wt; - TESTBG4(aacol, lwt); - } - } - } - if (fabsf(maxd) <= 1.f) { - if ((xe >= 0) && (xe < new->x)) { - lwt = 1.f-(xe - fxe); - aacol[0] = wtcol[0]*lwt; - p = xe + sy*new->x; - if (new->type==CB_VAL) { - lwt *= wt; - TESTBG1(aacol, lwt); - } - else { - p4 = p * new->type; - aacol[1] = wtcol[1]*lwt; - aacol[2] = wtcol[2]*lwt; - aacol[3] = wtcol[3]*lwt; - lwt *= wt; - TESTBG4(aacol, lwt); - } - } - } - xs = MAX2(xs+1, 0); - xe = MIN2(xe, new->x); - // remaining interior scanline - p = sy*new->x + xs; - if (new->type==CB_VAL) { - for (sx=xs; sx<xe; sx++, p++) TESTBG1(wtcol, wt); - } - else { - p4 = p * new->type; - for (sx=xs; sx<xe; sx++, p++, p4+=new->type) TESTBG4(wtcol, wt); - } - } - } - - // now traverse in opposite direction, y scanlines, - // but this time only draw the near horizontal edges, - // applying same AA hack as above - xs = MAX2((int)floor(bkh_b[0]*ct_crad + x), 0); - xe = MIN2((int)ceil(bkh_b[1]*ct_crad + x), img->x - 1); - for (sx=xs; sx<=xe; sx++) { - float xf = (sx - x)/ct_crad; - float fys = 1e10f, fye = -1e10f; - int found = 0; - ov = len_bkh - 1; - mind = maxd = 0; - for (nv=0; nv<len_bkh; nv++) { - if ((BKH[nv].max_x >= xf) && (BKH[nv].min_x <= xf)) { - float ty = BKH[ov].y0 + BKH[nv].ls_y*(xf - BKH[ov].x0); - if (ty < fys) { fys = ty; mind = BKH[nv].ls_y; } - if (ty > fye) { fye = ty; maxd = BKH[nv].ls_y; } - if (++found == 2) break; - } - ov = nv; - } - if (found) { - fys = fys*ct_crad + y; - fye = fye*ct_crad + y; - // near horizontal edges only, line slope <= 1 - if (fabsf(mind) <= 1.f) { - int iys = (int)floor(fys); - if ((iys >= 0) && (iys < new->y)) { - lwt = 1.f - (fys - iys); - aacol[0] = wtcol[0]*lwt; - p = sx + iys*new->x; - if (new->type==CB_VAL) { - lwt *= wt; - TESTBG1(aacol, lwt); - } - else { - p4 = p * new->type; - aacol[1] = wtcol[1]*lwt; - aacol[2] = wtcol[2]*lwt; - aacol[3] = wtcol[3]*lwt; - lwt *= wt; - TESTBG4(aacol, lwt); - } - } - } - if (fabsf(maxd) <= 1.f) { - int iye = ceil(fye); - if ((iye >= 0) && (iye < new->y)) { - lwt = 1.f - (iye - fye); - aacol[0] = wtcol[0]*lwt; - p = sx + iye*new->x; - if (new->type==CB_VAL) { - lwt *= wt; - TESTBG1(aacol, lwt); - } - else { - p4 = p * new->type; - aacol[1] = wtcol[1]*lwt; - aacol[2] = wtcol[2]*lwt; - aacol[3] = wtcol[3]*lwt; - lwt *= wt; - TESTBG4(aacol, lwt); - } - } - } - } - } - - } - #undef TESTBG4 - #undef TESTBG1 - - } - else { - // sampled, simple rejection sampling here, good enough - unsigned int maxsam, s, ui = BLI_rand()*BLI_rand(); - float wcor, cpr = BLI_frand(), lwt; - if (no_zbuf) - maxsam = nqd->samples; // no zbuffer input, use sample value directly - else { - // depth adaptive sampling hack, the more out of focus, the more samples taken, 16 minimum. - maxsam = (int)(0.5f + nqd->samples*(1.f-(float)exp(-fabs(zbuf->rect[cp] - cam_fdist)))); - if (maxsam < 16) maxsam = 16; - } - wcor = 1.f/(float)maxsam; - for (s=0; s<maxsam; ++s) { - u = ct_crad*(2.f*RI_vdC(s, ui) - 1.f); - v = ct_crad*(2.f*(s + cpr)/(float)maxsam - 1.f); - sx = (int)(x + u + 0.5f), sy = (int)(y + v + 0.5f); - if ((sx<0) || (sx >= new->x) || (sy<0) || (sy >= new->y)) continue; - p = sx + sy*new->x; - p4 = p * new->type; - if (nqd->bktype==0) // Disk - lwt = ((u*u + v*v)<=cR2) ? wcor : 0.f; - else /* AA not needed here */ - lwt = wcor * getWeight(BKH, len_bkh, u, v, ct_crad, inradsq); - // prevent background bleeding onto in-focus pixels, user-option - if (ct_crad > nqd->bthresh) { // if center blur > threshold - if (crad->rect[p] > nqd->bthresh) { // if overlap pixel in focus, do nothing, else add color/weigbt - new->rect[p4] += ctcol[0] * lwt; - if (new->type != CB_VAL) { - new->rect[p4+1] += ctcol[1] * lwt; - new->rect[p4+2] += ctcol[2] * lwt; - new->rect[p4+3] += ctcol[3] * lwt; - } - wts->rect[p] += lwt; - } - } - else { - new->rect[p4] += ctcol[0] * lwt; - if (new->type != CB_VAL) { - new->rect[p4+1] += ctcol[1] * lwt; - new->rect[p4+2] += ctcol[2] * lwt; - new->rect[p4+3] += ctcol[3] * lwt; - } - wts->rect[p] += lwt; - } - } - } - - } - } - - // finally, normalize - for (y=0; y<new->y; y++) { - unsigned int p = y * new->x; - unsigned int p4 = p * new->type; - int x; - - for (x=0; x<new->x; x++) { - float dv = (wts->rect[p]==0.f) ? 1.f : (1.f/wts->rect[p]); - new->rect[p4] *= dv; - if (new->type!=CB_VAL) { - new->rect[p4+1] *= dv; - new->rect[p4+2] *= dv; - new->rect[p4+3] *= dv; - } - p++; - p4 += new->type; - } - } - - free_compbuf(crad); - free_compbuf(wts); - - printf("Done\n"); -} - - -static void node_composit_exec_defocus(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out) -{ - CompBuf *new, *old, *zbuf_use = NULL, *img = in[0]->data, *zbuf = in[1]->data; - NodeDefocus *nqd = node->storage; - int no_zbuf = nqd->no_zbuf; - - if ((img==NULL) || (out[0]->hasoutput==0)) return; - - // if image not valid type or fstop==infinite (128), nothing to do, pass in to out - if (((img->type!=CB_RGBA) && (img->type!=CB_VAL)) || ((no_zbuf==0) && (nqd->fstop==128.f))) { - out[0]->data = pass_on_compbuf(img); - return; - } - - if (zbuf!=NULL) { - // Zbuf input, check to make sure, single channel, same size - // doesn't have to be actual zbuffer, but must be value type - if ((zbuf->x != img->x) || (zbuf->y != img->y)) { - // could do a scale here instead... - printf("Z input must be same size as image !\n"); - return; - } - zbuf_use = typecheck_compbuf(zbuf, CB_VAL); - } - else no_zbuf = 1; // no zbuffer input - - // ok, process - old = img; - if (nqd->gamco) { - // gamma correct, blender func is simplified, fixed value & RGBA only, - // should make user param. also depremul and premul afterwards, gamma - // correction can't work with premul alpha - old = dupalloc_compbuf(img); - premul_compbuf(old, 1); - gamma_correct_compbuf(old, 0); - premul_compbuf(old, 0); - } - - new = alloc_compbuf(old->x, old->y, old->type, 1); - defocus_blur(node, new, old, zbuf_use, in[1]->vec[0]*nqd->scale, no_zbuf); - - if (nqd->gamco) { - premul_compbuf(new, 1); - gamma_correct_compbuf(new, 1); - premul_compbuf(new, 0); - free_compbuf(old); - } - if (node->exec & NODE_BREAK) { - free_compbuf(new); - new= NULL; - } - out[0]->data = new; - if (zbuf_use && (zbuf_use != zbuf)) free_compbuf(zbuf_use); -} - -#endif /* WITH_COMPOSITOR_LEGACY */ - static void node_composit_init_defocus(bNodeTree *UNUSED(ntree), bNode *node, bNodeTemplate *UNUSED(ntemp)) { /* qdn: defocus node */ @@ -894,9 +70,6 @@ void register_node_type_cmp_defocus(bNodeTreeType *ttype) node_type_size(&ntype, 150, 120, 200); node_type_init(&ntype, node_composit_init_defocus); node_type_storage(&ntype, "NodeDefocus", node_free_standard_storage, node_copy_standard_storage); -#ifdef WITH_COMPOSITOR_LEGACY - node_type_exec(&ntype, node_composit_exec_defocus); -#endif nodeRegisterType(ttype, &ntype); } diff --git a/source/blender/nodes/composite/nodes/node_composite_despeckle.c b/source/blender/nodes/composite/nodes/node_composite_despeckle.c index 9d47e4bc276..8fc97ef6a86 100644 --- a/source/blender/nodes/composite/nodes/node_composite_despeckle.c +++ b/source/blender/nodes/composite/nodes/node_composite_despeckle.c @@ -42,15 +42,6 @@ static bNodeSocketTemplate cmp_node_despeckle_out[] = { { -1, 0, "" } }; -#ifdef WITH_COMPOSITOR_LEGACY - -static void node_composit_exec_despeckle(void *UNUSED(data), bNode *UNUSED(node), bNodeStack **UNUSED(in), bNodeStack **UNUSED(out)) -{ - /* pass */ -} - -#endif /* WITH_COMPOSITOR_LEGACY */ - static void node_composit_init_despeckle(bNodeTree *UNUSED(ntree), bNode *node, bNodeTemplate *UNUSED(ntemp)) { node->custom3 = 0.5f; @@ -65,9 +56,6 @@ void register_node_type_cmp_despeckle(bNodeTreeType *ttype) node_type_socket_templates(&ntype, cmp_node_despeckle_in, cmp_node_despeckle_out); node_type_size(&ntype, 80, 40, 120); node_type_init(&ntype, node_composit_init_despeckle); -#ifdef WITH_COMPOSITOR_LEGACY - node_type_exec(&ntype, node_composit_exec_despeckle); -#endif nodeRegisterType(ttype, &ntype); } diff --git a/source/blender/nodes/composite/nodes/node_composite_diffMatte.c b/source/blender/nodes/composite/nodes/node_composite_diffMatte.c index 014b72d3c60..bcfd9dd768b 100644 --- a/source/blender/nodes/composite/nodes/node_composite_diffMatte.c +++ b/source/blender/nodes/composite/nodes/node_composite_diffMatte.c @@ -45,91 +45,6 @@ static bNodeSocketTemplate cmp_node_diff_matte_out[] = { {-1, 0, ""} }; -#ifdef WITH_COMPOSITOR_LEGACY - -static void do_diff_matte(bNode *node, float *outColor, float *inColor1, float *inColor2) -{ - NodeChroma *c= (NodeChroma *)node->storage; - float tolerance=c->t1; - float fper=c->t2; - /* get falloff amount over tolerance size */ - float falloff=(1.0f-fper) * tolerance; - float difference; - float alpha; - float maxInputAlpha; - - /* average together the distances */ - difference= fabs(inColor2[0]-inColor1[0]) + - fabs(inColor2[1]-inColor1[1]) + - fabs(inColor2[2]-inColor1[2]); - difference=difference/3.0f; - - copy_v3_v3(outColor, inColor1); - - if (difference <= tolerance) { - if (difference <= falloff) { - alpha = 0.0f; - } - else { - /* alpha as percent (distance / tolerance), each modified by falloff amount (in pixels)*/ - alpha=(difference-falloff)/(tolerance-falloff); - } - - /*only change if more transparent than either image */ - maxInputAlpha=max_ff(inColor1[3], inColor2[3]); - if (alpha < maxInputAlpha) { - /*clamp*/ - if (alpha < 0.0f) alpha = 0.0f; - if (alpha > 1.0f) alpha = 1.0f; - outColor[3] = alpha; - } - else { /* leave as before */ - outColor[3]=maxInputAlpha; - } - } -} - -static void node_composit_exec_diff_matte(void *data, bNode *node, bNodeStack **in, bNodeStack **out) -{ - CompBuf *outbuf= NULL; - CompBuf *imbuf1= NULL; - CompBuf *imbuf2= NULL; - /* NodeChroma *c; */ /* UNUSED */ - - /*is anything connected?*/ - if (out[0]->hasoutput==0 && out[1]->hasoutput==0) return; - - /*must have an image imput*/ - if (in[0]->data==NULL) return; - - - imbuf1=typecheck_compbuf(in[0]->data, CB_RGBA); - - /* if there's an image, use that, if not use the color */ - if (in[1]->data) { - imbuf2=typecheck_compbuf(in[1]->data, CB_RGBA); - } - - /* c=node->storage; */ /* UNUSED */ - outbuf=dupalloc_compbuf(imbuf1); - - /* note, processor gets a keyvals array passed on as buffer constant */ - composit2_pixel_processor(node, outbuf, imbuf1, in[0]->vec, imbuf2, in[1]->vec, do_diff_matte, CB_RGBA, CB_RGBA); - - out[0]->data=outbuf; - if (out[1]->hasoutput) - out[1]->data=valbuf_from_rgbabuf(outbuf, CHAN_A); - generate_preview(data, node, outbuf); - - if (imbuf1!=in[0]->data) - free_compbuf(imbuf1); - - if (imbuf2!=in[1]->data) - free_compbuf(imbuf2); -} - -#endif /* WITH_COMPOSITOR_LEGACY */ - static void node_composit_init_diff_matte(bNodeTree *UNUSED(ntree), bNode *node, bNodeTemplate *UNUSED(ntemp)) { NodeChroma *c= MEM_callocN(sizeof(NodeChroma), "node chroma"); @@ -147,9 +62,6 @@ void register_node_type_cmp_diff_matte(bNodeTreeType *ttype) node_type_size(&ntype, 200, 80, 250); node_type_init(&ntype, node_composit_init_diff_matte); node_type_storage(&ntype, "NodeChroma", node_free_standard_storage, node_copy_standard_storage); -#ifdef WITH_COMPOSITOR_LEGACY - node_type_exec(&ntype, node_composit_exec_diff_matte); -#endif nodeRegisterType(ttype, &ntype); } diff --git a/source/blender/nodes/composite/nodes/node_composite_dilate.c b/source/blender/nodes/composite/nodes/node_composite_dilate.c index 9787c9f7145..0238914a9d1 100644 --- a/source/blender/nodes/composite/nodes/node_composite_dilate.c +++ b/source/blender/nodes/composite/nodes/node_composite_dilate.c @@ -44,112 +44,6 @@ static bNodeSocketTemplate cmp_node_dilateerode_out[] = { { -1, 0, "" } }; -#ifdef WITH_COMPOSITOR_LEGACY - -static void morpho_dilate(CompBuf *cbuf) -{ - int x, y; - float *p, *rectf = cbuf->rect; - - for (y = 0; y < cbuf->y; y++) { - for (x = 0; x < cbuf->x - 1; x++) { - p = rectf + cbuf->x * y + x; - *p = max_ff(*p, *(p + 1)); - } - } - - for (y = 0; y < cbuf->y; y++) { - for (x = cbuf->x - 1; x >= 1; x--) { - p = rectf + cbuf->x * y + x; - *p = max_ff(*p, *(p - 1)); - } - } - - for (x = 0; x < cbuf->x; x++) { - for (y = 0; y < cbuf->y - 1; y++) { - p = rectf + cbuf->x * y + x; - *p = max_ff(*p, *(p + cbuf->x)); - } - } - - for (x = 0; x < cbuf->x; x++) { - for (y = cbuf->y - 1; y >= 1; y--) { - p = rectf + cbuf->x * y + x; - *p = max_ff(*p, *(p - cbuf->x)); - } - } -} - -static void morpho_erode(CompBuf *cbuf) -{ - int x, y; - float *p, *rectf = cbuf->rect; - - for (y = 0; y < cbuf->y; y++) { - for (x = 0; x < cbuf->x - 1; x++) { - p = rectf + cbuf->x * y + x; - *p = min_ff(*p, *(p + 1)); - } - } - - for (y = 0; y < cbuf->y; y++) { - for (x = cbuf->x - 1; x >= 1; x--) { - p = rectf + cbuf->x * y + x; - *p = min_ff(*p, *(p - 1)); - } - } - - for (x = 0; x < cbuf->x; x++) { - for (y = 0; y < cbuf->y - 1; y++) { - p = rectf + cbuf->x * y + x; - *p = min_ff(*p, *(p + cbuf->x)); - } - } - - for (x = 0; x < cbuf->x; x++) { - for (y = cbuf->y - 1; y >= 1; y--) { - p = rectf + cbuf->x * y + x; - *p = min_ff(*p, *(p - cbuf->x)); - } - } - -} - -static void node_composit_exec_dilateerode(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out) -{ - /* stack order in: mask */ - /* stack order out: mask */ - if (out[0]->hasoutput == 0) - return; - - /* input no image? then only color operation */ - if (in[0]->data == NULL) { - zero_v4(out[0]->vec); - } - else { - /* make output size of input image */ - CompBuf *cbuf = typecheck_compbuf(in[0]->data, CB_VAL); - CompBuf *stackbuf = dupalloc_compbuf(cbuf); - short i; - - if (node->custom2 > 0) { // positive, dilate - for (i = 0; i < node->custom2; i++) - morpho_dilate(stackbuf); - } - else if (node->custom2 < 0) { // negative, erode - for (i = 0; i > node->custom2; i--) - morpho_erode(stackbuf); - } - - if (cbuf != in[0]->data) - free_compbuf(cbuf); - - out[0]->data = stackbuf; - } -} - -#endif /* WITH_COMPOSITOR_LEGACY */ - static void node_composit_init_dilateerode(bNodeTree *UNUSED(ntree), bNode *node, bNodeTemplate *UNUSED(ntemp)) { NodeDilateErode *data = MEM_callocN(sizeof(NodeDilateErode), "NodeDilateErode"); @@ -165,9 +59,6 @@ void register_node_type_cmp_dilateerode(bNodeTreeType *ttype) node_type_socket_templates(&ntype, cmp_node_dilateerode_in, cmp_node_dilateerode_out); node_type_size(&ntype, 130, 100, 320); node_type_init(&ntype, node_composit_init_dilateerode); -#ifdef WITH_COMPOSITOR_LEGACY - node_type_exec(&ntype, node_composit_exec_dilateerode); -#endif node_type_storage(&ntype, "NodeDilateErode", node_free_standard_storage, node_copy_standard_storage); diff --git a/source/blender/nodes/composite/nodes/node_composite_directionalblur.c b/source/blender/nodes/composite/nodes/node_composite_directionalblur.c index a343315264d..ca32f37a32e 100644 --- a/source/blender/nodes/composite/nodes/node_composite_directionalblur.c +++ b/source/blender/nodes/composite/nodes/node_composite_directionalblur.c @@ -42,90 +42,6 @@ static bNodeSocketTemplate cmp_node_dblur_out[] = { { -1, 0, "" } }; -#ifdef WITH_COMPOSITOR_LEGACY - -static CompBuf *dblur(bNode *node, CompBuf *img, int iterations, int wrap, - float center_x, float center_y, float dist, float angle, float spin, float zoom) -{ - if ((dist != 0.f) || (spin != 0.f) || (zoom != 0.f)) { - void (*getpix)(CompBuf *, float, float, float *) = wrap ? qd_getPixelLerpWrap : qd_getPixelLerp; - const float a = angle; - const float itsc = 1.f / powf(2.f, (float)iterations); - float D; - float center_x_pix, center_y_pix; - float tx, ty; - float sc, rot; - CompBuf *tmp; - int i, j; - - tmp = dupalloc_compbuf(img); - - D = dist * sqrtf(img->x * img->x + img->y * img->y); - center_x_pix = center_x * img->x; - center_y_pix = center_y * img->y; - - tx = itsc * D * cosf(a); - ty = -itsc * D * sinf(a); - sc = itsc * zoom; - rot = itsc * spin; - - /* blur the image */ - for (i = 0; i < iterations; ++i) { - const float cs = cosf(rot), ss = sinf(rot); - const float isc = 1.f / (1.f + sc); - unsigned int x, y; - float col[4] = {0, 0, 0, 0}; - - for (y = 0; y < img->y; ++y) { - const float v = isc * (y - center_y_pix) + ty; - - for (x = 0; x < img->x; ++x) { - const float u = isc * (x - center_x_pix) + tx; - unsigned int p = (x + y * img->x) * img->type; - - getpix(tmp, cs * u + ss * v + center_x_pix, cs * v - ss * u + center_y_pix, col); - - /* mix img and transformed tmp */ - for (j = 0; j < 4; ++j) { - img->rect[p + j] = 0.5f * (img->rect[p + j] + col[j]); - } - } - } - - /* copy img to tmp */ - if (i != (iterations - 1)) - memcpy(tmp->rect, img->rect, sizeof(float) * img->x * img->y * img->type); - - /* double transformations */ - tx *= 2.f, ty *= 2.f; - sc *= 2.f, rot *= 2.f; - - if (node->exec & NODE_BREAK) break; - } - - free_compbuf(tmp); - } - - return img; -} - -static void node_composit_exec_dblur(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out) -{ - NodeDBlurData *ndbd = node->storage; - CompBuf *new, *img = in[0]->data; - - if ((img == NULL) || (out[0]->hasoutput == 0)) return; - - if (img->type != CB_RGBA) - new = typecheck_compbuf(img, CB_RGBA); - else - new = dupalloc_compbuf(img); - - out[0]->data = dblur(node, new, ndbd->iter, ndbd->wrap, ndbd->center_x, ndbd->center_y, ndbd->distance, ndbd->angle, ndbd->spin, ndbd->zoom); -} - -#endif /* WITH_COMPOSITOR_LEGACY */ - static void node_composit_init_dblur(bNodeTree *UNUSED(ntree), bNode *node, bNodeTemplate *UNUSED(ntemp)) { NodeDBlurData *ndbd = MEM_callocN(sizeof(NodeDBlurData), "node dblur data"); @@ -143,9 +59,6 @@ void register_node_type_cmp_dblur(bNodeTreeType *ttype) node_type_size(&ntype, 150, 120, 200); node_type_init(&ntype, node_composit_init_dblur); node_type_storage(&ntype, "NodeDBlurData", node_free_standard_storage, node_copy_standard_storage); -#ifdef WITH_COMPOSITOR_LEGACY - node_type_exec(&ntype, node_composit_exec_dblur); -#endif nodeRegisterType(ttype, &ntype); } diff --git a/source/blender/nodes/composite/nodes/node_composite_displace.c b/source/blender/nodes/composite/nodes/node_composite_displace.c index c07ad0a0c97..595596765a9 100644 --- a/source/blender/nodes/composite/nodes/node_composite_displace.c +++ b/source/blender/nodes/composite/nodes/node_composite_displace.c @@ -47,145 +47,6 @@ static bNodeSocketTemplate cmp_node_displace_out[] = { { -1, 0, "" } }; -#ifdef WITH_COMPOSITOR_LEGACY - -/* minimum distance (in pixels) a pixel has to be displaced - * in order to take effect */ -#define DISPLACE_EPSILON 0.01f - -static void do_displace(bNode *node, CompBuf *stackbuf, CompBuf *cbuf, CompBuf *vecbuf, float *UNUSED(veccol), CompBuf *xbuf, CompBuf *ybuf, float *xscale, float *yscale) -{ - ImBuf *ibuf; - int x, y; - float p_dx, p_dy; /* main displacement in pixel space */ - float d_dx, d_dy; - float dxt, dyt; - float u, v; - float xs, ys; - float vec[3], vecdx[3], vecdy[3]; - float col[3]; - - ibuf= IMB_allocImBuf(cbuf->x, cbuf->y, 32, 0); - ibuf->rect_float= cbuf->rect; - - for (y=0; y < stackbuf->y; y++) { - for (x=0; x < stackbuf->x; x++) { - /* calc pixel coordinates */ - qd_getPixel(vecbuf, x-vecbuf->xof, y-vecbuf->yof, vec); - - if (xbuf) - qd_getPixel(xbuf, x-xbuf->xof, y-xbuf->yof, &xs); - else - xs = xscale[0]; - - if (ybuf) - qd_getPixel(ybuf, x-ybuf->xof, y-ybuf->yof, &ys); - else - ys = yscale[0]; - - /* clamp x and y displacement to triple image resolution - - * to prevent hangs from huge values mistakenly plugged in eg. z buffers */ - CLAMP(xs, -stackbuf->x*4, stackbuf->x*4); - CLAMP(ys, -stackbuf->y*4, stackbuf->y*4); - - p_dx = vec[0] * xs; - p_dy = vec[1] * ys; - - /* if no displacement, then just copy this pixel */ - if (fabsf(p_dx) < DISPLACE_EPSILON && fabsf(p_dy) < DISPLACE_EPSILON) { - qd_getPixel(cbuf, x-cbuf->xof, y-cbuf->yof, col); - qd_setPixel(stackbuf, x, y, col); - continue; - } - - /* displaced pixel in uv coords, for image sampling */ - u = (x - cbuf->xof - p_dx + 0.5f) / (float)stackbuf->x; - v = (y - cbuf->yof - p_dy + 0.5f) / (float)stackbuf->y; - - - /* calc derivatives */ - qd_getPixel(vecbuf, x-vecbuf->xof+1, y-vecbuf->yof, vecdx); - qd_getPixel(vecbuf, x-vecbuf->xof, y-vecbuf->yof+1, vecdy); - d_dx = vecdx[0] * xs; - d_dy = vecdy[1] * ys; - - /* clamp derivatives to minimum displacement distance in UV space */ - dxt = p_dx - d_dx; - dyt = p_dy - d_dy; - - dxt = signf(dxt)*max_ff(fabsf(dxt), DISPLACE_EPSILON)/(float)stackbuf->x; - dyt = signf(dyt)*max_ff(fabsf(dyt), DISPLACE_EPSILON)/(float)stackbuf->y; - - ibuf_sample(ibuf, u, v, dxt, dyt, col); - qd_setPixel(stackbuf, x, y, col); - - if (node->exec & NODE_BREAK) break; - } - - if (node->exec & NODE_BREAK) break; - } - IMB_freeImBuf(ibuf); - - -/* simple method for reference, linear interpolation */ -#if 0 - int x, y; - float dx, dy; - float u, v; - float vec[3]; - float col[3]; - - for (y=0; y < stackbuf->y; y++) { - for (x=0; x < stackbuf->x; x++) { - qd_getPixel(vecbuf, x, y, vec); - - dx = vec[0] * (xscale[0]); - dy = vec[1] * (yscale[0]); - - u = (x - dx + 0.5f) / (float)stackbuf->x; - v = (y - dy + 0.5f) / (float)stackbuf->y; - - qd_getPixelLerp(cbuf, u*cbuf->x - 0.5f, v*cbuf->y - 0.5f, col); - qd_setPixel(stackbuf, x, y, col); - } - } -#endif -} - - -static void node_composit_exec_displace(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out) -{ - if (out[0]->hasoutput==0) - return; - - if (in[0]->data && in[1]->data) { - CompBuf *cbuf= in[0]->data; - CompBuf *vecbuf= in[1]->data; - CompBuf *xbuf= in[2]->data; - CompBuf *ybuf= in[3]->data; - CompBuf *stackbuf; - - cbuf= typecheck_compbuf(cbuf, CB_RGBA); - vecbuf= typecheck_compbuf(vecbuf, CB_VEC3); - xbuf= typecheck_compbuf(xbuf, CB_VAL); - ybuf= typecheck_compbuf(ybuf, CB_VAL); - - stackbuf= alloc_compbuf(cbuf->x, cbuf->y, CB_RGBA, 1); /* allocs */ - - do_displace(node, stackbuf, cbuf, vecbuf, in[1]->vec, xbuf, ybuf, in[2]->vec, in[3]->vec); - - out[0]->data= stackbuf; - - - if (cbuf!=in[0]->data) - free_compbuf(cbuf); - if (vecbuf!=in[1]->data) - free_compbuf(vecbuf); - } -} - -#endif /* WITH_COMPOSITOR_LEGACY */ - void register_node_type_cmp_displace(bNodeTreeType *ttype) { static bNodeType ntype; @@ -193,9 +54,6 @@ void register_node_type_cmp_displace(bNodeTreeType *ttype) node_type_base(ttype, &ntype, CMP_NODE_DISPLACE, "Displace", NODE_CLASS_DISTORT, NODE_OPTIONS); node_type_socket_templates(&ntype, cmp_node_displace_in, cmp_node_displace_out); node_type_size(&ntype, 140, 100, 320); -#ifdef WITH_COMPOSITOR_LEGACY - node_type_exec(&ntype, node_composit_exec_displace); -#endif nodeRegisterType(ttype, &ntype); } diff --git a/source/blender/nodes/composite/nodes/node_composite_distanceMatte.c b/source/blender/nodes/composite/nodes/node_composite_distanceMatte.c index 7e605865cd2..fffb85cca8e 100644 --- a/source/blender/nodes/composite/nodes/node_composite_distanceMatte.c +++ b/source/blender/nodes/composite/nodes/node_composite_distanceMatte.c @@ -45,147 +45,6 @@ static bNodeSocketTemplate cmp_node_distance_matte_out[] = { {-1, 0, ""} }; -#ifdef WITH_COMPOSITOR_LEGACY - -/* note, keyvals is passed on from caller as stack array */ -/* might have been nicer as temp struct though... */ -static void do_distance_matte(bNode *node, float *out, float *in) -{ - NodeChroma *c= (NodeChroma *)node->storage; - float tolerance=c->t1; - float fper=c->t2; - /* get falloff amount over tolerance size */ - float falloff=(1.0f-fper) * tolerance; - float distance; - float alpha; - - distance=sqrt((c->key[0]-in[0])*(c->key[0]-in[0]) + - (c->key[1]-in[1])*(c->key[1]-in[1]) + - (c->key[2]-in[2])*(c->key[2]-in[2])); - - copy_v3_v3(out, in); - - if (distance <= tolerance) { - if (distance <= falloff) { - alpha = 0.0f; - } - else { - /* alpha as percent (distance / tolerance), each modified by falloff amount (in pixels)*/ - alpha=(distance-falloff)/(tolerance-falloff); - } - - /*only change if more transparent than before */ - if (alpha < in[3]) { - /*clamp*/ - if (alpha < 0.0f) alpha = 0.0f; - if (alpha > 1.0f) alpha = 1.0f; - out[3]=alpha; - } - else { /* leave as before */ - out[3]=in[3]; - } - } -} - -static void do_chroma_distance_matte(bNode *node, float *out, float *in) -{ - NodeChroma *c= (NodeChroma *)node->storage; - float tolerance=c->t1; - float fper=c->t2; - /* get falloff amount over tolerance size */ - float falloff=(1.0f-fper) * tolerance; - float y_key, cb_key, cr_key; - float y_pix, cb_pix, cr_pix; - float distance; - float alpha; - - /*convert key to chroma colorspace */ - rgb_to_ycc(c->key[0], c->key[1], c->key[2], &y_key, &cb_key, &cr_key, BLI_YCC_JFIF_0_255); - /* normalize the values */ - cb_key=cb_key/255.0f; - cr_key=cr_key/255.0f; - - /*convert pixel to chroma colorspace */ - rgb_to_ycc(in[0], in[1], in[2], &y_pix, &cb_pix, &cr_pix, BLI_YCC_JFIF_0_255); - /*normalize the values */ - cb_pix=cb_pix/255.0f; - cr_pix=cr_pix/255.0f; - - distance=sqrt((cb_key-cb_pix)*(cb_key-cb_pix) + - (cr_key-cr_pix)*(cr_key-cr_pix)); - - copy_v3_v3(out, in); - - if (distance <= tolerance) { - if (distance <= falloff) { - alpha = 0.0f; - } - else { - /* alpha as percent (distance / tolerance), each modified by falloff amount (in pixels)*/ - alpha=(distance-falloff)/(tolerance-falloff); - } - - /*only change if more transparent than before */ - if (alpha < in[3]) { - /*clamp*/ - if (alpha < 0.0f) alpha = 0.0f; - if (alpha > 1.0f) alpha = 1.0f; - out[3]=alpha; - } - else { /* leave as before */ - out[3]=in[3]; - } - } -} - -static void node_composit_exec_distance_matte(void *data, bNode *node, bNodeStack **in, bNodeStack **out) -{ - /* - * Loosely based on the Sequencer chroma key plug-in, but enhanced to work in other color spaces and - * uses a different difference function (suggested in forums of vfxtalk.com). - */ - CompBuf *workbuf; - CompBuf *inbuf; - NodeChroma *c; - - /*is anything connected?*/ - if (out[0]->hasoutput==0 && out[1]->hasoutput==0) return; - /*must have an image imput*/ - if (in[0]->data==NULL) return; - - inbuf=typecheck_compbuf(in[0]->data, CB_RGBA); - - c=node->storage; - workbuf=dupalloc_compbuf(inbuf); - - /*use the input color*/ - c->key[0] = in[1]->vec[0]; - c->key[1] = in[1]->vec[1]; - c->key[2] = in[1]->vec[2]; - - /* work in RGB color space */ - if (c->channel == 1) { - /* note, processor gets a keyvals array passed on as buffer constant */ - composit1_pixel_processor(node, workbuf, workbuf, in[0]->vec, do_distance_matte, CB_RGBA); - } - /* work in YCbCr color space */ - else { - composit1_pixel_processor(node, workbuf, workbuf, in[0]->vec, do_chroma_distance_matte, CB_RGBA); - } - - - - out[0]->data=workbuf; - if (out[1]->hasoutput) - out[1]->data=valbuf_from_rgbabuf(workbuf, CHAN_A); - generate_preview(data, node, workbuf); - - if (inbuf!=in[0]->data) - free_compbuf(inbuf); -} - -#endif /* WITH_COMPOSITOR_LEGACY */ - static void node_composit_init_distance_matte(bNodeTree *UNUSED(ntree), bNode *node, bNodeTemplate *UNUSED(ntemp)) { NodeChroma *c= MEM_callocN(sizeof(NodeChroma), "node chroma"); @@ -204,9 +63,6 @@ void register_node_type_cmp_distance_matte(bNodeTreeType *ttype) node_type_size(&ntype, 200, 80, 250); node_type_init(&ntype, node_composit_init_distance_matte); node_type_storage(&ntype, "NodeChroma", node_free_standard_storage, node_copy_standard_storage); -#ifdef WITH_COMPOSITOR_LEGACY - node_type_exec(&ntype, node_composit_exec_distance_matte); -#endif nodeRegisterType(ttype, &ntype); } diff --git a/source/blender/nodes/composite/nodes/node_composite_doubleEdgeMask.c b/source/blender/nodes/composite/nodes/node_composite_doubleEdgeMask.c index 3c1e3ee443e..4f42c40ee13 100644 --- a/source/blender/nodes/composite/nodes/node_composite_doubleEdgeMask.c +++ b/source/blender/nodes/composite/nodes/node_composite_doubleEdgeMask.c @@ -42,1239 +42,6 @@ static bNodeSocketTemplate cmp_node_doubleedgemask_out[] = { { -1, 0, "" } // output socket array terminator }; -#ifdef WITH_COMPOSITOR_LEGACY - -static void do_adjacentKeepBorders(unsigned int t, unsigned int rw, unsigned int *limask, unsigned int *lomask, unsigned int *lres, float *res, unsigned int *rsize) -{ - int x; - unsigned int isz=0; // inner edge size - unsigned int osz=0; // outer edge size - unsigned int gsz=0; // gradient fill area size - /* Test the four corners */ - /* upper left corner */ - x=t-rw+1; - // test if inner mask is filled - if (limask[x]) { - // test if pixel underneath, or to the right, are empty in the inner mask, - // but filled in the outer mask - if ((!limask[x-rw] && lomask[x-rw]) || (!limask[x+1] && lomask[x+1])) { - isz++; // increment inner edge size - lres[x]=4; // flag pixel as inner edge - } - else { - res[x]=1.0f; // pixel is just part of inner mask, and it's not an edge - } - } - else if (lomask[x]) { // inner mask was empty, test if outer mask is filled - osz++; // increment outer edge size - lres[x]=3; // flag pixel as outer edge - } - /* upper right corner */ - x=t; - // test if inner mask is filled - if (limask[x]) { - // test if pixel underneath, or to the left, are empty in the inner mask, - // but filled in the outer mask - if ((!limask[x-rw] && lomask[x-rw]) || (!limask[x-1] && lomask[x-1])) { - isz++; // increment inner edge size - lres[x]=4; // flag pixel as inner edge - } - else { - res[x]=1.0f; // pixel is just part of inner mask, and it's not an edge - } - } - else if (lomask[x]) { // inner mask was empty, test if outer mask is filled - osz++; // increment outer edge size - lres[x]=3; // flag pixel as outer edge - } - /* lower left corner */ - x=0; - // test if inner mask is filled - if (limask[x]) { - // test if pixel above, or to the right, are empty in the inner mask, - // but filled in the outer mask - if ((!limask[x+rw] && lomask[x+rw]) || (!limask[x+1] && lomask[x+1])) { - isz++; // increment inner edge size - lres[x]=4; // flag pixel as inner edge - } - else { - res[x]=1.0f; // pixel is just part of inner mask, and it's not an edge - } - } - else if (lomask[x]) { // inner mask was empty, test if outer mask is filled - osz++; // increment outer edge size - lres[x]=3; // flag pixel as outer edge - } - /* lower right corner */ - x=rw-1; - // test if inner mask is filled - if (limask[x]) { - // test if pixel above, or to the left, are empty in the inner mask, - // but filled in the outer mask - if ((!limask[x+rw] && lomask[x+rw]) || (!limask[x-1] && lomask[x-1])) { - isz++; // increment inner edge size - lres[x]=4; // flag pixel as inner edge - } - else { - res[x]=1.0f; // pixel is just part of inner mask, and it's not an edge - } - } - else if (lomask[x]) { // inner mask was empty, test if outer mask is filled - osz++; // increment outer edge size - lres[x]=3; // flag pixel as outer edge - } - - /* Test the TOP row of pixels in buffer, except corners */ - for (x= t-1; x>=(t-rw)+2; x--) { - // test if inner mask is filled - if (limask[x]) { - // test if pixel to the right, or to the left, are empty in the inner mask, - // but filled in the outer mask - if ((!limask[x-1] && lomask[x-1]) || (!limask[x+1] && lomask[x+1])) { - isz++; // increment inner edge size - lres[x]=4; // flag pixel as inner edge - } - else { - res[x]=1.0f; // pixel is just part of inner mask, and it's not an edge - } - } - else if (lomask[x]) { // inner mask was empty, test if outer mask is filled - osz++; // increment outer edge size - lres[x]=3; // flag pixel as outer edge - } - } - - /* Test the BOTTOM row of pixels in buffer, except corners */ - for (x= rw-2; x; x--) { - // test if inner mask is filled - if (limask[x]) { - // test if pixel to the right, or to the left, are empty in the inner mask, - // but filled in the outer mask - if ((!limask[x-1] && lomask[x-1]) || (!limask[x+1] && lomask[x+1])) { - isz++; // increment inner edge size - lres[x]=4; // flag pixel as inner edge - } - else { - res[x]=1.0f; // pixel is just part of inner mask, and it's not an edge - } - } - else if (lomask[x]) { // inner mask was empty, test if outer mask is filled - osz++; // increment outer edge size - lres[x]=3; // flag pixel as outer edge - } - } - /* Test the LEFT edge of pixels in buffer, except corners */ - for (x= t-(rw<<1)+1; x>=rw; x-=rw) { - // test if inner mask is filled - if (limask[x]) { - // test if pixel underneath, or above, are empty in the inner mask, - // but filled in the outer mask - if ((!limask[x-rw] && lomask[x-rw]) || (!limask[x+rw] && lomask[x+rw])) { - isz++; // increment inner edge size - lres[x]=4; // flag pixel as inner edge - } - else { - res[x]=1.0f; // pixel is just part of inner mask, and it's not an edge - } - } - else if (lomask[x]) { // inner mask was empty, test if outer mask is filled - osz++; // increment outer edge size - lres[x]=3; // flag pixel as outer edge - } - } - - /* Test the RIGHT edge of pixels in buffer, except corners */ - for (x= t-rw; x>rw; x-=rw) { - // test if inner mask is filled - if (limask[x]) { - // test if pixel underneath, or above, are empty in the inner mask, - // but filled in the outer mask - if ((!limask[x-rw] && lomask[x-rw]) || (!limask[x+rw] && lomask[x+rw])) { - isz++; // increment inner edge size - lres[x]=4; // flag pixel as inner edge - } - else { - res[x]=1.0f; // pixel is just part of inner mask, and it's not an edge - } - } - else if (lomask[x]) { // inner mask was empty, test if outer mask is filled - osz++; // increment outer edge size - lres[x]=3; // flag pixel as outer edge - } - } - - rsize[0]=isz; // fill in our return sizes for edges + fill - rsize[1]=osz; - rsize[2]=gsz; -} - -static void do_adjacentBleedBorders(unsigned int t, unsigned int rw, unsigned int *limask, unsigned int *lomask, unsigned int *lres, float *res, unsigned int *rsize) -{ - int x; - unsigned int isz=0; // inner edge size - unsigned int osz=0; // outer edge size - unsigned int gsz=0; // gradient fill area size - /* Test the four corners */ - /* upper left corner */ - x=t-rw+1; - // test if inner mask is filled - if (limask[x]) { - // test if pixel underneath, or to the right, are empty in the inner mask, - // but filled in the outer mask - if ((!limask[x-rw] && lomask[x-rw]) || (!limask[x+1] && lomask[x+1])) { - isz++; // increment inner edge size - lres[x]=4; // flag pixel as inner edge - } - else { - res[x]=1.0f; // pixel is just part of inner mask, and it's not an edge - } - } - else if (lomask[x]) { // inner mask was empty, test if outer mask is filled - if (!lomask[x-rw] || !lomask[x+1]) { // test if outer mask is empty underneath or to the right - osz++; // increment outer edge size - lres[x]=3; // flag pixel as outer edge - } - else { - gsz++; // increment the gradient pixel count - lres[x]=2; // flag pixel as gradient - } - } - /* upper right corner */ - x=t; - // test if inner mask is filled - if (limask[x]) { - // test if pixel underneath, or to the left, are empty in the inner mask, - // but filled in the outer mask - if ((!limask[x-rw] && lomask[x-rw]) || (!limask[x-1] && lomask[x-1])) { - isz++; // increment inner edge size - lres[x]=4; // flag pixel as inner edge - } - else { - res[x]=1.0f; // pixel is just part of inner mask, and it's not an edge - } - } - else if (lomask[x]) { // inner mask was empty, test if outer mask is filled - if (!lomask[x-rw] || !lomask[x-1]) { // test if outer mask is empty underneath or to the left - osz++; // increment outer edge size - lres[x]=3; // flag pixel as outer edge - } - else { - gsz++; // increment the gradient pixel count - lres[x]=2; // flag pixel as gradient - } - } - /* lower left corner */ - x=0; - // test if inner mask is filled - if (limask[x]) { - // test if pixel above, or to the right, are empty in the inner mask, - // but filled in the outer mask - if ((!limask[x+rw] && lomask[x+rw]) || (!limask[x+1] && lomask[x+1])) { - isz++; // increment inner edge size - lres[x]=4; // flag pixel as inner edge - } - else { - res[x]=1.0f; // pixel is just part of inner mask, and it's not an edge - } - } - else if (lomask[x]) { // inner mask was empty, test if outer mask is filled - if (!lomask[x+rw] || !lomask[x+1]) { // test if outer mask is empty above or to the right - osz++; // increment outer edge size - lres[x]=3; // flag pixel as outer edge - } - else { - gsz++; // increment the gradient pixel count - lres[x]=2; // flag pixel as gradient - } - } - /* lower right corner */ - x=rw-1; - // test if inner mask is filled - if (limask[x]) { - // test if pixel above, or to the left, are empty in the inner mask, - // but filled in the outer mask - if ((!limask[x+rw] && lomask[x+rw]) || (!limask[x-1] && lomask[x-1])) { - isz++; // increment inner edge size - lres[x]=4; // flag pixel as inner edge - } - else { - res[x]=1.0f; // pixel is just part of inner mask, and it's not an edge - } - } - else if (lomask[x]) { // inner mask was empty, test if outer mask is filled - if (!lomask[x+rw] || !lomask[x-1]) { // test if outer mask is empty above or to the left - osz++; // increment outer edge size - lres[x]=3; // flag pixel as outer edge - } - else { - gsz++; // increment the gradient pixel count - lres[x]=2; // flag pixel as gradient - } - } - /* Test the TOP row of pixels in buffer, except corners */ - for (x= t-1; x>=(t-rw)+2; x--) { - // test if inner mask is filled - if (limask[x]) { - // test if pixel to the left, or to the right, are empty in the inner mask, - // but filled in the outer mask - if ((!limask[x-1] && lomask[x-1]) || (!limask[x+1] && lomask[x+1])) { - isz++; // increment inner edge size - lres[x]=4; // flag pixel as inner edge - } - else { - res[x]=1.0f; // pixel is just part of inner mask, and it's not an edge - } - } - else if (lomask[x]) { // inner mask was empty, test if outer mask is filled - if (!lomask[x-1] || !lomask[x+1]) { // test if outer mask is empty to the left or to the right - osz++; // increment outer edge size - lres[x]=3; // flag pixel as outer edge - } - else { - gsz++; // increment the gradient pixel count - lres[x]=2; // flag pixel as gradient - } - } - } - - /* Test the BOTTOM row of pixels in buffer, except corners */ - for (x= rw-2; x; x--) { - // test if inner mask is filled - if (limask[x]) { - // test if pixel to the left, or to the right, are empty in the inner mask, - // but filled in the outer mask - if ((!limask[x-1] && lomask[x-1]) || (!limask[x+1] && lomask[x+1])) { - isz++; // increment inner edge size - lres[x]=4; // flag pixel as inner edge - } - else { - res[x]=1.0f; // pixel is just part of inner mask, and it's not an edge - } - } - else if (lomask[x]) { // inner mask was empty, test if outer mask is filled - if (!lomask[x-1] || !lomask[x+1]) { // test if outer mask is empty to the left or to the right - osz++; // increment outer edge size - lres[x]=3; // flag pixel as outer edge - } - else { - gsz++; // increment the gradient pixel count - lres[x]=2; // flag pixel as gradient - } - } - } - /* Test the LEFT edge of pixels in buffer, except corners */ - for (x= t-(rw<<1)+1; x>=rw; x-=rw) { - // test if inner mask is filled - if (limask[x]) { - // test if pixel underneath, or above, are empty in the inner mask, - // but filled in the outer mask - if ((!limask[x-rw] && lomask[x-rw]) || (!limask[x+rw] && lomask[x+rw])) { - isz++; // increment inner edge size - lres[x]=4; // flag pixel as inner edge - } - else { - res[x]=1.0f; // pixel is just part of inner mask, and it's not an edge - } - } - else if (lomask[x]) { // inner mask was empty, test if outer mask is filled - if (!lomask[x-rw] || !lomask[x+rw]) { // test if outer mask is empty underneath or above - osz++; // increment outer edge size - lres[x]=3; // flag pixel as outer edge - } - else { - gsz++; // increment the gradient pixel count - lres[x]=2; // flag pixel as gradient - } - } - } - - /* Test the RIGHT edge of pixels in buffer, except corners */ - for (x= t-rw; x>rw; x-=rw) { - // test if inner mask is filled - if (limask[x]) { - // test if pixel underneath, or above, are empty in the inner mask, - // but filled in the outer mask - if ((!limask[x-rw] && lomask[x-rw]) || (!limask[x+rw] && lomask[x+rw])) { - isz++; // increment inner edge size - lres[x]=4; // flag pixel as inner edge - } - else { - res[x]=1.0f; // pixel is just part of inner mask, and it's not an edge - } - } - else if (lomask[x]) { // inner mask was empty, test if outer mask is filled - if (!lomask[x-rw] || !lomask[x+rw]) { // test if outer mask is empty underneath or above - osz++; // increment outer edge size - lres[x]=3; // flag pixel as outer edge - } - else { - gsz++; // increment the gradient pixel count - lres[x]=2; // flag pixel as gradient - } - } - } - - rsize[0]=isz; // fill in our return sizes for edges + fill - rsize[1]=osz; - rsize[2]=gsz; -} - -static void do_allKeepBorders(unsigned int t, unsigned int rw, unsigned int *limask, unsigned int *lomask, unsigned int *lres, float *res, unsigned int *rsize) -{ - int x; - unsigned int isz=0; // inner edge size - unsigned int osz=0; // outer edge size - unsigned int gsz=0; // gradient fill area size - /* Test the four corners */ - /* upper left corner */ - x=t-rw+1; - // test if inner mask is filled - if (limask[x]) { - // test if the inner mask is empty underneath or to the right - if (!limask[x-rw] || !limask[x+1]) { - isz++; // increment inner edge size - lres[x]=4; // flag pixel as inner edge - } - else { - res[x]=1.0f; // pixel is just part of inner mask, and it's not an edge - } - } - else if (lomask[x]) { // inner mask was empty, test if outer mask is filled - osz++; // increment outer edge size - lres[x]=3; // flag pixel as outer edge - } - /* upper right corner */ - x=t; - // test if inner mask is filled - if (limask[x]) { - // test if the inner mask is empty underneath or to the left - if (!limask[x-rw] || !limask[x-1]) { - isz++; // increment inner edge size - lres[x]=4; // flag pixel as inner edge - } - else { - res[x]=1.0f; // pixel is just part of inner mask, and it's not an edge - } - } - else if (lomask[x]) { // inner mask was empty, test if outer mask is filled - osz++; // increment outer edge size - lres[x]=3; // flag pixel as outer edge - } - /* lower left corner */ - x=0; - // test if inner mask is filled - if (limask[x]) { - // test if inner mask is empty above or to the right - if (!limask[x+rw] || !limask[x+1]) { - isz++; // increment inner edge size - lres[x]=4; // flag pixel as inner edge - } - else { - res[x]=1.0f; // pixel is just part of inner mask, and it's not an edge - } - } - else if (lomask[x]) { // inner mask was empty, test if outer mask is filled - osz++; // increment outer edge size - lres[x]=3; // flag pixel as outer edge - } - /* lower right corner */ - x=rw-1; - // test if inner mask is filled - if (limask[x]) { - // test if inner mask is empty above or to the left - if (!limask[x+rw] || !limask[x-1]) { - isz++; // increment inner edge size - lres[x]=4; // flag pixel as inner edge - } - else { - res[x]=1.0f; // pixel is just part of inner mask, and it's not an edge - } - } - else if (lomask[x]) { // inner mask was empty, test if outer mask is filled - osz++; // increment outer edge size - lres[x]=3; // flag pixel as outer edge - } - - /* Test the TOP row of pixels in buffer, except corners */ - for (x= t-1; x>=(t-rw)+2; x--) { - // test if inner mask is filled - if (limask[x]) { - // test if inner mask is empty to the left or to the right - if (!limask[x-1] || !limask[x+1]) { - isz++; // increment inner edge size - lres[x]=4; // flag pixel as inner edge - } - else { - res[x]=1.0f; // pixel is just part of inner mask, and it's not an edge - } - } - else if (lomask[x]) { // inner mask was empty, test if outer mask is filled - osz++; // increment outer edge size - lres[x]=3; // flag pixel as outer edge - } - } - - /* Test the BOTTOM row of pixels in buffer, except corners */ - for (x= rw-2; x; x--) { - // test if inner mask is filled - if (limask[x]) { - // test if inner mask is empty to the left or to the right - if (!limask[x-1] || !limask[x+1]) { - isz++; // increment inner edge size - lres[x]=4; // flag pixel as inner edge - } - else { - res[x]=1.0f; // pixel is just part of inner mask, and it's not an edge - } - } - else if (lomask[x]) { // inner mask was empty, test if outer mask is filled - osz++; // increment outer edge size - lres[x]=3; // flag pixel as outer edge - } - } - /* Test the LEFT edge of pixels in buffer, except corners */ - for (x= t-(rw<<1)+1; x>=rw; x-=rw) { - // test if inner mask is filled - if (limask[x]) { - // test if inner mask is empty underneath or above - if (!limask[x-rw] || !limask[x+rw]) { - isz++; // increment inner edge size - lres[x]=4; // flag pixel as inner edge - } - else { - res[x]=1.0f; // pixel is just part of inner mask, and it's not an edge - } - } - else if (lomask[x]) { // inner mask was empty, test if outer mask is filled - osz++; // increment outer edge size - lres[x]=3; // flag pixel as outer edge - } - } - - /* Test the RIGHT edge of pixels in buffer, except corners */ - for (x= t-rw; x>rw; x-=rw) { - // test if inner mask is filled - if (limask[x]) { - // test if inner mask is empty underneath or above - if (!limask[x-rw] || !limask[x+rw]) { - isz++; // increment inner edge size - lres[x]=4; // flag pixel as inner edge - } - else { - res[x]=1.0f; // pixel is just part of inner mask, and it's not an edge - } - } - else if (lomask[x]) { // inner mask was empty, test if outer mask is filled - osz++; // increment outer edge size - lres[x]=3; // flag pixel as outer edge - } - } - - rsize[0]=isz; // fill in our return sizes for edges + fill - rsize[1]=osz; - rsize[2]=gsz; -} - -static void do_allBleedBorders(unsigned int t, unsigned int rw, unsigned int *limask, unsigned int *lomask, unsigned int *lres, float *res, unsigned int *rsize) -{ - int x; - unsigned int isz=0; // inner edge size - unsigned int osz=0; // outer edge size - unsigned int gsz=0; // gradient fill area size - /* Test the four corners */ - /* upper left corner */ - x=t-rw+1; - // test if inner mask is filled - if (limask[x]) { - // test if the inner mask is empty underneath or to the right - if (!limask[x-rw] || !limask[x+1]) { - isz++; // increment inner edge size - lres[x]=4; // flag pixel as inner edge - } - else { - res[x]=1.0f; // pixel is just part of inner mask, and it's not an edge - } - } - else if (lomask[x]) { // inner mask was empty, test if outer mask is filled - if (!lomask[x-rw] || !lomask[x+1]) { // test if outer mask is empty underneath or to the right - osz++; // increment outer edge size - lres[x]=3; // flag pixel as outer edge - } - else { - gsz++; // increment the gradient pixel count - lres[x]=2; // flag pixel as gradient - } - } - /* upper right corner */ - x=t; - // test if inner mask is filled - if (limask[x]) { - // test if the inner mask is empty underneath or to the left - if (!limask[x-rw] || !limask[x-1]) { - isz++; // increment inner edge size - lres[x]=4; // flag pixel as inner edge - } - else { - res[x]=1.0f; // pixel is just part of inner mask, and it's not an edge - } - } - else if (lomask[x]) { // inner mask was empty, test if outer mask is filled - if (!lomask[x-rw] || !lomask[x-1]) { // test if outer mask is empty above or to the left - osz++; // increment outer edge size - lres[x]=3; // flag pixel as outer edge - } - else { - gsz++; // increment the gradient pixel count - lres[x]=2; // flag pixel as gradient - } - } - /* lower left corner */ - x=0; - // test if inner mask is filled - if (limask[x]) { - // test if inner mask is empty above or to the right - if (!limask[x+rw] || !limask[x+1]) { - isz++; // increment inner edge size - lres[x]=4; // flag pixel as inner edge - } - else { - res[x]=1.0f; // pixel is just part of inner mask, and it's not an edge - } - } - else if (lomask[x]) { // inner mask was empty, test if outer mask is filled - if (!lomask[x+rw] || !lomask[x+1]) { // test if outer mask is empty underneath or to the right - osz++; // increment outer edge size - lres[x]=3; // flag pixel as outer edge - } - else { - gsz++; // increment the gradient pixel count - lres[x]=2; // flag pixel as gradient - } - } - /* lower right corner */ - x=rw-1; - // test if inner mask is filled - if (limask[x]) { - // test if inner mask is empty above or to the left - if (!limask[x+rw] || !limask[x-1]) { - isz++; // increment inner edge size - lres[x]=4; // flag pixel as inner edge - } - else { - res[x]=1.0f; // pixel is just part of inner mask, and it's not an edge - } - } - else if (lomask[x]) { // inner mask was empty, test if outer mask is filled - if (!lomask[x+rw] || !lomask[x-1]) { // test if outer mask is empty underneath or to the left - osz++; // increment outer edge size - lres[x]=3; // flag pixel as outer edge - } - else { - gsz++; // increment the gradient pixel count - lres[x]=2; // flag pixel as gradient - } - } - /* Test the TOP row of pixels in buffer, except corners */ - for (x= t-1; x>=(t-rw)+2; x--) { - // test if inner mask is filled - if (limask[x]) { - // test if inner mask is empty to the left or to the right - if (!limask[x-1] || !limask[x+1]) { - isz++; // increment inner edge size - lres[x]=4; // flag pixel as inner edge - } - else { - res[x]=1.0f; // pixel is just part of inner mask, and it's not an edge - } - } - else if (lomask[x]) { // inner mask was empty, test if outer mask is filled - if (!lomask[x-1] || !lomask[x+1]) { // test if outer mask is empty to the left or to the right - osz++; // increment outer edge size - lres[x]=3; // flag pixel as outer edge - } - else { - gsz++; // increment the gradient pixel count - lres[x]=2; // flag pixel as gradient - } - } - } - - /* Test the BOTTOM row of pixels in buffer, except corners */ - for (x= rw-2; x; x--) { - // test if inner mask is filled - if (limask[x]) { - // test if inner mask is empty to the left or to the right - if (!limask[x-1] || !limask[x+1]) { - isz++; // increment inner edge size - lres[x]=4; // flag pixel as inner edge - } - else { - res[x]=1.0f; // pixel is just part of inner mask, and it's not an edge - } - } - else if (lomask[x]) { // inner mask was empty, test if outer mask is filled - if (!lomask[x-1] || !lomask[x+1]) { // test if outer mask is empty to the left or to the right - osz++; // increment outer edge size - lres[x]=3; // flag pixel as outer edge - } - else { - gsz++; // increment the gradient pixel count - lres[x]=2; // flag pixel as gradient - } - } - } - /* Test the LEFT edge of pixels in buffer, except corners */ - for (x= t-(rw<<1)+1; x>=rw; x-=rw) { - // test if inner mask is filled - if (limask[x]) { - // test if inner mask is empty underneath or above - if (!limask[x-rw] || !limask[x+rw]) { - isz++; // increment inner edge size - lres[x]=4; // flag pixel as inner edge - } - else { - res[x]=1.0f; // pixel is just part of inner mask, and it's not an edge - } - } - else if (lomask[x]) { // inner mask was empty, test if outer mask is filled - if (!lomask[x-rw] || !lomask[x+rw]) { // test if outer mask is empty underneath or above - osz++; // increment outer edge size - lres[x]=3; // flag pixel as outer edge - } - else { - gsz++; // increment the gradient pixel count - lres[x]=2; // flag pixel as gradient - } - } - } - - /* Test the RIGHT edge of pixels in buffer, except corners */ - for (x= t-rw; x>rw; x-=rw) { - // test if inner mask is filled - if (limask[x]) { - // test if inner mask is empty underneath or above - if (!limask[x-rw] || !limask[x+rw]) { - isz++; // increment inner edge size - lres[x]=4; // flag pixel as inner edge - } - else { - res[x]=1.0f; // pixel is just part of inner mask, and it's not an edge - } - } - else if (lomask[x]) { // inner mask was empty, test if outer mask is filled - if (!lomask[x-rw] || !lomask[x+rw]) { // test if outer mask is empty underneath or above - osz++; // increment outer edge size - lres[x]=3; // flag pixel as outer edge - } - else { - gsz++; // increment the gradient pixel count - lres[x]=2; // flag pixel as gradient - } - } - } - - rsize[0]=isz; // fill in our return sizes for edges + fill - rsize[1]=osz; - rsize[2]=gsz; -} - -static void do_allEdgeDetection(unsigned int t, unsigned int rw, unsigned int *limask, unsigned int *lomask, unsigned int *lres, float *res, unsigned int *rsize, unsigned int in_isz, unsigned int in_osz, unsigned int in_gsz) -{ - int x; // x = pixel loop counter - int a; // a = pixel loop counter - int dx; // dx = delta x - int pix_prevRow; // pix_prevRow = pixel one row behind the one we are testing in a loop - int pix_nextRow; // pix_nextRow = pixel one row in front of the one we are testing in a loop - int pix_prevCol; // pix_prevCol = pixel one column behind the one we are testing in a loop - int pix_nextCol; // pix_nextCol = pixel one column in front of the one we are testing in a loop - /* Test all rows between the FIRST and LAST rows, excluding left and right edges */ - for (x= (t-rw)+1, dx=x-(rw-2); dx>rw; x-=rw, dx-=rw) { - a=x-2; - pix_prevRow=a+rw; - pix_nextRow=a-rw; - pix_prevCol=a+1; - pix_nextCol=a-1; - while (a>dx-2) { - if (!limask[a]) { // if the inner mask is empty - if (lomask[a]) { // if the outer mask is full - /* - * Next we test all 4 directions around the current pixel: next/prev/up/down - * The test ensures that the outer mask is empty and that the inner mask - * is also empty. If both conditions are true for any one of the 4 adjacent pixels - * then the current pixel is counted as being a true outer edge pixel. - */ - if ((!lomask[pix_nextCol] && !limask[pix_nextCol]) || - (!lomask[pix_prevCol] && !limask[pix_prevCol]) || - (!lomask[pix_nextRow] && !limask[pix_nextRow]) || - (!lomask[pix_prevRow] && !limask[pix_prevRow])) - { - in_osz++; // increment the outer boundary pixel count - lres[a]=3; // flag pixel as part of outer edge - } - else { // it's not a boundary pixel, but it is a gradient pixel - in_gsz++; // increment the gradient pixel count - lres[a]=2; // flag pixel as gradient - } - } - - } - else { - if (!limask[pix_nextCol] || !limask[pix_prevCol] || !limask[pix_nextRow] || !limask[pix_prevRow]) { - in_isz++; // increment the inner boundary pixel count - lres[a]=4; // flag pixel as part of inner edge - } - else { - res[a]=1.0f; // pixel is part of inner mask, but not at an edge - } - } - a--; - pix_prevRow--; - pix_nextRow--; - pix_prevCol--; - pix_nextCol--; - } - } - - rsize[0]=in_isz; // fill in our return sizes for edges + fill - rsize[1]=in_osz; - rsize[2]=in_gsz; -} - -static void do_adjacentEdgeDetection(unsigned int t, unsigned int rw, unsigned int *limask, unsigned int *lomask, unsigned int *lres, float *res, unsigned int *rsize, unsigned int in_isz, unsigned int in_osz, unsigned int in_gsz) -{ - int x; // x = pixel loop counter - int a; // a = pixel loop counter - int dx; // dx = delta x - int pix_prevRow; // pix_prevRow = pixel one row behind the one we are testing in a loop - int pix_nextRow; // pix_nextRow = pixel one row in front of the one we are testing in a loop - int pix_prevCol; // pix_prevCol = pixel one column behind the one we are testing in a loop - int pix_nextCol; // pix_nextCol = pixel one column in front of the one we are testing in a loop - /* Test all rows between the FIRST and LAST rows, excluding left and right edges */ - for (x= (t-rw)+1, dx=x-(rw-2); dx>rw; x-=rw, dx-=rw) { - a=x-2; - pix_prevRow=a+rw; - pix_nextRow=a-rw; - pix_prevCol=a+1; - pix_nextCol=a-1; - while (a>dx-2) { - if (!limask[a]) { // if the inner mask is empty - if (lomask[a]) { // if the outer mask is full - /* - * Next we test all 4 directions around the current pixel: next/prev/up/down - * The test ensures that the outer mask is empty and that the inner mask - * is also empty. If both conditions are true for any one of the 4 adjacent pixels - * then the current pixel is counted as being a true outer edge pixel. - */ - if ((!lomask[pix_nextCol] && !limask[pix_nextCol]) || - (!lomask[pix_prevCol] && !limask[pix_prevCol]) || - (!lomask[pix_nextRow] && !limask[pix_nextRow]) || - (!lomask[pix_prevRow] && !limask[pix_prevRow])) - { - in_osz++; // increment the outer boundary pixel count - lres[a]=3; // flag pixel as part of outer edge - } - else { // it's not a boundary pixel, but it is a gradient pixel - in_gsz++; // increment the gradient pixel count - lres[a]=2; // flag pixel as gradient - } - } - - } - else { - if ((!limask[pix_nextCol] && lomask[pix_nextCol]) || - (!limask[pix_prevCol] && lomask[pix_prevCol]) || - (!limask[pix_nextRow] && lomask[pix_nextRow]) || - (!limask[pix_prevRow] && lomask[pix_prevRow])) - { - in_isz++; // increment the inner boundary pixel count - lres[a]=4; // flag pixel as part of inner edge - } - else { - res[a]=1.0f; // pixel is part of inner mask, but not at an edge - } - } - a--; - pix_prevRow--; // advance all four "surrounding" pixel pointers - pix_nextRow--; - pix_prevCol--; - pix_nextCol--; - } - } - - rsize[0]=in_isz; // fill in our return sizes for edges + fill - rsize[1]=in_osz; - rsize[2]=in_gsz; -} - -static void do_createEdgeLocationBuffer(unsigned int t, unsigned int rw, unsigned int *lres, float *res, unsigned short *gbuf, unsigned int *innerEdgeOffset, unsigned int *outerEdgeOffset, unsigned int isz, unsigned int gsz) -{ - int x; // x = pixel loop counter - int a; // a = temporary pixel index buffer loop counter - unsigned int ud; // ud = unscaled edge distance - unsigned int dmin; // dmin = minimum edge distance - - unsigned int rsl; // long used for finding fast 1.0/sqrt - unsigned int gradientFillOffset; - unsigned int innerAccum=0; // for looping inner edge pixel indexes, represents current position from offset - unsigned int outerAccum=0; // for looping outer edge pixel indexes, represents current position from offset - unsigned int gradientAccum=0; // for looping gradient pixel indexes, represents current position from offset - /* - * Here we compute the size of buffer needed to hold (row, col) coordinates - * for each pixel previously determined to be either gradient, inner edge, - * or outer edge. - * - * Allocation is done by requesting 4 bytes "sizeof(int)" per pixel, even - * though gbuf[] is declared as unsigned short* (2 bytes) because we don't - * store the pixel indexes, we only store x, y location of pixel in buffer. - * - * This does make the assumption that x and y can fit in 16 unsigned bits - * so if Blender starts doing renders greater than 65536 in either direction - * this will need to allocate gbuf[] as unsigned int* and allocate 8 bytes - * per flagged pixel. - * - * In general, the buffer on-screen: - * - * Example: 9 by 9 pixel block - * - * . = pixel non-white in both outer and inner mask - * o = pixel white in outer, but not inner mask, adjacent to "." pixel - * g = pixel white in outer, but not inner mask, not adjacent to "." pixel - * i = pixel white in inner mask, adjacent to "g" or "." pixel - * F = pixel white in inner mask, only adjacent to other pixels white in the inner mask - * - * - * ......... <----- pixel #80 - * ..oooo... - * .oggggo.. - * .oggiggo. - * .ogiFigo. - * .oggiggo. - * .oggggo.. - * ..oooo... - * pixel #00 -----> ......... - * - * gsz = 18 (18 "g" pixels above) - * isz = 4 (4 "i" pixels above) - * osz = 18 (18 "o" pixels above) - * - * - * The memory in gbuf[] after filling will look like this: - * - * gradientFillOffset (0 pixels) innerEdgeOffset (18 pixels) outerEdgeOffset (22 pixels) - * / / / - * / / / - * |X Y X Y X Y X Y > <X Y X Y > <X Y X Y X Y > <X Y X Y | <- (x, y) - * +--------------------------------> <----------------> <------------------------> <----------------+ - * |0 2 4 6 8 10 12 14 > ... <68 70 72 74 > ... <80 82 84 86 88 90 > ... <152 154 156 158 | <- bytes - * +--------------------------------> <----------------> <------------------------> <----------------+ - * |g0 g0 g1 g1 g2 g2 g3 g3 > <g17 g17 i0 i0 > <i2 i2 i3 i3 o0 o0 > <o16 o16 o17 o17 | <- pixel - * / / / - * / / / - * / / / - * +---------- gradientAccum (18) ---------+ +--- innerAccum (22) ---+ +--- outerAccum (40) ---+ - * - * - * Ultimately we do need the pixel's memory buffer index to set the output - * pixel color, but it's faster to reconstruct the memory buffer location - * each iteration of the final gradient calculation than it is to deconstruct - * a memory location into x, y pairs each round. - */ - - - gradientFillOffset=0; // since there are likely "more" of these, put it first. :) - *innerEdgeOffset=gradientFillOffset+gsz; // set start of inner edge indexes - *outerEdgeOffset=(*innerEdgeOffset)+isz; // set start of outer edge indexes - /* set the accumulators to correct positions */ // set up some accumulator variables for loops - gradientAccum = gradientFillOffset; // each accumulator variable starts at its respective - innerAccum = *innerEdgeOffset; // section's offset so when we start filling, each - outerAccum = *outerEdgeOffset; // section fills up it's allocated space in gbuf - //uses dmin=row, rsl=col - for (x=0, dmin=0; x<t; x+=rw, dmin++) { - for (rsl=0; rsl<rw; rsl++) { - a=x+rsl; - if (lres[a]==2) { // it is a gradient pixel flagged by 2 - ud=gradientAccum<<1; // double the index to reach correct unsigned short location - gbuf[ud]=dmin; // insert pixel's row into gradient pixel location buffer - gbuf[ud+1]=rsl; // insert pixel's column into gradient pixel location buffer - gradientAccum++; // increment gradient index buffer pointer - } - else if (lres[a]==3) { // it is an outer edge pixel flagged by 3 - ud=outerAccum<<1; // double the index to reach correct unsigned short location - gbuf[ud]=dmin; // insert pixel's row into outer edge pixel location buffer - gbuf[ud+1]=rsl; // insert pixel's column into outer edge pixel location buffer - outerAccum++; // increment outer edge index buffer pointer - res[a]=0.0f; // set output pixel intensity now since it won't change later - } - else if (lres[a]==4) { // it is an inner edge pixel flagged by 4 - ud=innerAccum<<1; // double int index to reach correct unsigned short location - gbuf[ud]=dmin; // insert pixel's row into inner edge pixel location buffer - gbuf[ud+1]=rsl; // insert pixel's column into inner edge pixel location buffer - innerAccum++; // increment inner edge index buffer pointer - res[a]=1.0f; // set output pixel intensity now since it won't change later - } - } - } - -} - -static void do_fillGradientBuffer(unsigned int rw, float *res, unsigned short *gbuf, unsigned int isz, unsigned int osz, unsigned int gsz, unsigned int innerEdgeOffset, unsigned int outerEdgeOffset) -{ - int x; // x = pixel loop counter - int a; // a = temporary pixel index buffer loop counter - int fsz; // size of the frame - unsigned int rsl; // long used for finding fast 1.0/sqrt - float rsf; // float used for finding fast 1.0/sqrt - const float rsopf = 1.5f; // constant float used for finding fast 1.0/sqrt - - unsigned int gradientFillOffset; - unsigned int t; - unsigned int ud; // ud = unscaled edge distance - unsigned int dmin; // dmin = minimum edge distance - float odist; // odist = current outer edge distance - float idist; // idist = current inner edge distance - int dx; // dx = X-delta (used for distance proportion calculation) - int dy; // dy = Y-delta (used for distance proportion calculation) - /* - * The general algorithm used to color each gradient pixel is: - * - * 1.) Loop through all gradient pixels. - * A.) For each gradient pixel: - * a.) Loop though all outside edge pixels, looking for closest one - * to the gradient pixel we are in. - * b.) Loop through all inside edge pixels, looking for closest one - * to the gradient pixel we are in. - * c.) Find proportion of distance from gradient pixel to inside edge - * pixel compared to sum of distance to inside edge and distance to - * outside edge. - * - * In an image where: - * . = blank (black) pixels, not covered by inner mask or outer mask - * + = desired gradient pixels, covered only by outer mask - * * = white full mask pixels, covered by at least inner mask - * - * ............................... - * ...............+++++++++++..... - * ...+O++++++..++++++++++++++.... - * ..+++\++++++++++++++++++++..... - * .+++++G+++++++++*******+++..... - * .+++++|+++++++*********+++..... - * .++***I****************+++..... - * .++*******************+++...... - * .+++*****************+++....... - * ..+++***************+++........ - * ....+++**********+++........... - * ......++++++++++++............. - * ............................... - * - * O = outside edge pixel - * \ - * G = gradient pixel - * | - * I = inside edge pixel - * - * __ - * *note that IO does not need to be a straight line, in fact - * many cases can arise where straight lines do not work - * correctly. - * - * __ __ __ - * d.) Pixel color is assigned as |GO| / ( |GI| + |GO| ) - * - * The implementation does not compute distance, but the reciprocal of the - * distance. This is done to avoid having to compute a square root, as a - * reciprocal square root can be computed faster. Therefore, the code computes - * pixel color as |GI| / (|GI| + |GO|). Since these are reciprocals, GI serves the - * purpose of GO for the proportion calculation. - * - * For the purposes of the minimum distance comparisons, we only check - * the sums-of-squares against each other, since they are in the same - * mathematical sort-order as if we did go ahead and take square roots - * - * Loop through all gradient pixels. - */ - - for (x= gsz-1; x>=0; x--) { - gradientFillOffset=x<<1; - t=gbuf[gradientFillOffset]; // calculate column of pixel indexed by gbuf[x] - fsz=gbuf[gradientFillOffset+1]; // calculate row of pixel indexed by gbuf[x] - dmin=0xffffffff; // reset min distance to edge pixel - for (a=outerEdgeOffset+osz-1; a>=outerEdgeOffset; a--) { // loop through all outer edge buffer pixels - ud=a<<1; - dy=t-gbuf[ud]; // set dx to gradient pixel column - outer edge pixel row - dx=fsz-gbuf[ud+1]; // set dy to gradient pixel row - outer edge pixel column - ud=dx*dx+dy*dy; // compute sum of squares - if (ud<dmin) { // if our new sum of squares is less than the current minimum - dmin=ud; // set a new minimum equal to the new lower value - } - } - odist=(float)(dmin); // cast outer min to a float - rsf=odist*0.5f; // - rsl=*(unsigned int*)&odist; // use some peculiar properties of the way bits are stored - rsl=0x5f3759df-(rsl>>1); // in floats vs. unsigned ints to compute an approximate - odist=*(float*)&rsl; // reciprocal square root - odist=odist*(rsopf-(rsf*odist*odist)); // -- ** this line can be iterated for more accuracy ** -- - dmin=0xffffffff; // reset min distance to edge pixel - for (a= innerEdgeOffset+isz-1; a>=innerEdgeOffset; a--) { // loop through all inside edge pixels - ud=a<<1; - dy=t-gbuf[ud]; // compute delta in Y from gradient pixel to inside edge pixel - dx=fsz-gbuf[ud+1]; // compute delta in X from gradient pixel to inside edge pixel - ud=dx*dx+dy*dy; // compute sum of squares - if (ud<dmin) { // if our new sum of squares is less than the current minimum we've found - dmin=ud; // set a new minimum equal to the new lower value - } - } - idist=(float)(dmin); // cast inner min to a float - rsf=idist*0.5f; // - rsl=*(unsigned int*)&idist; // - rsl=0x5f3759df-(rsl>>1); // see notes above - idist=*(float*)&rsl; // - idist=idist*(rsopf-(rsf*idist*idist)); // - /* - * Note once again that since we are using reciprocals of distance values our - * proportion is already the correct intensity, and does not need to be - * subtracted from 1.0 like it would have if we used real distances. - */ - - /* - * Here we reconstruct the pixel's memory location in the CompBuf by - * Pixel Index = Pixel Column + ( Pixel Row * Row Width ) - */ - res[gbuf[gradientFillOffset+1]+(gbuf[gradientFillOffset]*rw)]=(idist/(idist+odist)); //set intensity - } - -} - - -static void node_composit_exec_doubleedgemask(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out) -{ - - float *imask; // imask = pointer to inner mask pixel buffer - float *omask; // omask = pointer to outer mask pixel buffer - float *res; // res = pointer to output mask - - unsigned int *lres; // lres = unsigned int pointer to output pixel buffer (for bit operations) - unsigned int *limask; // limask = unsigned int pointer to inner mask (for bit operations) - unsigned int *lomask; // lomask = unsigned int pointer to outer mask (for bit operations) - - int rw; // rw = pixel row width - int t; // t = total number of pixels in buffer - 1 (used for loop starts) - int fsz; // size of the frame - - unsigned int isz=0; // size (in pixels) of inside edge pixel index buffer - unsigned int osz=0; // size (in pixels) of outside edge pixel index buffer - unsigned int gsz=0; // size (in pixels) of gradient pixel index buffer - unsigned int rsize[3]; // size storage to pass to helper functions - unsigned int innerEdgeOffset=0; // offset into final buffer where inner edge pixel indexes start - unsigned int outerEdgeOffset=0; // offset into final buffer where outer edge pixel indexes start - - unsigned short *gbuf; // gradient/inner/outer pixel location index buffer - - CompBuf *cbuf; // pointer, will be set to inner mask data - CompBuf *dbuf; // pointer, will be set to outer mask data - CompBuf *stackbuf; // pointer, will get allocated as output buffer - - if (out[0]->hasoutput==0) { // if the node's output socket is not connected to anything... - return; // do not execute any further, just exit the node immediately - } - - if (in[0]->data && in[1]->data) { // if both input sockets have some data coming in... - cbuf= in[0]->data; // get a pointer to the inner mask data - dbuf= in[1]->data; // get a pointer to the outer mask data - if (cbuf->type!=CB_VAL || dbuf->type!=CB_VAL) { // if either input socket has an incorrect data type coming in - return; // exit the node immediately - } - - t=(cbuf->x*cbuf->y)-1; // determine size of the frame - - stackbuf= alloc_compbuf(cbuf->x, cbuf->y, CB_VAL, 1); // allocate the output buffer - - imask= cbuf->rect; // set the inner mask - omask= dbuf->rect; // set the outer mask - res= stackbuf->rect; // set output pointer - lres= (unsigned int*)res; // unsigned int pointer to output buffer (for bit level ops) - limask=(unsigned int*)imask; // unsigned int pointer to input mask (for bit level ops) - lomask=(unsigned int*)omask; // unsigned int pointer to output mask (for bit level ops) - rw= cbuf->x; // width of a row of pixels - - - /* - * The whole buffer is broken up into 4 parts. The four CORNERS, the FIRST and LAST rows, the - * LEFT and RIGHT edges (excluding the corner pixels), and all OTHER rows. - * This allows for quick computation of outer edge pixels where - * a screen edge pixel is marked to be gradient. - * - * The pixel type (gradient vs inner-edge vs outer-edge) tests change - * depending on the user selected "Inner Edge Mode" and the user selected - * "Buffer Edge Mode" on the node's GUI. There are 4 sets of basically the - * same algorithm: - * - * 1.) Inner Edge -> Adjacent Only - * Buffer Edge -> Keep Inside - * - * 2.) Inner Edge -> Adjacent Only - * Buffer Edge -> Bleed Out - * - * 3.) Inner Edge -> All - * Buffer Edge -> Keep Inside - * - * 4.) Inner Edge -> All - * Buffer Edge -> Bleed Out - * - * Each version has slightly different criteria for detecting an edge pixel. - */ - if (node->custom2) { // if "adjacent only" inner edge mode is turned on - if (node->custom1) { // if "keep inside" buffer edge mode is turned on - do_adjacentKeepBorders(t, rw, limask, lomask, lres, res, rsize); - } - else { // "bleed out" buffer edge mode is turned on - do_adjacentBleedBorders(t, rw, limask, lomask, lres, res, rsize); - } - isz=rsize[0]; // set up inner edge, outer edge, and gradient buffer sizes after border pass - osz=rsize[1]; - gsz=rsize[2]; - // detect edges in all non-border pixels in the buffer - do_adjacentEdgeDetection(t, rw, limask, lomask, lres, res, rsize, isz, osz, gsz); - } - else { // "all" inner edge mode is turned on - if (node->custom1) { // if "keep inside" buffer edge mode is turned on - do_allKeepBorders(t, rw, limask, lomask, lres, res, rsize); - } - else { // "bleed out" buffer edge mode is turned on - do_allBleedBorders(t, rw, limask, lomask, lres, res, rsize); - } - isz=rsize[0]; // set up inner edge, outer edge, and gradient buffer sizes after border pass - osz=rsize[1]; - gsz=rsize[2]; - // detect edges in all non-border pixels in the buffer - do_allEdgeDetection(t, rw, limask, lomask, lres, res, rsize, isz, osz, gsz); - } - - isz=rsize[0]; // set edge and gradient buffer sizes once again... - osz=rsize[1]; // the sizes in rsize[] may have been modified - gsz=rsize[2]; // by the do_*EdgeDetection() function. - - // quick check for existance of edges in the buffer... - // if we don't have any one of the three sizes, the other two make no difference visually, - // so we can just pass the inner input buffer back as output. - if (!gsz || !isz || !osz) { - out[0]->data= stackbuf; // point the node output buffer to our filled buffer - return; - } - - - fsz=gsz+isz+osz; // calculate size of pixel index buffer needed - gbuf= MEM_mallocN(fsz*sizeof(int), "grd buf"); // allocate edge/gradient pixel index buffer - - do_createEdgeLocationBuffer(t, rw, lres, res, gbuf, &innerEdgeOffset, &outerEdgeOffset, isz, gsz); - do_fillGradientBuffer(rw, res, gbuf, isz, osz, gsz, innerEdgeOffset, outerEdgeOffset); - - MEM_freeN(gbuf); // free the gradient index buffer - out[0]->data= stackbuf; // point the node output buffer to our filled buffer - } -} - -#endif /* WITH_COMPOSITOR_LEGACY */ - void register_node_type_cmp_doubleedgemask(bNodeTreeType *ttype) { static bNodeType ntype; // allocate a node type data structure @@ -1282,9 +49,6 @@ void register_node_type_cmp_doubleedgemask(bNodeTreeType *ttype) node_type_base(ttype, &ntype, CMP_NODE_DOUBLEEDGEMASK, "Double Edge Mask", NODE_CLASS_MATTE, NODE_OPTIONS); node_type_socket_templates(&ntype, cmp_node_doubleedgemask_in, cmp_node_doubleedgemask_out); node_type_size(&ntype, 210, 210, 210); -#ifdef WITH_COMPOSITOR_LEGACY - node_type_exec(&ntype, node_composit_exec_doubleedgemask); -#endif nodeRegisterType(ttype, &ntype); } diff --git a/source/blender/nodes/composite/nodes/node_composite_filter.c b/source/blender/nodes/composite/nodes/node_composite_filter.c index a27116ab077..338bfc0326d 100644 --- a/source/blender/nodes/composite/nodes/node_composite_filter.c +++ b/source/blender/nodes/composite/nodes/node_composite_filter.c @@ -43,186 +43,6 @@ static bNodeSocketTemplate cmp_node_filter_out[] = { { -1, 0, "" } }; -#ifdef WITH_COMPOSITOR_LEGACY - -static void do_filter_edge(CompBuf *out, CompBuf *in, float *filter, float fac) -{ - float *row1, *row2, *row3; - float *fp, f1, f2, mfac= 1.0f-fac; - int rowlen, x, y, c, pix= in->type; - - rowlen= in->x; - - for (y=0; y<in->y; y++) { - /* setup rows */ - if (y==0) row1= in->rect; - else row1= in->rect + pix*(y-1)*rowlen; - - row2= in->rect + y*pix*rowlen; - - if (y==in->y-1) row3= row2; - else row3= row2 + pix*rowlen; - - fp= out->rect + pix*y*rowlen; - - if (pix==CB_RGBA) { - copy_v4_v4(fp, row2); - fp+= pix; - - for (x=2; x<rowlen; x++) { - for (c=0; c<3; c++) { - f1= filter[0]*row1[0] + filter[1]*row1[4] + filter[2]*row1[8] + filter[3]*row2[0] + filter[4]*row2[4] + filter[5]*row2[8] + filter[6]*row3[0] + filter[7]*row3[4] + filter[8]*row3[8]; - f2= filter[0]*row1[0] + filter[3]*row1[4] + filter[6]*row1[8] + filter[1]*row2[0] + filter[4]*row2[4] + filter[7]*row2[8] + filter[2]*row3[0] + filter[5]*row3[4] + filter[8]*row3[8]; - fp[0] = mfac*row2[4] + fac*sqrt(f1*f1 + f2*f2); - fp++; row1++; row2++; row3++; - } - fp[0] = row2[4]; - /* no alpha... will clear it completely */ - fp++; row1++; row2++; row3++; - } - copy_v4_v4(fp, row2+4); - } - else if (pix==CB_VAL) { - fp+= pix; - for (x=2; x<rowlen; x++) { - f1= filter[0]*row1[0] + filter[1]*row1[1] + filter[2]*row1[2] + filter[3]*row2[0] + filter[4]*row2[1] + filter[5]*row2[2] + filter[6]*row3[0] + filter[7]*row3[1] + filter[8]*row3[2]; - f2= filter[0]*row1[0] + filter[3]*row1[1] + filter[6]*row1[2] + filter[1]*row2[0] + filter[4]*row2[1] + filter[7]*row2[2] + filter[2]*row3[0] + filter[5]*row3[1] + filter[8]*row3[2]; - fp[0] = mfac*row2[1] + fac*sqrt(f1*f1 + f2*f2); - fp++; row1++; row2++; row3++; - } - } - } -} - -static void do_filter3(CompBuf *out, CompBuf *in, float *filter, float fac) -{ - float *row1, *row2, *row3; - float *fp, mfac= 1.0f-fac; - int rowlen, x, y, c; - int pixlen= in->type; - - rowlen= in->x; - - for (y=0; y<in->y; y++) { - /* setup rows */ - if (y==0) row1= in->rect; - else row1= in->rect + pixlen*(y-1)*rowlen; - - row2= in->rect + y*pixlen*rowlen; - - if (y==in->y-1) row3= row2; - else row3= row2 + pixlen*rowlen; - - fp= out->rect + pixlen*(y)*rowlen; - - if (pixlen==1) { - fp[0] = row2[0]; - fp+= 1; - - for (x=2; x<rowlen; x++) { - fp[0] = mfac*row2[1] + fac*(filter[0]*row1[0] + filter[1]*row1[1] + filter[2]*row1[2] + filter[3]*row2[0] + filter[4]*row2[1] + filter[5]*row2[2] + filter[6]*row3[0] + filter[7]*row3[1] + filter[8]*row3[2]); - fp++; row1++; row2++; row3++; - } - fp[0] = row2[1]; - } - else if (pixlen==2) { - fp[0] = row2[0]; - fp[1] = row2[1]; - fp+= 2; - - for (x=2; x<rowlen; x++) { - for (c=0; c<2; c++) { - fp[0] = mfac*row2[2] + fac*(filter[0]*row1[0] + filter[1]*row1[2] + filter[2]*row1[4] + filter[3]*row2[0] + filter[4]*row2[2] + filter[5]*row2[4] + filter[6]*row3[0] + filter[7]*row3[2] + filter[8]*row3[4]); - fp++; row1++; row2++; row3++; - } - } - fp[0] = row2[2]; - fp[1] = row2[3]; - } - else if (pixlen==3) { - copy_v3_v3(fp, row2); - fp+= 3; - - for (x=2; x<rowlen; x++) { - for (c=0; c<3; c++) { - fp[0] = mfac*row2[3] + fac*(filter[0]*row1[0] + filter[1]*row1[3] + filter[2]*row1[6] + filter[3]*row2[0] + filter[4]*row2[3] + filter[5]*row2[6] + filter[6]*row3[0] + filter[7]*row3[3] + filter[8]*row3[6]); - fp++; row1++; row2++; row3++; - } - } - copy_v3_v3(fp, row2+3); - } - else { - copy_v4_v4(fp, row2); - fp+= 4; - - for (x=2; x<rowlen; x++) { - for (c=0; c<4; c++) { - fp[0] = mfac*row2[4] + fac*(filter[0]*row1[0] + filter[1]*row1[4] + filter[2]*row1[8] + filter[3]*row2[0] + filter[4]*row2[4] + filter[5]*row2[8] + filter[6]*row3[0] + filter[7]*row3[4] + filter[8]*row3[8]); - fp++; row1++; row2++; row3++; - } - } - copy_v4_v4(fp, row2+4); - } - } -} - - -static void node_composit_exec_filter(void *data, bNode *node, bNodeStack **in, bNodeStack **out) -{ - static float soft[9] = {1/16.0f, 2/16.0f, 1/16.0f, 2/16.0f, 4/16.0f, 2/16.0f, 1/16.0f, 2/16.0f, 1/16.0f}; - float sharp[9] = {-1, -1, -1, -1, 9, -1, -1, -1, -1}; - float laplace[9] = {-1/8.0f, -1/8.0f, -1/8.0f, -1/8.0f, 1.0f, -1/8.0f, -1/8.0f, -1/8.0f, -1/8.0f}; - float sobel[9] = {1, 2, 1, 0, 0, 0, -1, -2, -1}; - float prewitt[9] = {1, 1, 1, 0, 0, 0, -1, -1, -1}; - float kirsch[9] = {5, 5, 5, -3, -3, -3, -2, -2, -2}; - float shadow[9] = {1, 2, 1, 0, 1, 0, -1, -2, -1}; - - if (out[0]->hasoutput==0) return; - - /* stack order in: Image */ - /* stack order out: Image */ - - if (in[1]->data) { - /* make output size of first available input image */ - CompBuf *cbuf= in[1]->data; - CompBuf *stackbuf= alloc_compbuf(cbuf->x, cbuf->y, cbuf->type, 1); /* allocs */ - - /* warning note: xof and yof are applied in pixelprocessor, but should be copied otherwise? */ - stackbuf->xof= cbuf->xof; - stackbuf->yof= cbuf->yof; - - switch (node->custom1) { - case CMP_FILT_SOFT: - do_filter3(stackbuf, cbuf, soft, in[0]->vec[0]); - break; - case CMP_FILT_SHARP: - do_filter3(stackbuf, cbuf, sharp, in[0]->vec[0]); - break; - case CMP_FILT_LAPLACE: - do_filter3(stackbuf, cbuf, laplace, in[0]->vec[0]); - break; - case CMP_FILT_SOBEL: - do_filter_edge(stackbuf, cbuf, sobel, in[0]->vec[0]); - break; - case CMP_FILT_PREWITT: - do_filter_edge(stackbuf, cbuf, prewitt, in[0]->vec[0]); - break; - case CMP_FILT_KIRSCH: - do_filter_edge(stackbuf, cbuf, kirsch, in[0]->vec[0]); - break; - case CMP_FILT_SHADOW: - do_filter3(stackbuf, cbuf, shadow, in[0]->vec[0]); - break; - } - - out[0]->data= stackbuf; - - generate_preview(data, node, out[0]->data); - } -} - -#endif /* WITH_COMPOSITOR_LEGACY */ - void register_node_type_cmp_filter(bNodeTreeType *ttype) { static bNodeType ntype; @@ -231,9 +51,6 @@ void register_node_type_cmp_filter(bNodeTreeType *ttype) node_type_socket_templates(&ntype, cmp_node_filter_in, cmp_node_filter_out); node_type_size(&ntype, 80, 40, 120); node_type_label(&ntype, node_filter_label); -#ifdef WITH_COMPOSITOR_LEGACY - node_type_exec(&ntype, node_composit_exec_filter); -#endif nodeRegisterType(ttype, &ntype); } diff --git a/source/blender/nodes/composite/nodes/node_composite_flip.c b/source/blender/nodes/composite/nodes/node_composite_flip.c index 4aa98d173e7..de41c7274fe 100644 --- a/source/blender/nodes/composite/nodes/node_composite_flip.c +++ b/source/blender/nodes/composite/nodes/node_composite_flip.c @@ -43,55 +43,6 @@ static bNodeSocketTemplate cmp_node_flip_out[] = { { -1, 0, "" } }; -#ifdef WITH_COMPOSITOR_LEGACY - -static void node_composit_exec_flip(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out) -{ - if (in[0]->data) { - CompBuf *cbuf= in[0]->data; - CompBuf *stackbuf= alloc_compbuf(cbuf->x, cbuf->y, cbuf->type, 1); /* note, this returns zero'd image */ - int i, src_pix, src_width, src_height, srcydelt, outydelt, x, y; - float *srcfp, *outfp; - - src_pix= cbuf->type; - src_width= cbuf->x; - src_height= cbuf->y; - srcfp= cbuf->rect; - outfp= stackbuf->rect; - srcydelt= src_width*src_pix; - outydelt= srcydelt; - - if (node->custom1) { /*set up output pointer for y flip*/ - outfp+= (src_height-1)*outydelt; - outydelt= -outydelt; - } - - for (y=0; y<src_height; y++) { - if (node->custom1 == 1) { /* no x flip so just copy line*/ - memcpy(outfp, srcfp, sizeof(float) * src_pix * src_width); - srcfp+=srcydelt; - } - else { - outfp += (src_width-1)*src_pix; - for (x=0; x<src_width; x++) { - for (i=0; i<src_pix; i++) { - outfp[i] = srcfp[i]; - } - outfp -= src_pix; - srcfp += src_pix; - } - outfp += src_pix; - } - outfp += outydelt; - } - - out[0]->data= stackbuf; - - } -} - -#endif /* WITH_COMPOSITOR_LEGACY */ - void register_node_type_cmp_flip(bNodeTreeType *ttype) { static bNodeType ntype; @@ -99,9 +50,6 @@ void register_node_type_cmp_flip(bNodeTreeType *ttype) node_type_base(ttype, &ntype, CMP_NODE_FLIP, "Flip", NODE_CLASS_DISTORT, NODE_OPTIONS); node_type_socket_templates(&ntype, cmp_node_flip_in, cmp_node_flip_out); node_type_size(&ntype, 140, 100, 320); -#ifdef WITH_COMPOSITOR_LEGACY - node_type_exec(&ntype, node_composit_exec_flip); -#endif nodeRegisterType(ttype, &ntype); } diff --git a/source/blender/nodes/composite/nodes/node_composite_gamma.c b/source/blender/nodes/composite/nodes/node_composite_gamma.c index b8c99894301..e7fbdeaedd7 100644 --- a/source/blender/nodes/composite/nodes/node_composite_gamma.c +++ b/source/blender/nodes/composite/nodes/node_composite_gamma.c @@ -45,40 +45,6 @@ static bNodeSocketTemplate cmp_node_gamma_out[] = { { -1, 0, "" } }; -#ifdef WITH_COMPOSITOR_LEGACY - -static void do_gamma(bNode *UNUSED(node), float *out, float *in, float *fac) -{ - int i=0; - for (i=0; i<3; i++) { - /* check for negative to avoid nan's */ - out[i] = (in[i] > 0.0f)? powf(in[i], fac[0]): in[i]; - } - out[3] = in[3]; -} -static void node_composit_exec_gamma(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out) -{ - /* stack order in: Fac, Image */ - /* stack order out: Image */ - if (out[0]->hasoutput==0) return; - - /* input no image? then only color operation */ - if (in[0]->data==NULL) { - do_gamma(node, out[0]->vec, in[0]->vec, in[1]->vec); - } - else { - /* make output size of input image */ - CompBuf *cbuf= in[0]->data; - CompBuf *stackbuf= alloc_compbuf(cbuf->x, cbuf->y, CB_RGBA, 1); // allocs - - composit2_pixel_processor(node, stackbuf, cbuf, in[0]->vec, in[1]->data, in[1]->vec, do_gamma, CB_RGBA, CB_VAL); - - out[0]->data= stackbuf; - } -} - -#endif /* WITH_COMPOSITOR_LEGACY */ - void register_node_type_cmp_gamma(bNodeTreeType *ttype) { static bNodeType ntype; @@ -86,9 +52,6 @@ void register_node_type_cmp_gamma(bNodeTreeType *ttype) node_type_base(ttype, &ntype, CMP_NODE_GAMMA, "Gamma", NODE_CLASS_OP_COLOR, NODE_OPTIONS); node_type_socket_templates(&ntype, cmp_node_gamma_in, cmp_node_gamma_out); node_type_size(&ntype, 140, 100, 320); -#ifdef WITH_COMPOSITOR_LEGACY - node_type_exec(&ntype, node_composit_exec_gamma); -#endif nodeRegisterType(ttype, &ntype); } diff --git a/source/blender/nodes/composite/nodes/node_composite_glare.c b/source/blender/nodes/composite/nodes/node_composite_glare.c index 950d8a56f58..5fdb262de97 100644 --- a/source/blender/nodes/composite/nodes/node_composite_glare.c +++ b/source/blender/nodes/composite/nodes/node_composite_glare.c @@ -41,442 +41,6 @@ static bNodeSocketTemplate cmp_node_glare_out[] = { { -1, 0, "" } }; -#ifdef WITH_COMPOSITOR_LEGACY - -// mix two images, src buffer does not have to be same size, -static void mixImages(CompBuf *dst, CompBuf *src, float mix) -{ - int x, y; - fRGB c1, c2, *dcolp, *scolp; - const float mf = 2.f - 2.f*fabsf(mix - 0.5f); - if ((dst->x == src->x) && (dst->y == src->y)) { - for (y=0; y<dst->y; y++) { - dcolp = (fRGB*)&dst->rect[y*dst->x*dst->type]; - scolp = (fRGB*)&src->rect[y*dst->x*dst->type]; - for (x=0; x<dst->x; x++) { - copy_v3_v3(c1, dcolp[x]); - copy_v3_v3(c2, scolp[x]); - c1[0] += mix*(c2[0] - c1[0]); - c1[1] += mix*(c2[1] - c1[1]); - c1[2] += mix*(c2[2] - c1[2]); - if (c1[0] < 0.f) c1[0] = 0.f; - if (c1[1] < 0.f) c1[1] = 0.f; - if (c1[2] < 0.f) c1[2] = 0.f; - mul_v3_fl(c1, mf); - copy_v3_v3(dcolp[x], c1); - } - } - } - else { - float xr = src->x / (float)dst->x; - float yr = src->y / (float)dst->y; - for (y=0; y<dst->y; y++) { - dcolp = (fRGB*)&dst->rect[y*dst->x*dst->type]; - for (x=0; x<dst->x; x++) { - copy_v3_v3(c1, dcolp[x]); - qd_getPixelLerp(src, (x + 0.5f)*xr - 0.5f, (y + 0.5f)*yr - 0.5f, c2); - c1[0] += mix*(c2[0] - c1[0]); - c1[1] += mix*(c2[1] - c1[1]); - c1[2] += mix*(c2[2] - c1[2]); - if (c1[0] < 0.f) c1[0] = 0.f; - if (c1[1] < 0.f) c1[1] = 0.f; - if (c1[2] < 0.f) c1[2] = 0.f; - mul_v3_fl(c1, mf); - copy_v3_v3(dcolp[x], c1); - } - } - } -} - - -// adds src to dst image, must be of same size -static void addImage(CompBuf* dst, CompBuf* src, float scale) -{ - if ((dst->x == src->x) && (dst->y == src->y)) { - int p = dst->x*dst->y*dst->type; - float *dcol = dst->rect, *scol = src->rect; - while (p--) *dcol++ += *scol++ * scale; - } -} - - -// returns possibly downscaled copy of all pixels above threshold -static CompBuf* BTP(CompBuf* src, float threshold, int scaledown) -{ - int x, y; - CompBuf* bsrc = qd_downScaledCopy(src, scaledown); - float* cr = bsrc->rect; - for (y=0; y<bsrc->y; ++y) - for (x=0; x<bsrc->x; ++x, cr+=4) { - if (rgb_to_luma_y(cr) >= threshold) { - cr[0] -= threshold, cr[1] -= threshold, cr[2] -= threshold; - cr[0] = MAX2(cr[0], 0.f); - cr[1] = MAX2(cr[1], 0.f); - cr[2] = MAX2(cr[2], 0.f); - } - else cr[0] = cr[1] = cr[2] = 0.f; - } - return bsrc; -} - -//-------------------------------------------------------------------------------------------- -// simple 4-point star filter - -static void star4(NodeGlare* ndg, CompBuf* dst, CompBuf* src) -{ - int x, y, i, xm, xp, ym, yp; - float c[4] = {0, 0, 0, 0}, tc[4] = {0, 0, 0, 0}; - CompBuf *tbuf1, *tbuf2, *tsrc; - const float f1 = 1.f - ndg->fade, f2 = (1.f - f1)*0.5f; - //const float t3 = ndg->threshold*3.f; - const float sc = (float)(1 << ndg->quality); - const float isc = 1.f/sc; - - tsrc = BTP(src, ndg->threshold, (int)sc); - - tbuf1 = dupalloc_compbuf(tsrc); - tbuf2 = dupalloc_compbuf(tsrc); - - for (i=0; i<ndg->iter; i++) { - // (x || x-1, y-1) to (x || x+1, y+1) - // F - for (y=0; y<tbuf1->y; y++) { - ym = y - i; - yp = y + i; - for (x=0; x<tbuf1->x; x++) { - xm = x - i; - xp = x + i; - qd_getPixel(tbuf1, x, y, c); - mul_v3_fl(c, f1); - qd_getPixel(tbuf1, (ndg->angle ? xm : x), ym, tc); - madd_v3_v3fl(c, tc, f2); - qd_getPixel(tbuf1, (ndg->angle ? xp : x), yp, tc); - madd_v3_v3fl(c, tc, f2); - qd_setPixel(tbuf1, x, y, c); - } - } - // B - for (y=tbuf1->y-1; y>=0; y--) { - ym = y - i; - yp = y + i; - for (x=tbuf1->x-1; x>=0; x--) { - xm = x - i; - xp = x + i; - qd_getPixel(tbuf1, x, y, c); - mul_v3_fl(c, f1); - qd_getPixel(tbuf1, (ndg->angle ? xm : x), ym, tc); - madd_v3_v3fl(c, tc, f2); - qd_getPixel(tbuf1, (ndg->angle ? xp : x), yp, tc); - madd_v3_v3fl(c, tc, f2); - qd_setPixel(tbuf1, x, y, c); - } - } - // (x-1, y || y+1) to (x+1, y || y-1) - // F - for (y=0; y<tbuf2->y; y++) { - ym = y - i; - yp = y + i; - for (x=0; x<tbuf2->x; x++) { - xm = x - i; - xp = x + i; - qd_getPixel(tbuf2, x, y, c); - mul_v3_fl(c, f1); - qd_getPixel(tbuf2, xm, (ndg->angle ? yp : y), tc); - madd_v3_v3fl(c, tc, f2); - qd_getPixel(tbuf2, xp, (ndg->angle ? ym : y), tc); - madd_v3_v3fl(c, tc, f2); - qd_setPixel(tbuf2, x, y, c); - } - } - // B - for (y=tbuf2->y-1; y>=0; y--) { - ym = y - i; - yp = y + i; - for (x=tbuf2->x-1; x>=0; x--) { - xm = x - i; - xp = x + i; - qd_getPixel(tbuf2, x, y, c); - mul_v3_fl(c, f1); - qd_getPixel(tbuf2, xm, (ndg->angle ? yp : y), tc); - madd_v3_v3fl(c, tc, f2); - qd_getPixel(tbuf2, xp, (ndg->angle ? ym : y), tc); - madd_v3_v3fl(c, tc, f2); - qd_setPixel(tbuf2, x, y, c); - } - } - } - - for (y=0; y<tbuf1->y; ++y) - for (x=0; x<tbuf1->x; ++x) { - unsigned int p = (x + y*tbuf1->x)*tbuf1->type; - tbuf1->rect[p] += tbuf2->rect[p]; - tbuf1->rect[p+1] += tbuf2->rect[p+1]; - tbuf1->rect[p+2] += tbuf2->rect[p+2]; - } - - for (y=0; y<dst->y; ++y) { - const float m = 0.5f + 0.5f*ndg->mix; - for (x=0; x<dst->x; ++x) { - unsigned int p = (x + y*dst->x)*dst->type; - qd_getPixelLerp(tbuf1, x*isc, y*isc, tc); - dst->rect[p] = src->rect[p] + m*(tc[0] - src->rect[p]); - dst->rect[p+1] = src->rect[p+1] + m*(tc[1] - src->rect[p+1]); - dst->rect[p+2] = src->rect[p+2] + m*(tc[2] - src->rect[p+2]); - } - } - - free_compbuf(tbuf1); - free_compbuf(tbuf2); - free_compbuf(tsrc); -} - -//-------------------------------------------------------------------------------------------- -// streak filter - -static void streaks(NodeGlare* ndg, CompBuf* dst, CompBuf* src) -{ - CompBuf *bsrc, *tsrc, *tdst, *sbuf; - int x, y, n; - unsigned int nump=0; - fRGB c1, c2, c3, c4; - float a, ang = DEG2RADF(360.0f)/(float)ndg->angle; - - bsrc = BTP(src, ndg->threshold, 1 << ndg->quality); - tsrc = dupalloc_compbuf(bsrc); // sample from buffer - tdst = alloc_compbuf(tsrc->x, tsrc->y, tsrc->type, 1); // sample to buffer - sbuf = alloc_compbuf(tsrc->x, tsrc->y, tsrc->type, 1); // streak sum buffer - - - for (a=0.f; a<DEG2RADF(360.0f); a+=ang) { - const float an = a + ndg->angle_ofs; - const float vx = cos((double)an), vy = sin((double)an); - for (n=0; n<ndg->iter; ++n) { - const float p4 = pow(4.0, (double)n); - const float vxp = vx*p4, vyp = vy*p4; - const float wt = pow((double)ndg->fade, (double)p4); - const float cmo = 1.f - (float)pow((double)ndg->colmod, (double)n+1); // colormodulation amount relative to current pass - float* tdstcol = tdst->rect; - for (y=0; y<tsrc->y; ++y) { - for (x=0; x<tsrc->x; ++x, tdstcol+=4) { - // first pass no offset, always same for every pass, exact copy, - // otherwise results in uneven brightness, only need once - if (n==0) qd_getPixel(tsrc, x, y, c1); else c1[0]=c1[1]=c1[2]=0; - qd_getPixelLerp(tsrc, x + vxp, y + vyp, c2); - qd_getPixelLerp(tsrc, x + vxp*2.f, y + vyp*2.f, c3); - qd_getPixelLerp(tsrc, x + vxp*3.f, y + vyp*3.f, c4); - // modulate color to look vaguely similar to a color spectrum - fRGB_rgbmult(c2, 1.f, cmo, cmo); - fRGB_rgbmult(c3, cmo, cmo, 1.f); - fRGB_rgbmult(c4, cmo, 1.f, cmo); - tdstcol[0] = 0.5f*(tdstcol[0] + c1[0] + wt*(c2[0] + wt*(c3[0] + wt*c4[0]))); - tdstcol[1] = 0.5f*(tdstcol[1] + c1[1] + wt*(c2[1] + wt*(c3[1] + wt*c4[1]))); - tdstcol[2] = 0.5f*(tdstcol[2] + c1[2] + wt*(c2[2] + wt*(c3[2] + wt*c4[2]))); - } - } - memcpy(tsrc->rect, tdst->rect, sizeof(float)*tdst->x*tdst->y*tdst->type); - } - - addImage(sbuf, tsrc, 1.f/(float)(6 - ndg->iter)); - memset(tdst->rect, 0, tdst->x*tdst->y*tdst->type*sizeof(float)); - memcpy(tsrc->rect, bsrc->rect, bsrc->x*bsrc->y*bsrc->type*sizeof(float)); - nump++; - } - - mixImages(dst, sbuf, 0.5f + 0.5f*ndg->mix); - - free_compbuf(tsrc); - free_compbuf(tdst); - free_compbuf(sbuf); - free_compbuf(bsrc); -} - - -//-------------------------------------------------------------------------------------------- -// Ghosts (lensflare) - -static float smoothMask(float x, float y) -{ - float t; - x = 2.f*x - 1.f, y = 2.f*y - 1.f; - if ((t = 1.f - sqrtf(x*x + y*y)) <= 0.f) return 0.f; - return t; -} - -static void ghosts(NodeGlare* ndg, CompBuf* dst, CompBuf* src) -{ - // colormodulation and scale factors (cm & scalef) for 16 passes max: 64 - int x, y, n, p, np; - fRGB c, tc, cm[64]; - float sc, isc, u, v, sm, s, t, ofs, scalef[64]; - CompBuf *tbuf1, *tbuf2, *gbuf; - const float cmo = 1.f - ndg->colmod; - const int qt = 1 << ndg->quality; - const float s1 = 4.f/(float)qt, s2 = 2.f*s1; - - gbuf = BTP(src, ndg->threshold, qt); - tbuf1 = dupalloc_compbuf(gbuf); - IIR_gauss(tbuf1, s1, 0, 3); - IIR_gauss(tbuf1, s1, 1, 3); - IIR_gauss(tbuf1, s1, 2, 3); - tbuf2 = dupalloc_compbuf(tbuf1); - IIR_gauss(tbuf2, s2, 0, 3); - IIR_gauss(tbuf2, s2, 1, 3); - IIR_gauss(tbuf2, s2, 2, 3); - - if (ndg->iter & 1) ofs = 0.5f; else ofs = 0.f; - for (x=0; x<(ndg->iter*4); x++) { - y = x & 3; - cm[x][0] = cm[x][1] = cm[x][2] = 1; - if (y==1) fRGB_rgbmult(cm[x], 1.f, cmo, cmo); - if (y==2) fRGB_rgbmult(cm[x], cmo, cmo, 1.f); - if (y==3) fRGB_rgbmult(cm[x], cmo, 1.f, cmo); - scalef[x] = 2.1f*(1.f-(x+ofs)/(float)(ndg->iter*4)); - if (x & 1) scalef[x] = -0.99f/scalef[x]; - } - - sc = 2.13; - isc = -0.97; - for (y=0; y<gbuf->y; y++) { - v = (float)(y+0.5f) / (float)gbuf->y; - for (x=0; x<gbuf->x; x++) { - u = (float)(x+0.5f) / (float)gbuf->x; - s = (u-0.5f)*sc + 0.5f, t = (v-0.5f)*sc + 0.5f; - qd_getPixelLerp(tbuf1, s*gbuf->x, t*gbuf->y, c); - sm = smoothMask(s, t); - mul_v3_fl(c, sm); - s = (u-0.5f)*isc + 0.5f, t = (v-0.5f)*isc + 0.5f; - qd_getPixelLerp(tbuf2, s*gbuf->x - 0.5f, t*gbuf->y - 0.5f, tc); - sm = smoothMask(s, t); - madd_v3_v3fl(c, tc, sm); - qd_setPixel(gbuf, x, y, c); - } - } - - memset(tbuf1->rect, 0, tbuf1->x*tbuf1->y*tbuf1->type*sizeof(float)); - for (n=1; n<ndg->iter; n++) { - for (y=0; y<gbuf->y; y++) { - v = (float)(y+0.5f) / (float)gbuf->y; - for (x=0; x<gbuf->x; x++) { - u = (float)(x+0.5f) / (float)gbuf->x; - tc[0] = tc[1] = tc[2] = 0.f; - for (p=0;p<4;p++) { - np = (n<<2) + p; - s = (u-0.5f)*scalef[np] + 0.5f; - t = (v-0.5f)*scalef[np] + 0.5f; - qd_getPixelLerp(gbuf, s*gbuf->x - 0.5f, t*gbuf->y - 0.5f, c); - mul_v3_v3(c, cm[np]); - sm = smoothMask(s, t)*0.25f; - madd_v3_v3fl(tc, c, sm); - } - p = (x + y*tbuf1->x)*tbuf1->type; - tbuf1->rect[p] += tc[0]; - tbuf1->rect[p+1] += tc[1]; - tbuf1->rect[p+2] += tc[2]; - } - } - memcpy(gbuf->rect, tbuf1->rect, tbuf1->x*tbuf1->y*tbuf1->type*sizeof(float)); - } - - free_compbuf(tbuf1); - free_compbuf(tbuf2); - - mixImages(dst, gbuf, 0.5f + 0.5f*ndg->mix); - free_compbuf(gbuf); -} - -//-------------------------------------------------------------------------------------------- -// Fog glow (convolution with kernel of exponential falloff) - -static void fglow(NodeGlare* ndg, CompBuf* dst, CompBuf* src) -{ - int x, y; - float scale, u, v, r, w, d; - fRGB fcol; - CompBuf *tsrc, *ckrn; - unsigned int sz = 1 << ndg->size; - const float cs_r = 1.f, cs_g = 1.f, cs_b = 1.f; - - // temp. src image - tsrc = BTP(src, ndg->threshold, 1 << ndg->quality); - // make the convolution kernel - ckrn = alloc_compbuf(sz, sz, CB_RGBA, 1); - - scale = 0.25f*sqrtf(sz*sz); - - for (y=0; y<sz; ++y) { - v = 2.f*(y / (float)sz) - 1.f; - for (x=0; x<sz; ++x) { - u = 2.f*(x / (float)sz) - 1.f; - r = (u*u + v*v)*scale; - d = -sqrtf(sqrtf(sqrtf(r)))*9.f; - fcol[0] = expf(d*cs_r), fcol[1] = expf(d*cs_g), fcol[2] = expf(d*cs_b); - // linear window good enough here, visual result counts, not scientific analysis - //w = (1.f-fabs(u))*(1.f-fabs(v)); - // actually, Hanning window is ok, cos^2 for some reason is slower - w = (0.5f + 0.5f*cos((double)u*M_PI))*(0.5f + 0.5f*cos((double)v*M_PI)); - mul_v3_fl(fcol, w); - qd_setPixel(ckrn, x, y, fcol); - } - } - - convolve(tsrc, tsrc, ckrn); - free_compbuf(ckrn); - mixImages(dst, tsrc, 0.5f + 0.5f*ndg->mix); - free_compbuf(tsrc); -} - -//-------------------------------------------------------------------------------------------- - -static void node_composit_exec_glare(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out) -{ - CompBuf *new, *src, *img = in[0]->data; - NodeGlare* ndg = node->storage; - - if ((img == NULL) || (out[0]->hasoutput == 0)) return; - - if (img->type != CB_RGBA) { - new = typecheck_compbuf(img, CB_RGBA); - src = typecheck_compbuf(img, CB_RGBA); - } - else { - new = dupalloc_compbuf(img); - src = dupalloc_compbuf(img); - } - - { - int x, y; - for (y=0; y<new->y; ++y) { - fRGB* col = (fRGB*)&new->rect[y*new->x*new->type]; - for (x=0; x<new->x; ++x) { - col[x][0] = MAX2(col[x][0], 0.f); - col[x][1] = MAX2(col[x][1], 0.f); - col[x][2] = MAX2(col[x][2], 0.f); - } - } - } - - switch (ndg->type) { - case 0: - star4(ndg, new, src); - break; - case 1: - fglow(ndg, new, src); - break; - case 3: - ghosts(ndg, new, src); - break; - case 2: - default: - streaks(ndg, new, src); - break; - } - - free_compbuf(src); - out[0]->data = new; -} - -#endif /* WITH_COMPOSITOR_LEGACY */ - static void node_composit_init_glare(bNodeTree *UNUSED(ntree), bNode *node, bNodeTemplate *UNUSED(ntemp)) { NodeGlare *ndg = MEM_callocN(sizeof(NodeGlare), "node glare data"); @@ -502,9 +66,6 @@ void register_node_type_cmp_glare(bNodeTreeType *ttype) node_type_size(&ntype, 150, 120, 200); node_type_init(&ntype, node_composit_init_glare); node_type_storage(&ntype, "NodeGlare", node_free_standard_storage, node_copy_standard_storage); -#ifdef WITH_COMPOSITOR_LEGACY - node_type_exec(&ntype, node_composit_exec_glare); -#endif nodeRegisterType(ttype, &ntype); } diff --git a/source/blender/nodes/composite/nodes/node_composite_hueSatVal.c b/source/blender/nodes/composite/nodes/node_composite_hueSatVal.c index d52e3d01a32..be748199bc5 100644 --- a/source/blender/nodes/composite/nodes/node_composite_hueSatVal.c +++ b/source/blender/nodes/composite/nodes/node_composite_hueSatVal.c @@ -44,59 +44,6 @@ static bNodeSocketTemplate cmp_node_hue_sat_out[] = { { -1, 0, "" } }; -#ifdef WITH_COMPOSITOR_LEGACY - -static void do_hue_sat_fac(bNode *node, float *out, float *in, float *fac) -{ - NodeHueSat *nhs= node->storage; - - if (*fac!=0.0f && (nhs->hue!=0.5f || nhs->sat!=1.0f || nhs->val!=1.0f)) { - float col[3], hsv[3], mfac= 1.0f - *fac; - - rgb_to_hsv(in[0], in[1], in[2], hsv, hsv+1, hsv+2); - hsv[0]+= (nhs->hue - 0.5f); - if (hsv[0]>1.0f) hsv[0]-=1.0f; else if (hsv[0]<0.0f) hsv[0]+= 1.0f; - hsv[1]*= nhs->sat; - hsv[2]*= nhs->val; - hsv_to_rgb(hsv[0], hsv[1], hsv[2], col, col+1, col+2); - - out[0] = mfac*in[0] + *fac*col[0]; - out[1] = mfac*in[1] + *fac*col[1]; - out[2] = mfac*in[2] + *fac*col[2]; - out[3] = in[3]; - } - else { - copy_v4_v4(out, in); - } -} - -static void node_composit_exec_hue_sat(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out) -{ - /* stack order in: Fac, Image */ - /* stack order out: Image */ - if (out[0]->hasoutput==0) return; - - /* input no image? then only color operation */ - if (in[1]->data==NULL) { - do_hue_sat_fac(node, out[0]->vec, in[1]->vec, in[0]->vec); - } - else { - /* make output size of input image */ - CompBuf *cbuf= dupalloc_compbuf(in[1]->data); - CompBuf *stackbuf=typecheck_compbuf(cbuf, CB_RGBA); - - composit2_pixel_processor(node, stackbuf, stackbuf, in[1]->vec, in[0]->data, in[0]->vec, do_hue_sat_fac, CB_RGBA, CB_VAL); - - out[0]->data= stackbuf; - - /* get rid of intermediary cbuf if it's extra */ - if (stackbuf!=cbuf) - free_compbuf(cbuf); - } -} - -#endif /* WITH_COMPOSITOR_LEGACY */ - static void node_composit_init_hue_sat(bNodeTree *UNUSED(ntree), bNode *node, bNodeTemplate *UNUSED(ntemp)) { NodeHueSat *nhs= MEM_callocN(sizeof(NodeHueSat), "node hue sat"); @@ -115,9 +62,6 @@ void register_node_type_cmp_hue_sat(bNodeTreeType *ttype) node_type_size(&ntype, 150, 80, 250); node_type_init(&ntype, node_composit_init_hue_sat); node_type_storage(&ntype, "NodeHueSat", node_free_standard_storage, node_copy_standard_storage); -#ifdef WITH_COMPOSITOR_LEGACY - node_type_exec(&ntype, node_composit_exec_hue_sat); -#endif nodeRegisterType(ttype, &ntype); } diff --git a/source/blender/nodes/composite/nodes/node_composite_huecorrect.c b/source/blender/nodes/composite/nodes/node_composite_huecorrect.c index f751dbea8d2..45002b0aa0b 100644 --- a/source/blender/nodes/composite/nodes/node_composite_huecorrect.c +++ b/source/blender/nodes/composite/nodes/node_composite_huecorrect.c @@ -43,106 +43,6 @@ static bNodeSocketTemplate cmp_node_huecorrect_out[] = { { -1, 0, "" } }; -#ifdef WITH_COMPOSITOR_LEGACY - -static void do_huecorrect(bNode *node, float *out, float *in) -{ - float hsv[3], f; - - rgb_to_hsv(in[0], in[1], in[2], hsv, hsv+1, hsv+2); - - curvemapping_initialize(node->storage); - - /* adjust hue, scaling returned default 0.5 up to 1 */ - f = curvemapping_evaluateF(node->storage, 0, hsv[0]); - hsv[0] += f-0.5f; - - /* adjust saturation, scaling returned default 0.5 up to 1 */ - f = curvemapping_evaluateF(node->storage, 1, hsv[0]); - hsv[1] *= (f * 2.f); - - /* adjust value, scaling returned default 0.5 up to 1 */ - f = curvemapping_evaluateF(node->storage, 2, hsv[0]); - hsv[2] *= (f * 2.f); - - hsv[0] = hsv[0] - floorf(hsv[0]); /* mod 1.0 */ - CLAMP(hsv[1], 0.f, 1.f); - - /* convert back to rgb */ - hsv_to_rgb(hsv[0], hsv[1], hsv[2], out, out+1, out+2); - - out[3] = in[3]; -} - -static void do_huecorrect_fac(bNode *node, float *out, float *in, float *fac) -{ - float hsv[3], rgb[3], f; - const float mfac = 1.f-*fac; - - rgb_to_hsv(in[0], in[1], in[2], hsv, hsv+1, hsv+2); - - curvemapping_initialize(node->storage); - - /* adjust hue, scaling returned default 0.5 up to 1 */ - f = curvemapping_evaluateF(node->storage, 0, hsv[0]); - hsv[0] += f-0.5f; - - /* adjust saturation, scaling returned default 0.5 up to 1 */ - f = curvemapping_evaluateF(node->storage, 1, hsv[0]); - hsv[1] *= (f * 2.f); - - /* adjust value, scaling returned default 0.5 up to 1 */ - f = curvemapping_evaluateF(node->storage, 2, hsv[0]); - hsv[2] *= (f * 2.f); - - hsv[0] = hsv[0] - floorf(hsv[0]); /* mod 1.0 */ - CLAMP(hsv[1], 0.f, 1.f); - - /* convert back to rgb */ - hsv_to_rgb(hsv[0], hsv[1], hsv[2], rgb, rgb+1, rgb+2); - - out[0] = mfac*in[0] + *fac*rgb[0]; - out[1] = mfac*in[1] + *fac*rgb[1]; - out[2] = mfac*in[2] + *fac*rgb[2]; - out[3] = in[3]; -} - -static void node_composit_exec_huecorrect(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out) -{ - CompBuf *cbuf= in[1]->data; - CompBuf *stackbuf; - - /* stack order input: fac, image, black level, white level */ - /* stack order output: image */ - - if (out[0]->hasoutput==0) - return; - - if (in[0]->vec[0] == 0.f && in[0]->data == NULL) { - out[0]->data = pass_on_compbuf(cbuf); - return; - } - - /* input no image? then only color operation */ - if (in[1]->data==NULL) { - do_huecorrect_fac(node, out[0]->vec, in[1]->vec, in[0]->vec); - } - - if (cbuf) { - stackbuf= alloc_compbuf(cbuf->x, cbuf->y, CB_RGBA, 1); /* make output size of input image */ - - if ((in[0]->data==NULL) && (in[0]->vec[0] >= 1.f)) - composit1_pixel_processor(node, stackbuf, in[1]->data, in[1]->vec, do_huecorrect, CB_RGBA); - else - composit2_pixel_processor(node, stackbuf, in[1]->data, in[1]->vec, in[0]->data, in[0]->vec, do_huecorrect_fac, CB_RGBA, CB_VAL); - - out[0]->data= stackbuf; - } - -} - -#endif /* WITH_COMPOSITOR_LEGACY */ - static void node_composit_init_huecorrect(bNodeTree *UNUSED(ntree), bNode *node, bNodeTemplate *UNUSED(ntemp)) { CurveMapping *cumapping = node->storage= curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f); @@ -168,9 +68,6 @@ void register_node_type_cmp_huecorrect(bNodeTreeType *ttype) node_type_size(&ntype, 320, 140, 400); node_type_init(&ntype, node_composit_init_huecorrect); node_type_storage(&ntype, "CurveMapping", node_free_curves, node_copy_curves); -#ifdef WITH_COMPOSITOR_LEGACY - node_type_exec(&ntype, node_composit_exec_huecorrect); -#endif nodeRegisterType(ttype, &ntype); } diff --git a/source/blender/nodes/composite/nodes/node_composite_idMask.c b/source/blender/nodes/composite/nodes/node_composite_idMask.c index ef0c5021192..8aa08386ae9 100644 --- a/source/blender/nodes/composite/nodes/node_composite_idMask.c +++ b/source/blender/nodes/composite/nodes/node_composite_idMask.c @@ -44,72 +44,6 @@ static bNodeSocketTemplate cmp_node_idmask_out[] = { { -1, 0, "" } }; -#ifdef WITH_COMPOSITOR_LEGACY - -/* stackbuf should be zeroed */ -static void do_idmask(CompBuf *stackbuf, CompBuf *cbuf, float idnr) -{ - float *rect; - int x; - char *abuf= MEM_mapallocN(cbuf->x*cbuf->y, "anti ali buf"); - - rect= cbuf->rect; - for (x= cbuf->x*cbuf->y - 1; x>=0; x--) - if (rect[x]==idnr) - abuf[x] = 255; - - antialias_tagbuf(cbuf->x, cbuf->y, abuf); - - rect= stackbuf->rect; - for (x= cbuf->x*cbuf->y - 1; x>=0; x--) - if (abuf[x]>1) - rect[x] = (1.0f/255.0f)*(float)abuf[x]; - - MEM_freeN(abuf); -} - -/* full sample version */ -static void do_idmask_fsa(CompBuf *stackbuf, CompBuf *cbuf, float idnr) -{ - float *rect, *rs; - int x; - - rect= cbuf->rect; - rs= stackbuf->rect; - for (x= cbuf->x*cbuf->y - 1; x>=0; x--) - if (rect[x]==idnr) - rs[x] = 1.0f; - -} - - -static void node_composit_exec_idmask(void *data, bNode *node, bNodeStack **in, bNodeStack **out) -{ - RenderData *rd= data; - - if (out[0]->hasoutput==0) - return; - - if (in[0]->data) { - CompBuf *cbuf= in[0]->data; - CompBuf *stackbuf; - - if (cbuf->type!=CB_VAL) - return; - - stackbuf= alloc_compbuf(cbuf->x, cbuf->y, CB_VAL, 1); /* allocs */; - - if ((rd->scemode & R_FULL_SAMPLE) || node->custom2 == 0) - do_idmask_fsa(stackbuf, cbuf, (float)node->custom1); - else - do_idmask(stackbuf, cbuf, (float)node->custom1); - - out[0]->data= stackbuf; - } -} - -#endif /* WITH_COMPOSITOR_LEGACY */ - void register_node_type_cmp_idmask(bNodeTreeType *ttype) { static bNodeType ntype; @@ -117,9 +51,6 @@ void register_node_type_cmp_idmask(bNodeTreeType *ttype) node_type_base(ttype, &ntype, CMP_NODE_ID_MASK, "ID Mask", NODE_CLASS_CONVERTOR, NODE_OPTIONS); node_type_socket_templates(&ntype, cmp_node_idmask_in, cmp_node_idmask_out); node_type_size(&ntype, 140, 100, 320); -#ifdef WITH_COMPOSITOR_LEGACY - node_type_exec(&ntype, node_composit_exec_idmask); -#endif nodeRegisterType(ttype, &ntype); } diff --git a/source/blender/nodes/composite/nodes/node_composite_image.c b/source/blender/nodes/composite/nodes/node_composite_image.c index 7e44210928c..66a141b8b6e 100644 --- a/source/blender/nodes/composite/nodes/node_composite_image.c +++ b/source/blender/nodes/composite/nodes/node_composite_image.c @@ -29,7 +29,6 @@ * \ingroup cmpnodes */ - #include "node_composite_util.h" /* **************** IMAGE (and RenderResult, multilayer image) ******************** */ @@ -285,242 +284,6 @@ static void cmp_node_image_update(bNodeTree *ntree, bNode *node) cmp_node_image_verify_outputs(ntree, node); } -#ifdef WITH_COMPOSITOR_LEGACY - -/* float buffer from the image with matching color management */ -float *node_composit_get_float_buffer(RenderData *rd, ImBuf *ibuf, int *alloc) -{ - float *rect; - - *alloc= FALSE; - - /* OCIO_TODO: this is a part of legacy compositor system, don't bother with porting this code - * to new color management system since this code would likely be simply removed soon - */ - if (rd->color_mgt_flag & R_COLOR_MANAGEMENT) { - rect= ibuf->rect_float; - } - else { - rect= MEM_mapallocN(sizeof(float) * 4 * ibuf->x * ibuf->y, "node_composit_get_image"); - - IMB_buffer_float_from_float(rect, ibuf->rect_float, - 4, IB_PROFILE_SRGB, IB_PROFILE_LINEAR_RGB, TRUE, - ibuf->x, ibuf->y, ibuf->x, ibuf->x); - - *alloc= TRUE; - } - - return rect; -} - -/* note: this function is used for multilayer too, to ensure uniform - * handling with BKE_image_acquire_ibuf() */ -static CompBuf *node_composit_get_image(RenderData *rd, Image *ima, ImageUser *iuser) -{ - ImBuf *ibuf; - CompBuf *stackbuf; - int type; - - float *rect; - int alloc= FALSE; - - ibuf= BKE_image_acquire_ibuf(ima, iuser, NULL); - if (ibuf==NULL || (ibuf->rect==NULL && ibuf->rect_float==NULL)) { - return NULL; - } - - if (ibuf->rect_float == NULL) { - IMB_float_from_rect(ibuf); - } - - /* now we need a float buffer from the image with matching color management */ - /* XXX weak code, multilayer is excluded from this */ - if (ibuf->channels == 4 && ima->rr==NULL) { - rect= node_composit_get_float_buffer(rd, ibuf, &alloc); - } - else { - /* non-rgba passes can't use color profiles */ - rect= ibuf->rect_float; - } - /* done coercing into the correct color management */ - - - type= ibuf->channels; - - if (rd->scemode & R_COMP_CROP) { - stackbuf= get_cropped_compbuf(&rd->disprect, rect, ibuf->x, ibuf->y, type); - if (alloc) - MEM_freeN(rect); - } - else { - /* we put imbuf copy on stack, cbuf knows rect is from other ibuf when freed! */ - stackbuf= alloc_compbuf(ibuf->x, ibuf->y, type, FALSE); - stackbuf->rect= rect; - stackbuf->malloc= alloc; - } - - /* 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 0 - 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]; - } - } -#endif - - BKE_image_release_ibuf(ima, ibuf, NULL); - - return stackbuf; -} - -static CompBuf *node_composit_get_zimage(bNode *node, RenderData *rd) -{ - ImBuf *ibuf= BKE_image_acquire_ibuf((Image *)node->id, node->storage, NULL); - CompBuf *zbuf= NULL; - - if (ibuf && ibuf->zbuf_float) { - if (rd->scemode & R_COMP_CROP) { - zbuf= get_cropped_compbuf(&rd->disprect, ibuf->zbuf_float, ibuf->x, ibuf->y, CB_VAL); - } - else { - zbuf= alloc_compbuf(ibuf->x, ibuf->y, CB_VAL, 0); - zbuf->rect= ibuf->zbuf_float; - } - } - - BKE_image_release_ibuf((Image *)node->id, ibuf, NULL); - - return zbuf; -} - -/* check if layer is available, returns pass buffer */ -static CompBuf *compbuf_multilayer_get(RenderData *rd, RenderLayer *rl, Image *ima, ImageUser *iuser, int passindex) -{ - RenderPass *rpass = BLI_findlink(&rl->passes, passindex); - if (rpass) { - CompBuf *cbuf; - - iuser->pass = passindex; - BKE_image_multilayer_index(ima->rr, iuser); - cbuf = node_composit_get_image(rd, ima, iuser); - - return cbuf; - } - return NULL; -} - -static void node_composit_exec_image(void *data, bNode *node, bNodeStack **UNUSED(in), bNodeStack **out) -{ - /* image assigned to output */ - /* stack order input sockets: col, alpha */ - if (node->id) { - RenderData *rd= data; - Image *ima= (Image *)node->id; - ImageUser *iuser= (ImageUser *)node->storage; - ImBuf *ibuf = NULL; - - /* first set the right frame number in iuser */ - BKE_image_user_frame_calc(iuser, rd->cfra, 0); - - /* force a load, we assume iuser index will be set OK anyway */ - if (ima->type==IMA_TYPE_MULTILAYER) - ibuf = BKE_image_acquire_ibuf(ima, iuser, NULL); - - if (ima->type==IMA_TYPE_MULTILAYER && ima->rr) { - RenderLayer *rl= BLI_findlink(&ima->rr->layers, iuser->layer); - - if (rl) { - bNodeSocket *sock; - NodeImageLayer *sockdata; - int out_index; - CompBuf *combinedbuf= NULL, *firstbuf= NULL; - - for (sock=node->outputs.first, out_index=0; sock; sock=sock->next, ++out_index) { - sockdata = sock->storage; - if (out[out_index]->hasoutput) { - CompBuf *stackbuf = out[out_index]->data = compbuf_multilayer_get(rd, rl, ima, iuser, sockdata->pass_index); - if (stackbuf) { - /* preview policy: take first 'Combined' pass if available, - * otherwise just use the first layer. - */ - if (!firstbuf) { - firstbuf = stackbuf; - } - if (!combinedbuf && - (strcmp(sock->name, "Combined") == 0 || strcmp(sock->name, "Image") == 0)) - { - combinedbuf = stackbuf; - } - } - } - } - - /* preview */ - if (combinedbuf) - generate_preview(data, node, combinedbuf); - else if (firstbuf) - generate_preview(data, node, firstbuf); - } - } - else { - CompBuf *stackbuf = node_composit_get_image(rd, ima, iuser); - if (stackbuf) { - int num_outputs = BLI_countlist(&node->outputs); - - /*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); - - /* since stackbuf now has allocated memory, rather than just a pointer, - * mark it as allocated so it can be freed properly */ - 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 */ - if (num_outputs > 0) - out[0]->data= stackbuf; - - /* alpha output */ - if (num_outputs > 1 && out[1]->hasoutput) - out[1]->data= valbuf_from_rgbabuf(stackbuf, CHAN_A); - - /* Z output */ - if (num_outputs > 2 && out[2]->hasoutput) - out[2]->data= node_composit_get_zimage(node, rd); - - /* preview */ - generate_preview(data, node, stackbuf); - } - } - - BKE_image_release_ibuf(ima, ibuf, NULL); - } -} - -#endif /* WITH_COMPOSITOR_LEGACY */ - static void node_composit_init_image(bNodeTree *ntree, bNode *node, bNodeTemplate *UNUSED(ntemp)) { ImageUser *iuser= MEM_callocN(sizeof(ImageUser), "node image user"); @@ -565,9 +328,6 @@ void register_node_type_cmp_image(bNodeTreeType *ttype) node_type_init(&ntype, node_composit_init_image); node_type_storage(&ntype, "ImageUser", node_composit_free_image, node_composit_copy_image); node_type_update(&ntype, cmp_node_image_update, NULL); -#ifdef WITH_COMPOSITOR_LEGACY - node_type_exec(&ntype, node_composit_exec_image); -#endif nodeRegisterType(ttype, &ntype); } @@ -575,141 +335,6 @@ void register_node_type_cmp_image(bNodeTreeType *ttype) /* **************** RENDER RESULT ******************** */ -#ifdef WITH_COMPOSITOR_LEGACY - -static CompBuf *compbuf_from_pass(RenderData *rd, RenderLayer *rl, int rectx, int recty, int passcode) -{ - float *fp= RE_RenderLayerGetPass(rl, passcode); - if (fp) { - CompBuf *buf; - int buftype= CB_VEC3; - - if (ELEM4(passcode, SCE_PASS_Z, SCE_PASS_INDEXOB, SCE_PASS_MIST, SCE_PASS_INDEXMA)) - buftype= CB_VAL; - else if (passcode==SCE_PASS_VECTOR) - buftype= CB_VEC4; - else if (ELEM(passcode, SCE_PASS_COMBINED, SCE_PASS_RGBA)) - buftype= CB_RGBA; - - if (rd->scemode & R_COMP_CROP) - buf= get_cropped_compbuf(&rd->disprect, fp, rectx, recty, buftype); - else { - buf= alloc_compbuf(rectx, recty, buftype, 0); - buf->rect= fp; - } - return buf; - } - return NULL; -} - -static void node_composit_rlayers_out(RenderData *rd, RenderLayer *rl, bNodeStack **out, int rectx, int recty) -{ - if (out[RRES_OUT_Z]->hasoutput) - out[RRES_OUT_Z]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_Z); - if (out[RRES_OUT_VEC]->hasoutput) - out[RRES_OUT_VEC]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_VECTOR); - if (out[RRES_OUT_NORMAL]->hasoutput) - out[RRES_OUT_NORMAL]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_NORMAL); - if (out[RRES_OUT_UV]->hasoutput) - out[RRES_OUT_UV]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_UV); - - if (out[RRES_OUT_RGBA]->hasoutput) - out[RRES_OUT_RGBA]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_RGBA); - if (out[RRES_OUT_DIFF]->hasoutput) - out[RRES_OUT_DIFF]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_DIFFUSE); - if (out[RRES_OUT_SPEC]->hasoutput) - out[RRES_OUT_SPEC]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_SPEC); - if (out[RRES_OUT_SHADOW]->hasoutput) - out[RRES_OUT_SHADOW]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_SHADOW); - if (out[RRES_OUT_AO]->hasoutput) - out[RRES_OUT_AO]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_AO); - if (out[RRES_OUT_REFLECT]->hasoutput) - out[RRES_OUT_REFLECT]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_REFLECT); - if (out[RRES_OUT_REFRACT]->hasoutput) - out[RRES_OUT_REFRACT]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_REFRACT); - if (out[RRES_OUT_INDIRECT]->hasoutput) - out[RRES_OUT_INDIRECT]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_INDIRECT); - if (out[RRES_OUT_INDEXOB]->hasoutput) - out[RRES_OUT_INDEXOB]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_INDEXOB); - if (out[RRES_OUT_INDEXMA]->hasoutput) - out[RRES_OUT_INDEXMA]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_INDEXMA); - if (out[RRES_OUT_MIST]->hasoutput) - out[RRES_OUT_MIST]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_MIST); - if (out[RRES_OUT_EMIT]->hasoutput) - out[RRES_OUT_EMIT]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_EMIT); - if (out[RRES_OUT_ENV]->hasoutput) - out[RRES_OUT_ENV]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_ENVIRONMENT); - if (out[RRES_OUT_DIFF_DIRECT]->hasoutput) - out[RRES_OUT_DIFF_DIRECT]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_DIFFUSE_DIRECT); - if (out[RRES_OUT_DIFF_INDIRECT]->hasoutput) - out[RRES_OUT_DIFF_INDIRECT]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_DIFFUSE_INDIRECT); - if (out[RRES_OUT_DIFF_COLOR]->hasoutput) - out[RRES_OUT_DIFF_COLOR]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_DIFFUSE_COLOR); - if (out[RRES_OUT_GLOSSY_DIRECT]->hasoutput) - out[RRES_OUT_GLOSSY_DIRECT]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_GLOSSY_DIRECT); - if (out[RRES_OUT_GLOSSY_INDIRECT]->hasoutput) - out[RRES_OUT_GLOSSY_INDIRECT]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_GLOSSY_INDIRECT); - if (out[RRES_OUT_GLOSSY_COLOR]->hasoutput) - out[RRES_OUT_GLOSSY_COLOR]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_GLOSSY_COLOR); - if (out[RRES_OUT_TRANSM_DIRECT]->hasoutput) - out[RRES_OUT_TRANSM_DIRECT]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_TRANSM_DIRECT); - if (out[RRES_OUT_TRANSM_INDIRECT]->hasoutput) - out[RRES_OUT_TRANSM_INDIRECT]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_TRANSM_INDIRECT); - if (out[RRES_OUT_TRANSM_COLOR]->hasoutput) - out[RRES_OUT_TRANSM_COLOR]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_TRANSM_COLOR); -} - -static void node_composit_exec_rlayers(void *data, bNode *node, bNodeStack **UNUSED(in), bNodeStack **out) -{ - Scene *sce= (Scene *)node->id; - Render *re= (sce)? RE_GetRender(sce->id.name): NULL; - RenderData *rd= data; - RenderResult *rr= NULL; - - if (re) - rr= RE_AcquireResultRead(re); - - if (rr) { - SceneRenderLayer *srl= BLI_findlink(&sce->r.layers, node->custom1); - if (srl) { - RenderLayer *rl= RE_GetRenderLayer(rr, srl->name); - if (rl && rl->rectf) { - CompBuf *stackbuf; - - /* we put render rect on stack, cbuf knows rect is from other ibuf when freed! */ - if (rd->scemode & R_COMP_CROP) - stackbuf= get_cropped_compbuf(&rd->disprect, rl->rectf, rr->rectx, rr->recty, CB_RGBA); - else { - stackbuf= alloc_compbuf(rr->rectx, rr->recty, CB_RGBA, 0); - stackbuf->rect= rl->rectf; - } - if (stackbuf==NULL) { - printf("Error; Preview Panel in UV Window returns zero sized image\n"); - } - else { - stackbuf->xof= rr->xof; - stackbuf->yof= rr->yof; - - /* put on stack */ - out[RRES_OUT_IMAGE]->data= stackbuf; - - if (out[RRES_OUT_ALPHA]->hasoutput) - out[RRES_OUT_ALPHA]->data= valbuf_from_rgbabuf(stackbuf, CHAN_A); - - node_composit_rlayers_out(rd, rl, out, rr->rectx, rr->recty); - - generate_preview(data, node, stackbuf); - } - } - } - } - - if (re) - RE_ReleaseResult(re); -} - -#endif /* WITH_COMPOSITOR_LEGACY */ - void register_node_type_cmp_rlayers(bNodeTreeType *ttype) { static bNodeType ntype; @@ -717,9 +342,6 @@ void register_node_type_cmp_rlayers(bNodeTreeType *ttype) node_type_base(ttype, &ntype, CMP_NODE_R_LAYERS, "Render Layers", NODE_CLASS_INPUT, NODE_PREVIEW|NODE_OPTIONS); node_type_socket_templates(&ntype, NULL, cmp_node_rlayers_out); node_type_size(&ntype, 150, 100, 300); -#ifdef WITH_COMPOSITOR_LEGACY - node_type_exec(&ntype, node_composit_exec_rlayers); -#endif nodeRegisterType(ttype, &ntype); } diff --git a/source/blender/nodes/composite/nodes/node_composite_inpaint.c b/source/blender/nodes/composite/nodes/node_composite_inpaint.c index 25ecf428b4a..95e5834456c 100644 --- a/source/blender/nodes/composite/nodes/node_composite_inpaint.c +++ b/source/blender/nodes/composite/nodes/node_composite_inpaint.c @@ -44,15 +44,6 @@ static bNodeSocketTemplate cmp_node_inpaint_out[] = { { -1, 0, "" } }; -#ifdef WITH_COMPOSITOR_LEGACY - -static void node_composit_exec_inpaint(void *UNUSED(data), bNode *UNUSED(node), bNodeStack **UNUSED(in), bNodeStack **UNUSED(out)) -{ - /* pass */ -} - -#endif /* WITH_COMPOSITOR_LEGACY */ - void register_node_type_cmp_inpaint(bNodeTreeType *ttype) { static bNodeType ntype; @@ -60,9 +51,6 @@ void register_node_type_cmp_inpaint(bNodeTreeType *ttype) node_type_base(ttype, &ntype, CMP_NODE_INPAINT, "Inpaint", NODE_CLASS_OP_FILTER, NODE_OPTIONS); node_type_socket_templates(&ntype, cmp_node_inpaint_in, cmp_node_inpaint_out); node_type_size(&ntype, 130, 100, 320); -#ifdef WITH_COMPOSITOR_LEGACY - node_type_exec(&ntype, node_composit_exec_inpaint); -#endif nodeRegisterType(ttype, &ntype); } diff --git a/source/blender/nodes/composite/nodes/node_composite_invert.c b/source/blender/nodes/composite/nodes/node_composite_invert.c index 2db6e42f603..05bccf84d58 100644 --- a/source/blender/nodes/composite/nodes/node_composite_invert.c +++ b/source/blender/nodes/composite/nodes/node_composite_invert.c @@ -43,82 +43,6 @@ static bNodeSocketTemplate cmp_node_invert_out[] = { { -1, 0, "" } }; -#ifdef WITH_COMPOSITOR_LEGACY - -static void do_invert(bNode *node, float *out, float *in) -{ - if (node->custom1 & CMP_CHAN_RGB) { - out[0] = 1.0f - in[0]; - out[1] = 1.0f - in[1]; - out[2] = 1.0f - in[2]; - } - else { - copy_v3_v3(out, in); - } - - if (node->custom1 & CMP_CHAN_A) - out[3] = 1.0f - in[3]; - else - out[3] = in[3]; -} - -static void do_invert_fac(bNode *node, float *out, float *in, float *fac) -{ - float col[4], facm; - - do_invert(node, col, in); - - /* blend inverted result against original input with fac */ - facm = 1.0f - fac[0]; - - if (node->custom1 & CMP_CHAN_RGB) { - col[0] = fac[0]*col[0] + (facm*in[0]); - col[1] = fac[0]*col[1] + (facm*in[1]); - col[2] = fac[0]*col[2] + (facm*in[2]); - } - if (node->custom1 & CMP_CHAN_A) - col[3] = fac[0]*col[3] + (facm*in[3]); - - copy_v4_v4(out, col); -} - -static void node_composit_exec_invert(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out) -{ - /* stack order in: fac, Image, Image */ - /* stack order out: Image */ - float *fac= in[0]->vec; - - if (out[0]->hasoutput==0) return; - - /* input no image? then only color operation */ - if (in[1]->data==NULL && in[0]->data==NULL) { - do_invert_fac(node, out[0]->vec, in[1]->vec, fac); - } - else { - /* make output size of first available input image, or then size of fac */ - CompBuf *cbuf= in[1]->data?in[1]->data:in[0]->data; - - /* if neither RGB or A toggled on, pass through */ - if (node->custom1 != 0) { - CompBuf *stackbuf= alloc_compbuf(cbuf->x, cbuf->y, CB_RGBA, 1); /* allocs */ - - if (fac[0] < 1.0f || in[0]->data!=NULL) - composit2_pixel_processor(node, stackbuf, in[1]->data, in[1]->vec, in[0]->data, fac, do_invert_fac, CB_RGBA, CB_VAL); - else - composit1_pixel_processor(node, stackbuf, in[1]->data, in[1]->vec, do_invert, CB_RGBA); - out[0]->data= stackbuf; - return; - - } - else { - out[0]->data = pass_on_compbuf(cbuf); - return; - } - } -} - -#endif /* WITH_COMPOSITOR_LEGACY */ - static void node_composit_init_invert(bNodeTree *UNUSED(ntree), bNode *node, bNodeTemplate *UNUSED(ntemp)) { node->custom1 |= CMP_CHAN_RGB; @@ -133,9 +57,6 @@ void register_node_type_cmp_invert(bNodeTreeType *ttype) node_type_socket_templates(&ntype, cmp_node_invert_in, cmp_node_invert_out); node_type_size(&ntype, 120, 120, 140); node_type_init(&ntype, node_composit_init_invert); -#ifdef WITH_COMPOSITOR_LEGACY - node_type_exec(&ntype, node_composit_exec_invert); -#endif nodeRegisterType(ttype, &ntype); } diff --git a/source/blender/nodes/composite/nodes/node_composite_keying.c b/source/blender/nodes/composite/nodes/node_composite_keying.c index 6553df350ff..5e285095a4e 100644 --- a/source/blender/nodes/composite/nodes/node_composite_keying.c +++ b/source/blender/nodes/composite/nodes/node_composite_keying.c @@ -60,13 +60,6 @@ static bNodeSocketTemplate cmp_node_keying_out[] = { { -1, 0, "" } }; -#ifdef WITH_COMPOSITOR_LEGACY -static void node_composit_exec_keying(void *UNUSED(data), bNode *UNUSED(node), bNodeStack **UNUSED(in), bNodeStack **UNUSED(out)) -{ - /* pass */ -} -#endif /* WITH_COMPOSITOR_LEGACY */ - static void node_composit_init_keying(bNodeTree *UNUSED(ntree), bNode *node, bNodeTemplate *UNUSED(ntemp)) { NodeKeyingData *data; @@ -94,9 +87,6 @@ void register_node_type_cmp_keying(bNodeTreeType *ttype) node_type_size(&ntype, 140, 100, 320); node_type_init(&ntype, node_composit_init_keying); node_type_storage(&ntype, "NodeKeyingData", node_free_standard_storage, node_copy_standard_storage); -#ifdef WITH_COMPOSITOR_LEGACY - node_type_exec(&ntype, node_composit_exec_keying); -#endif nodeRegisterType(ttype, &ntype); } diff --git a/source/blender/nodes/composite/nodes/node_composite_keyingscreen.c b/source/blender/nodes/composite/nodes/node_composite_keyingscreen.c index 96e905827cb..5db7f8fc991 100644 --- a/source/blender/nodes/composite/nodes/node_composite_keyingscreen.c +++ b/source/blender/nodes/composite/nodes/node_composite_keyingscreen.c @@ -50,140 +50,6 @@ static bNodeSocketTemplate cmp_node_keyingscreen_out[] = { { -1, 0, "" } }; -#ifdef WITH_COMPOSITOR_LEGACY - -static void compute_gradient_screen(RenderData *rd, NodeKeyingScreenData *keyingscreen_data, MovieClip *clip, CompBuf *screenbuf) -{ - MovieClipUser user = {0}; - MovieTracking *tracking = &clip->tracking; - MovieTrackingTrack *track; - VoronoiTriangulationPoint *triangulated_points; - VoronoiSite *sites; - ImBuf *ibuf; - ListBase *tracksbase; - ListBase edges = {NULL, NULL}; - int sites_total, triangulated_points_total, triangles_total; - int (*triangles)[3]; - int i, x, y; - float *rect = screenbuf->rect; - - if (keyingscreen_data->tracking_object[0]) { - MovieTrackingObject *object = BKE_tracking_object_get_named(tracking, keyingscreen_data->tracking_object); - - if (!object) - return; - - tracksbase = BKE_tracking_object_get_tracks(tracking, object); - } - else - tracksbase = BKE_tracking_get_active_tracks(tracking); - - sites_total = BLI_countlist(tracksbase); - - if (!sites_total) - return; - - BKE_movieclip_user_set_frame(&user, rd->cfra); - ibuf = BKE_movieclip_get_ibuf(clip, &user); - - sites = MEM_callocN(sizeof(VoronoiSite) * sites_total, "keyingscreen voronoi sites"); - track = tracksbase->first; - i = 0; - while (track) { - VoronoiSite *site = &sites[i]; - MovieTrackingMarker *marker = BKE_tracking_marker_get(track, rd->cfra); - ImBuf *pattern_ibuf = BKE_tracking_get_pattern_imbuf(ibuf, track, marker, TRUE, FALSE); - int j; - - zero_v3(site->color); - - if (pattern_ibuf) { - for (j = 0; j < pattern_ibuf->x * pattern_ibuf->y; j++) { - if (pattern_ibuf->rect_float) { - add_v3_v3(site->color, &pattern_ibuf->rect_float[4 * j]); - } - else { - unsigned char *rrgb = (unsigned char *)pattern_ibuf->rect; - - site->color[0] += srgb_to_linearrgb((float)rrgb[4 * j + 0] / 255.0f); - site->color[1] += srgb_to_linearrgb((float)rrgb[4 * j + 1] / 255.0f); - site->color[2] += srgb_to_linearrgb((float)rrgb[4 * j + 2] / 255.0f); - } - } - - mul_v3_fl(site->color, 1.0f / (pattern_ibuf->x * pattern_ibuf->y)); - IMB_freeImBuf(pattern_ibuf); - } - - site->co[0] = marker->pos[0] * screenbuf->x; - site->co[1] = marker->pos[1] * screenbuf->y; - - track = track->next; - i++; - } - - IMB_freeImBuf(ibuf); - - BLI_voronoi_compute(sites, sites_total, screenbuf->x, screenbuf->y, &edges); - - BLI_voronoi_triangulate(sites, sites_total, &edges, screenbuf->x, screenbuf->y, - &triangulated_points, &triangulated_points_total, - &triangles, &triangles_total); - - for (y = 0; y < screenbuf->y; y++) { - for (x = 0; x < screenbuf->x; x++) { - int index = 4 * (y * screenbuf->x + x); - - rect[index + 0] = rect[index + 1] = rect[index + 2] = 0.0f; - rect[index + 3] = 1.0f; - - for (i = 0; i < triangles_total; i++) { - int *triangle = triangles[i]; - VoronoiTriangulationPoint *a = &triangulated_points[triangle[0]], - *b = &triangulated_points[triangle[1]], - *c = &triangulated_points[triangle[2]]; - float co[2] = {x, y}, w[3]; - - if (barycentric_coords_v2(a->co, b->co, c->co, co, w)) { - if (barycentric_inside_triangle_v2(w)) { - rect[index + 0] += a->color[0] * w[0] + b->color[0] * w[1] + c->color[0] * w[2]; - rect[index + 1] += a->color[1] * w[0] + b->color[1] * w[1] + c->color[1] * w[2]; - rect[index + 2] += a->color[2] * w[0] + b->color[2] * w[1] + c->color[2] * w[2]; - } - } - } - } - } - - MEM_freeN(triangulated_points); - MEM_freeN(triangles); - MEM_freeN(sites); - BLI_freelistN(&edges); -} - -static void node_composit_exec_keyingscreen(void *data, bNode *node, bNodeStack **UNUSED(in), bNodeStack **out) -{ - NodeKeyingScreenData *keyingscreen_data = node->storage; - RenderData *rd = data; - CompBuf *screenbuf = NULL; - - if (node->id) { - MovieClip *clip = (MovieClip *) node->id; - MovieClipUser user = {0}; - int width, height; - - BKE_movieclip_user_set_frame(&user, rd->cfra); - BKE_movieclip_get_size(clip, &user, &width, &height); - - screenbuf = alloc_compbuf(width, height, CB_RGBA, TRUE); - compute_gradient_screen(rd, keyingscreen_data, clip, screenbuf); - } - - out[0]->data = screenbuf; -} - -#endif /* WITH_COMPOSITOR_LEGACY */ - static void node_composit_init_keyingscreen(bNodeTree *UNUSED(ntree), bNode *node, bNodeTemplate *UNUSED(ntemp)) { NodeKeyingScreenData *data; @@ -202,9 +68,6 @@ void register_node_type_cmp_keyingscreen(bNodeTreeType *ttype) node_type_size(&ntype, 140, 100, 320); node_type_init(&ntype, node_composit_init_keyingscreen); node_type_storage(&ntype, "NodeKeyingScreenData", node_free_standard_storage, node_copy_standard_storage); -#ifdef WITH_COMPOSITOR_LEGACY - node_type_exec(&ntype, node_composit_exec_keyingscreen); -#endif nodeRegisterType(ttype, &ntype); } diff --git a/source/blender/nodes/composite/nodes/node_composite_lensdist.c b/source/blender/nodes/composite/nodes/node_composite_lensdist.c index 1ac8c457d45..e454022de3d 100644 --- a/source/blender/nodes/composite/nodes/node_composite_lensdist.c +++ b/source/blender/nodes/composite/nodes/node_composite_lensdist.c @@ -43,149 +43,6 @@ static bNodeSocketTemplate cmp_node_lensdist_out[] = { { -1, 0, "" } }; -#ifdef WITH_COMPOSITOR_LEGACY - -/* assumes *dst is type RGBA */ -static void lensDistort(CompBuf *dst, CompBuf *src, float kr, float kg, float kb, int jit, int proj, int fit) -{ - int x, y, z; - const float cx = 0.5f*(float)dst->x, cy = 0.5f*(float)dst->y; - - if (proj) { - // shift - CompBuf *tsrc = dupalloc_compbuf(src); - - for (z=0; z<tsrc->type; ++z) - IIR_gauss(tsrc, (kr+0.5f)*(kr+0.5f), z, 1); - kr *= 20.f; - - for (y=0; y<dst->y; y++) { - fRGB *colp = (fRGB*)&dst->rect[y*dst->x*dst->type]; - const float v = (y + 0.5f)/(float)dst->y; - - for (x=0; x<dst->x; x++) { - const float u = (x + 0.5f)/(float)dst->x; - - qd_getPixelLerpChan(tsrc, (u*dst->x + kr) - 0.5f, v*dst->y - 0.5f, 0, colp[x]); - if (tsrc->type == CB_VAL) - colp[x][1] = tsrc->rect[x + y*tsrc->x]; - else - colp[x][1] = tsrc->rect[(x + y*tsrc->x)*tsrc->type + 1]; - qd_getPixelLerpChan(tsrc, (u*dst->x - kr) - 0.5f, v*dst->y - 0.5f, 2, colp[x]+2); - - /* set alpha */ - colp[x][3] = 1.0f; - } - } - free_compbuf(tsrc); - } - else { - // Spherical - // Scale factor to make bottom/top & right/left sides fit in window after deform - // so in the case of pincushion (kn < 0), corners will be outside window. - // Now also optionally scales image such that black areas are not visible when distort factor is positive - // (makes distorted corners match window corners, but really only valid if mk<=0.5) - const float mk = max_fff(kr, kg, kb); - const float sc = (fit && (mk > 0.f)) ? (1.f/(1.f + 2.f*mk)) : (1.f/(1.f + mk)); - const float drg = 4.f*(kg - kr), dgb = 4.f*(kb - kg); - - kr *= 4.f, kg *= 4.f, kb *= 4.f; - - for (y=0; y<dst->y; y++) { - fRGB *colp = (fRGB*)&dst->rect[y*dst->x*dst->type]; - const float v = sc*((y + 0.5f) - cy)/cy; - - for (x=0; x<dst->x; x++) { - int dr = 0, dg = 0, db = 0; - float d, t, ln[6] = {0, 0, 0, 0, 0, 0}; - fRGB c1, tc = {0, 0, 0, 0}; - const float u = sc*((x + 0.5f) - cx)/cx; - const float uv_dot = u * u + v * v; - int sta = 0, mid = 0, end = 0; - - if ((t = 1.f - kr*uv_dot) >= 0.f) { - d = 1.f/(1.f + sqrtf(t)); - ln[0] = (u*d + 0.5f)*dst->x - 0.5f, ln[1] = (v*d + 0.5f)*dst->y - 0.5f; - sta = 1; - } - if ((t = 1.f - kg*uv_dot) >= 0.f) { - d = 1.f/(1.f + sqrtf(t)); - ln[2] = (u*d + 0.5f)*dst->x - 0.5f, ln[3] = (v*d + 0.5f)*dst->y - 0.5f; - mid = 1; - } - if ((t = 1.f - kb*uv_dot) >= 0.f) { - d = 1.f/(1.f + sqrtf(t)); - ln[4] = (u*d + 0.5f)*dst->x - 0.5f, ln[5] = (v*d + 0.5f)*dst->y - 0.5f; - end = 1; - } - - if (sta && mid && end) { - // RG - const int dx = ln[2] - ln[0], dy = ln[3] - ln[1]; - const float dsf = sqrtf(dx*dx + dy*dy) + 1.f; - const int ds = (int)(jit ? ((dsf < 4.f) ? 2.f : sqrtf(dsf)) : dsf); - const float sd = 1.f/(float)ds; - - for (z=0; z<ds; ++z) { - const float tz = ((float)z + (jit ? BLI_frand() : 0.5f))*sd; - t = 1.f - (kr + tz*drg)*uv_dot; - d = 1.f / (1.f + sqrtf(t)); - qd_getPixelLerp(src, (u*d + 0.5f)*dst->x - 0.5f, (v*d + 0.5f)*dst->y - 0.5f, c1); - if (src->type == CB_VAL) c1[1] = c1[2] = c1[0]; - tc[0] += (1.f-tz)*c1[0], tc[1] += tz*c1[1]; - dr++, dg++; - } - // GB - { - const int dx = ln[4] - ln[2], dy = ln[5] - ln[3]; - const float dsf = sqrtf(dx*dx + dy*dy) + 1.f; - const int ds = (int)(jit ? ((dsf < 4.f) ? 2.f : sqrtf(dsf)) : dsf); - const float sd = 1.f/(float)ds; - - for (z=0; z<ds; ++z) { - const float tz = ((float)z + (jit ? BLI_frand() : 0.5f))*sd; - t = 1.f - (kg + tz*dgb)*uv_dot; - d = 1.f / (1.f + sqrtf(t)); - qd_getPixelLerp(src, (u*d + 0.5f)*dst->x - 0.5f, (v*d + 0.5f)*dst->y - 0.5f, c1); - if (src->type == CB_VAL) c1[1] = c1[2] = c1[0]; - tc[1] += (1.f-tz)*c1[1], tc[2] += tz*c1[2]; - dg++, db++; - } - } - } - - if (dr) colp[x][0] = 2.f*tc[0] / (float)dr; - if (dg) colp[x][1] = 2.f*tc[1] / (float)dg; - if (db) colp[x][2] = 2.f*tc[2] / (float)db; - - /* set alpha */ - colp[x][3] = 1.0f; - } - } - } -} - - -static void node_composit_exec_lensdist(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out) -{ - CompBuf *new, *img = in[0]->data; - NodeLensDist *nld = node->storage; - const float k = MAX2(MIN2(in[1]->vec[0], 1.f), -0.999f); - // smaller dispersion range for somewhat more control - const float d = 0.25f*MAX2(MIN2(in[2]->vec[0], 1.f), 0.f); - const float kr = MAX2(MIN2((k+d), 1.f), -0.999f), kb = MAX2(MIN2((k-d), 1.f), -0.999f); - - if ((img==NULL) || (out[0]->hasoutput==0)) return; - - new = alloc_compbuf(img->x, img->y, CB_RGBA, 1); - - lensDistort(new, img, (nld->proj ? d : kr), k, kb, nld->jit, nld->proj, nld->fit); - - out[0]->data = new; -} - -#endif /* WITH_COMPOSITOR_LEGACY */ - static void node_composit_init_lensdist(bNodeTree *UNUSED(ntree), bNode *node, bNodeTemplate *UNUSED(ntemp)) { NodeLensDist *nld = MEM_callocN(sizeof(NodeLensDist), "node lensdist data"); @@ -203,9 +60,6 @@ void register_node_type_cmp_lensdist(bNodeTreeType *ttype) node_type_size(&ntype, 150, 120, 200); node_type_init(&ntype, node_composit_init_lensdist); node_type_storage(&ntype, "NodeLensDist", node_free_standard_storage, node_copy_standard_storage); -#ifdef WITH_COMPOSITOR_LEGACY - node_type_exec(&ntype, node_composit_exec_lensdist); -#endif nodeRegisterType(ttype, &ntype); } diff --git a/source/blender/nodes/composite/nodes/node_composite_levels.c b/source/blender/nodes/composite/nodes/node_composite_levels.c index 57d94d6cb4d..5f9797d9123 100644 --- a/source/blender/nodes/composite/nodes/node_composite_levels.c +++ b/source/blender/nodes/composite/nodes/node_composite_levels.c @@ -45,274 +45,6 @@ static bNodeSocketTemplate cmp_node_view_levels_out[] = { {-1, 0, ""} }; -#ifdef WITH_COMPOSITOR_LEGACY - -static void fill_bins(bNode *node, CompBuf* in, int* bins) -{ - float value[4]; - int ivalue=0; - int x, y; - - /*fill bins */ - for (y=0; y<in->y; y++) { - for (x=0; x<in->x; x++) { - - /* get the pixel */ - qd_getPixel(in, x, y, value); - - if (value[3] > 0.0f) { /* don't count transparent pixels */ - switch (node->custom1) { - case 1: { /* all colors */ - value[0] = rgb_to_bw(value); - value[0]=value[0]*255; /* scale to 0-255 range */ - ivalue=(int)value[0]; - break; - } - case 2: { /* red channel */ - value[0]=value[0]*255; /* scale to 0-255 range */ - ivalue=(int)value[0]; - break; - } - case 3: { /* green channel */ - value[1]=value[1]*255; /* scale to 0-255 range */ - ivalue=(int)value[1]; - break; - } - case 4: /*blue channel */ - { - value[2]=value[2]*255; /* scale to 0-255 range */ - ivalue=(int)value[2]; - break; - } - case 5: /* luminence */ - { - rgb_to_yuv(value[0], value[1], value[2], &value[0], &value[1], &value[2]); - value[0]=value[0]*255; /* scale to 0-255 range */ - ivalue=(int)value[0]; - break; - } - } /*end switch */ - - /*clip*/ - if (ivalue<0) ivalue=0; - if (ivalue>255) ivalue=255; - - /*put in the correct bin*/ - bins[ivalue]+=1; - } /*end if alpha */ - } - } -} - -static float brightness_mean(bNode *node, CompBuf* in) -{ - float sum=0.0; - int numPixels=0.0; - int x, y; - float value[4]; - - for (x=0; x< in->x; x++) { - for (y=0; y < in->y; y++) { - - /* get the pixel */ - qd_getPixel(in, x, y, value); - - if (value[3] > 0.0f) { /* don't count transparent pixels */ - numPixels++; - switch (node->custom1) { - case 1: - { - value[0] = rgb_to_bw(value); - sum+=value[0]; - break; - } - case 2: - { - sum+=value[0]; - break; - } - case 3: - { - sum+=value[1]; - break; - } - case 4: - { - sum+=value[2]; - break; - } - case 5: - { - rgb_to_yuv(value[0], value[1], value[2], &value[0], &value[1], &value[2]); - sum+=value[0]; - break; - } - } - } - } - } - - return sum/numPixels; -} - -static float brightness_standard_deviation(bNode *node, CompBuf* in, float mean) -{ - float sum=0.0; - int numPixels=0.0; - int x, y; - float value[4]; - - for (x=0; x< in->x; x++) { - for (y=0; y < in->y; y++) { - - /* get the pixel */ - qd_getPixel(in, x, y, value); - - if (value[3] > 0.0f) { /* don't count transparent pixels */ - numPixels++; - switch (node->custom1) { - case 1: - { - value[0] = rgb_to_bw(value); - sum+=(value[0]-mean)*(value[0]-mean); - break; - } - case 2: - { - sum+=value[0]; - sum+=(value[0]-mean)*(value[0]-mean); - break; - } - case 3: - { - sum+=value[1]; - sum+=(value[1]-mean)*(value[1]-mean); - break; - } - case 4: - { - sum+=value[2]; - sum+=(value[2]-mean)*(value[2]-mean); - break; - } - case 5: - { - rgb_to_yuv(value[0], value[1], value[2], &value[0], &value[1], &value[2]); - sum+=(value[0]-mean)*(value[0]-mean); - break; - } - } - } - } - } - - - return sqrt(sum/(float)(numPixels-1)); -} - -static void draw_histogram(bNode *node, CompBuf *out, int* bins) -{ - int x, y; - float color[4]; - float value; - int max; - - /* find max value */ - max=0; - for (x=0; x<256; x++) { - if (bins[x]>max) max=bins[x]; - } - - /*draw histogram in buffer */ - for (x=0; x<out->x; x++) { - for (y=0;y<out->y; y++) { - - /* get normalized value (0..255) */ - value=((float)bins[x]/(float)max)*255.0f; - - if (y < (int)value) { /*if the y value is below the height of the bar for this line then draw with the color */ - switch (node->custom1) { - case 1: { /* draw in black */ - color[0]=0.0; color[1]=0.0; color[2]=0.0; color[3]=1.0; - break; - } - case 2: { /* draw in red */ - color[0]=1.0; color[1]=0.0; color[2]=0.0; color[3]=1.0; - break; - } - case 3: { /* draw in green */ - color[0]=0.0; color[1]=1.0; color[2]=0.0; color[3]=1.0; - break; - } - case 4: { /* draw in blue */ - color[0]=0.0; color[1]=0.0; color[2]=1.0; color[3]=1.0; - break; - } - case 5: { /* draw in white */ - color[0]=1.0; color[1]=1.0; color[2]=1.0; color[3]=1.0; - break; - } - } - } - else { - color[0]=0.8; color[1]=0.8; color[2]=0.8; color[3]=1.0; - } - - /* set the color */ - qd_setPixel(out, x, y, color); - } - } -} - -static void node_composit_exec_view_levels(void *data, bNode *node, bNodeStack **in, bNodeStack **out) -{ - CompBuf* cbuf; - CompBuf* histogram; - float mean, std_dev; - int bins[256]; - int x; - - if (in[0]->hasinput==0) return; - if (in[0]->data==NULL) return; - - histogram=alloc_compbuf(256, 256, CB_RGBA, 1); - cbuf=typecheck_compbuf(in[0]->data, CB_RGBA); - - /*initalize bins*/ - for (x=0; x<256; x++) { - bins[x]=0; - } - - /*fill bins */ - fill_bins(node, in[0]->data, bins); - - /* draw the histogram chart */ - draw_histogram(node, histogram, bins); - - /* calculate the average brightness and contrast */ - mean=brightness_mean(node, in[0]->data); - std_dev=brightness_standard_deviation(node, in[0]->data, mean); - - /* Printf debuging ;) */ -#if 0 - printf("Mean: %f\n", mean); - printf("Std Dev: %f\n", std_dev); -#endif - - if (out[0]->hasoutput) - out[0]->vec[0] = mean; - if (out[1]->hasoutput) - out[1]->vec[0] = std_dev; - - generate_preview(data, node, histogram); - - if (cbuf!=in[0]->data) - free_compbuf(cbuf); - free_compbuf(histogram); -} - -#endif /* WITH_COMPOSITOR_LEGACY */ - static void node_composit_init_view_levels(bNodeTree *UNUSED(ntree), bNode *node, bNodeTemplate *UNUSED(ntemp)) { node->custom1=1; /*All channels*/ @@ -327,9 +59,6 @@ void register_node_type_cmp_view_levels(bNodeTreeType *ttype) node_type_size(&ntype, 140, 100, 320); node_type_init(&ntype, node_composit_init_view_levels); node_type_storage(&ntype, "ImageUser", NULL, NULL); -#ifdef WITH_COMPOSITOR_LEGACY - node_type_exec(&ntype, node_composit_exec_view_levels); -#endif nodeRegisterType(ttype, &ntype); } diff --git a/source/blender/nodes/composite/nodes/node_composite_lummaMatte.c b/source/blender/nodes/composite/nodes/node_composite_lummaMatte.c index ed232933139..6e0c877fe1c 100644 --- a/source/blender/nodes/composite/nodes/node_composite_lummaMatte.c +++ b/source/blender/nodes/composite/nodes/node_composite_lummaMatte.c @@ -45,61 +45,6 @@ static bNodeSocketTemplate cmp_node_luma_matte_out[] = { {-1, 0, ""} }; -#ifdef WITH_COMPOSITOR_LEGACY - -static void do_luma_matte(bNode *node, float *out, float *in) -{ - NodeChroma *c=(NodeChroma *)node->storage; - float alpha; - - /* test range*/ - if (in[0]>c->t1) { - alpha=1.0; - } - else if (in[0]<c->t2) { - alpha=0.0; - } - else {/*blend */ - alpha=(in[0]-c->t2)/(c->t1-c->t2); - } - - /* don't make something that was more transparent less transparent */ - if (alpha<in[3]) { - out[3]=alpha; - } - else { - out[3]=in[3]; - } - -} - -static void node_composit_exec_luma_matte(void *data, bNode *node, bNodeStack **in, bNodeStack **out) -{ - CompBuf *cbuf; - CompBuf *outbuf; - - if (in[0]->hasinput==0) return; - if (in[0]->data==NULL) return; - if (out[0]->hasoutput==0 && out[1]->hasoutput==0) return; - - cbuf=typecheck_compbuf(in[0]->data, CB_RGBA); - - outbuf=dupalloc_compbuf(cbuf); - - composit1_pixel_processor(node, outbuf, cbuf, in[1]->vec, do_rgba_to_yuva, CB_RGBA); - composit1_pixel_processor(node, outbuf, outbuf, in[1]->vec, do_luma_matte, CB_RGBA); - composit1_pixel_processor(node, outbuf, outbuf, in[1]->vec, do_yuva_to_rgba, CB_RGBA); - - generate_preview(data, node, outbuf); - out[0]->data=outbuf; - if (out[1]->hasoutput) - out[1]->data=valbuf_from_rgbabuf(outbuf, CHAN_A); - if (cbuf!=in[0]->data) - free_compbuf(cbuf); -} - -#endif /* WITH_COMPOSITOR_LEGACY */ - static void node_composit_init_luma_matte(bNodeTree *UNUSED(ntree), bNode *node, bNodeTemplate *UNUSED(ntemp)) { NodeChroma *c= MEM_callocN(sizeof(NodeChroma), "node chroma"); @@ -117,9 +62,6 @@ void register_node_type_cmp_luma_matte(bNodeTreeType *ttype) node_type_size(&ntype, 200, 80, 250); node_type_init(&ntype, node_composit_init_luma_matte); node_type_storage(&ntype, "NodeChroma", node_free_standard_storage, node_copy_standard_storage); -#ifdef WITH_COMPOSITOR_LEGACY - node_type_exec(&ntype, node_composit_exec_luma_matte); -#endif nodeRegisterType(ttype, &ntype); } diff --git a/source/blender/nodes/composite/nodes/node_composite_mapUV.c b/source/blender/nodes/composite/nodes/node_composite_mapUV.c index 40092a84367..8fd49cd206b 100644 --- a/source/blender/nodes/composite/nodes/node_composite_mapUV.c +++ b/source/blender/nodes/composite/nodes/node_composite_mapUV.c @@ -44,128 +44,6 @@ static bNodeSocketTemplate cmp_node_mapuv_out[] = { { -1, 0, "" } }; -#ifdef WITH_COMPOSITOR_LEGACY - -/* foreach UV, use these values to read in cbuf and write to stackbuf */ -/* stackbuf should be zeroed */ -static void do_mapuv(CompBuf *stackbuf, CompBuf *cbuf, CompBuf *uvbuf, float threshold) -{ - ImBuf *ibuf; - float *out= stackbuf->rect, *uv, *uvnext, *uvprev; - float dx, dy, alpha; - int x, y, sx, sy, row= 3*stackbuf->x; - - /* ibuf needed for sampling */ - ibuf= IMB_allocImBuf(cbuf->x, cbuf->y, 32, 0); - ibuf->rect_float= cbuf->rect; - - /* vars for efficient looping */ - uv= uvbuf->rect; - uvnext= uv+row; - uvprev= uv-row; - sx= stackbuf->x; - sy= stackbuf->y; - - for (y=0; y<sy; y++) { - for (x=0; x<sx; x++, out+=4, uv+=3, uvnext+=3, uvprev+=3) { - if (x>0 && x<sx-1 && y>0 && y<sy-1) { - if (uv[2]!=0.0f) { - float uv_l, uv_r; - - /* adaptive sampling, red (U) channel */ - - /* prevent alpha zero UVs to be used */ - uv_l= uv[-1]!=0.0f? fabsf(uv[0]-uv[-3]) : 0.0f; - uv_r= uv[ 5]!=0.0f? fabsf(uv[0]-uv[ 3]) : 0.0f; - - //dx= 0.5f*(fabs(uv[0]-uv[-3]) + fabs(uv[0]-uv[3])); - dx= 0.5f*(uv_l + uv_r); - - uv_l= uvprev[-1]!=0.0f? fabsf(uv[0]-uvprev[-3]) : 0.0f; - uv_r= uvnext[-1]!=0.0f? fabsf(uv[0]-uvnext[-3]) : 0.0f; - - //dx+= 0.25f*(fabs(uv[0]-uvprev[-3]) + fabs(uv[0]-uvnext[-3])); - dx+= 0.25f*(uv_l + uv_r); - - uv_l= uvprev[ 5]!=0.0f? fabsf(uv[0]-uvprev[+3]) : 0.0f; - uv_r= uvnext[ 5]!=0.0f? fabsf(uv[0]-uvnext[+3]) : 0.0f; - - //dx+= 0.25f*(fabs(uv[0]-uvprev[+3]) + fabs(uv[0]-uvnext[+3])); - dx+= 0.25f*(uv_l + uv_r); - - /* adaptive sampling, green (V) channel */ - - uv_l= uv[-row+2]!=0.0f? fabsf(uv[1]-uv[-row+1]) : 0.0f; - uv_r= uv[ row+2]!=0.0f? fabsf(uv[1]-uv[ row+1]) : 0.0f; - - //dy= 0.5f*(fabs(uv[1]-uv[-row+1]) + fabs(uv[1]-uv[row+1])); - dy= 0.5f*(uv_l + uv_r); - - uv_l= uvprev[-1]!=0.0f? fabsf(uv[1]-uvprev[+1-3]) : 0.0f; - uv_r= uvnext[-1]!=0.0f? fabsf(uv[1]-uvnext[+1-3]) : 0.0f; - - //dy+= 0.25f*(fabs(uv[1]-uvprev[+1-3]) + fabs(uv[1]-uvnext[+1-3])); - dy+= 0.25f*(uv_l + uv_r); - - uv_l= uvprev[ 5]!=0.0f? fabsf(uv[1]-uvprev[+1+3]) : 0.0f; - uv_r= uvnext[ 5]!=0.0f? fabsf(uv[1]-uvnext[+1+3]) : 0.0f; - - //dy+= 0.25f*(fabs(uv[1]-uvprev[+1+3]) + fabs(uv[1]-uvnext[+1+3])); - dy+= 0.25f*(uv_l + uv_r); - - /* UV to alpha threshold */ - alpha= 1.0f - threshold*(dx+dy); - if (alpha<0.0f) alpha= 0.0f; - else alpha*= uv[2]; - - /* should use mipmap */ - if (dx > 0.20f) dx= 0.20f; - if (dy > 0.20f) dy= 0.20f; - - ibuf_sample(ibuf, uv[0], uv[1], dx, dy, out); - /* premul */ - if (alpha<1.0f) { - out[0]*= alpha; - out[1]*= alpha; - out[2]*= alpha; - out[3]*= alpha; - } - } - } - } - } - - IMB_freeImBuf(ibuf); -} - - -static void node_composit_exec_mapuv(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out) -{ - if (out[0]->hasoutput==0) - return; - - if (in[0]->data && in[1]->data) { - CompBuf *cbuf= in[0]->data; - CompBuf *uvbuf= in[1]->data; - CompBuf *stackbuf; - - cbuf= typecheck_compbuf(cbuf, CB_RGBA); - uvbuf= typecheck_compbuf(uvbuf, CB_VEC3); - stackbuf= alloc_compbuf(uvbuf->x, uvbuf->y, CB_RGBA, 1); /* allocs */; - - do_mapuv(stackbuf, cbuf, uvbuf, 0.05f*(float)node->custom1); - - out[0]->data= stackbuf; - - if (cbuf!=in[0]->data) - free_compbuf(cbuf); - if (uvbuf!=in[1]->data) - free_compbuf(uvbuf); - } -} - -#endif /* WITH_COMPOSITOR_LEGACY */ - void register_node_type_cmp_mapuv(bNodeTreeType *ttype) { static bNodeType ntype; @@ -173,9 +51,6 @@ void register_node_type_cmp_mapuv(bNodeTreeType *ttype) node_type_base(ttype, &ntype, CMP_NODE_MAP_UV, "Map UV", NODE_CLASS_DISTORT, NODE_OPTIONS); node_type_socket_templates(&ntype, cmp_node_mapuv_in, cmp_node_mapuv_out); node_type_size(&ntype, 140, 100, 320); -#ifdef WITH_COMPOSITOR_LEGACY - node_type_exec(&ntype, node_composit_exec_mapuv); -#endif nodeRegisterType(ttype, &ntype); } diff --git a/source/blender/nodes/composite/nodes/node_composite_mapValue.c b/source/blender/nodes/composite/nodes/node_composite_mapValue.c index 677d5bd5013..62db0be5411 100644 --- a/source/blender/nodes/composite/nodes/node_composite_mapValue.c +++ b/source/blender/nodes/composite/nodes/node_composite_mapValue.c @@ -42,44 +42,6 @@ static bNodeSocketTemplate cmp_node_map_value_out[] = { { -1, 0, "" } }; -#ifdef WITH_COMPOSITOR_LEGACY - -static void do_map_value(bNode *node, float *out, float *src) -{ - TexMapping *texmap= node->storage; - - out[0] = (src[0] + texmap->loc[0])*texmap->size[0]; - if (texmap->flag & TEXMAP_CLIP_MIN) - if (out[0]<texmap->min[0]) - out[0] = texmap->min[0]; - if (texmap->flag & TEXMAP_CLIP_MAX) - if (out[0]>texmap->max[0]) - out[0] = texmap->max[0]; -} - -static void node_composit_exec_map_value(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out) -{ - /* stack order in: valbuf */ - /* stack order out: valbuf */ - if (out[0]->hasoutput==0) return; - - /* input no image? then only value operation */ - if (in[0]->data==NULL) { - do_map_value(node, out[0]->vec, in[0]->vec); - } - else { - /* make output size of input image */ - CompBuf *cbuf= in[0]->data; - CompBuf *stackbuf= alloc_compbuf(cbuf->x, cbuf->y, CB_VAL, 1); /* allocs */ - - composit1_pixel_processor(node, stackbuf, in[0]->data, in[0]->vec, do_map_value, CB_VAL); - - out[0]->data= stackbuf; - } -} - -#endif /* WITH_COMPOSITOR_LEGACY */ - static void node_composit_init_map_value(bNodeTree *UNUSED(ntree), bNode *node, bNodeTemplate *UNUSED(ntemp)) { node->storage= add_tex_mapping(); @@ -94,9 +56,6 @@ void register_node_type_cmp_map_value(bNodeTreeType *ttype) node_type_size(&ntype, 100, 60, 150); node_type_init(&ntype, node_composit_init_map_value); node_type_storage(&ntype, "TexMapping", node_free_standard_storage, node_copy_standard_storage); -#ifdef WITH_COMPOSITOR_LEGACY - node_type_exec(&ntype, node_composit_exec_map_value); -#endif nodeRegisterType(ttype, &ntype); } diff --git a/source/blender/nodes/composite/nodes/node_composite_mask.c b/source/blender/nodes/composite/nodes/node_composite_mask.c index 3463c1a8413..0bac68ab1ac 100644 --- a/source/blender/nodes/composite/nodes/node_composite_mask.c +++ b/source/blender/nodes/composite/nodes/node_composite_mask.c @@ -45,48 +45,6 @@ static bNodeSocketTemplate cmp_node_mask_out[] = { { -1, 0, "" } }; -#ifdef WITH_COMPOSITOR_LEGACY -static void node_composit_exec_mask(void *data, bNode *node, bNodeStack **UNUSED(in), bNodeStack **out) -{ - if (node->id) { - Mask *mask = (Mask *)node->id; - MaskRasterHandle *mr_handle; - CompBuf *stackbuf; - RenderData *rd = data; - float *res; - int sx, sy; - - if (!out[0]->hasoutput) { - /* the node's output socket is not connected to anything... - * do not execute any further, just exit the node immediately - */ - return; - } - - sx = (rd->size * rd->xsch) / 100; - sy = (rd->size * rd->ysch) / 100; - - /* allocate the output buffer */ - stackbuf = alloc_compbuf(sx, sy, CB_VAL, TRUE); - res = stackbuf->rect; - - /* mask raster begin */ - mr_handle = BKE_maskrasterize_handle_new(); - BKE_maskrasterize_handle_init(mr_handle, mask, - sx, sy, - TRUE, - (node->custom1 & CMP_NODEFLAG_MASK_AA) != 0, - (node->custom1 & CMP_NODEFLAG_MASK_NO_FEATHER) == 0); - BKE_maskrasterize_buffer(mr_handle, sx, sy, res); - BKE_maskrasterize_handle_free(mr_handle); - /* mask raster end */ - - /* pass on output and free */ - out[0]->data = stackbuf; - } -} -#endif /* WITH_COMPOSITOR_LEGACY */ - static void node_composit_init_mask(bNodeTree *UNUSED(ntree), bNode *node, bNodeTemplate *UNUSED(ntemp)) { NodeMask *data = MEM_callocN(sizeof(NodeMask), STRINGIFY(NodeMask)); @@ -105,9 +63,6 @@ void register_node_type_cmp_mask(bNodeTreeType *ttype) node_type_socket_templates(&ntype, NULL, cmp_node_mask_out); node_type_size(&ntype, 140, 100, 320); node_type_init(&ntype, node_composit_init_mask); -#ifdef WITH_COMPOSITOR_LEGACY - node_type_exec(&ntype, node_composit_exec_mask); -#endif node_type_storage(&ntype, "NodeMask", node_free_standard_storage, node_copy_standard_storage); diff --git a/source/blender/nodes/composite/nodes/node_composite_math.c b/source/blender/nodes/composite/nodes/node_composite_math.c index 5bc67adf5fb..5bf555cd605 100644 --- a/source/blender/nodes/composite/nodes/node_composite_math.c +++ b/source/blender/nodes/composite/nodes/node_composite_math.c @@ -44,161 +44,6 @@ static bNodeSocketTemplate cmp_node_math_out[] = { { -1, 0, "" } }; -#ifdef WITH_COMPOSITOR_LEGACY - -static void do_math(bNode *node, float *out, float *in, float *in2) -{ - switch (node->custom1) { - case 0: /* Add */ - out[0] = in[0] + in2[0]; - break; - case 1: /* Subtract */ - out[0] = in[0] - in2[0]; - break; - case 2: /* Multiply */ - out[0] = in[0] * in2[0]; - break; - case 3: /* Divide */ - { - if (in2[0]==0) /* We don't want to divide by zero. */ - out[0] = 0.0; - else - out[0] = in[0] / in2[0]; - } - break; - case 4: /* Sine */ - out[0] = sin(in[0]); - break; - case 5: /* Cosine */ - out[0] = cos(in[0]); - break; - case 6: /* Tangent */ - out[0] = tan(in[0]); - break; - case 7: /* Arc-Sine */ - { - /* Can't do the impossible... */ - if (in[0] <= 1 && in[0] >= -1 ) - out[0] = asin(in[0]); - else - out[0] = 0.0; - } - break; - case 8: /* Arc-Cosine */ - { - /* Can't do the impossible... */ - if ( in[0] <= 1 && in[0] >= -1 ) - out[0] = acos(in[0]); - else - out[0] = 0.0; - } - break; - case 9: /* Arc-Tangent */ - out[0] = atan(in[0]); - break; - case 10: /* Power */ - { - /* Only raise negative numbers by full integers */ - if ( in[0] >= 0 ) { - out[0] = pow(in[0], in2[0]); - } - else { - float y_mod_1 = fabsf(fmodf(in2[0], 1.0f)); - - /* if input value is not nearly an integer, fall back to zero, nicer than straight rounding */ - if (y_mod_1 > 0.999f || y_mod_1 < 0.001f) { - out[0] = powf(in[0], floorf(in2[0] + 0.5f)); - } - else { - out[0] = 0.0f; - } - } - } - break; - case 11: /* Logarithm */ - { - /* Don't want any imaginary numbers... */ - if ( in[0] > 0 && in2[0] > 0 ) - out[0] = log(in[0]) / log(in2[0]); - else - out[0] = 0.0; - } - break; - case 12: /* Minimum */ - { - if ( in[0] < in2[0] ) - out[0] = in[0]; - else - out[0] = in2[0]; - } - break; - case 13: /* Maximum */ - { - if ( in[0] > in2[0] ) - out[0] = in[0]; - else - out[0] = in2[0]; - } - break; - case 14: /* Round */ - { - /* round by the second value */ - if ( in2[0] != 0.0f ) - out[0] = floorf(in[0] / in2[0] + 0.5f) * in2[0]; - else - out[0] = floorf(in[0] + 0.5f); - } - break; - case 15: /* Less Than */ - { - if ( in[0] < in2[0] ) - out[0] = 1.0f; - else - out[0] = 0.0f; - } - break; - case 16: /* Greater Than */ - { - if ( in[0] > in2[0] ) - out[0] = 1.0f; - else - out[0] = 0.0f; - } - break; - } -} - -static void node_composit_exec_math(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out) -{ - CompBuf *cbuf=in[0]->data; - CompBuf *cbuf2=in[1]->data; - CompBuf *stackbuf; - - /* check for inputs and outputs for early out*/ - if (out[0]->hasoutput==0) return; - - /* no image-color operation */ - if (in[0]->data==NULL && in[1]->data==NULL) { - do_math(node, out[0]->vec, in[0]->vec, in[1]->vec); - return; - } - - /* create output based on first input */ - if (cbuf) { - stackbuf=alloc_compbuf(cbuf->x, cbuf->y, CB_VAL, 1); - } - /* and if it doesn't exist use the second input since we - * know that one of them must exist at this point*/ - else { - stackbuf=alloc_compbuf(cbuf2->x, cbuf2->y, CB_VAL, 1); - } - - /* operate in case there's valid size */ - composit2_pixel_processor(node, stackbuf, in[0]->data, in[0]->vec, in[1]->data, in[1]->vec, do_math, CB_VAL, CB_VAL); - out[0]->data= stackbuf; -} - -#endif /* WITH_COMPOSITOR_LEGACY */ void register_node_type_cmp_math(bNodeTreeType *ttype) { @@ -208,9 +53,6 @@ void register_node_type_cmp_math(bNodeTreeType *ttype) node_type_socket_templates(&ntype, cmp_node_math_in, cmp_node_math_out); node_type_size(&ntype, 120, 110, 160); node_type_label(&ntype, node_math_label); -#ifdef WITH_COMPOSITOR_LEGACY - node_type_exec(&ntype, node_composit_exec_math); -#endif nodeRegisterType(ttype, &ntype); } diff --git a/source/blender/nodes/composite/nodes/node_composite_mixrgb.c b/source/blender/nodes/composite/nodes/node_composite_mixrgb.c index 5d3ee480612..fed73e13c92 100644 --- a/source/blender/nodes/composite/nodes/node_composite_mixrgb.c +++ b/source/blender/nodes/composite/nodes/node_composite_mixrgb.c @@ -43,48 +43,6 @@ static bNodeSocketTemplate cmp_node_mix_rgb_out[] = { { -1, 0, "" } }; -#ifdef WITH_COMPOSITOR_LEGACY - -static void do_mix_rgb(bNode *node, float *out, float *in1, float *in2, float *fac) -{ - float col[3]; - - copy_v3_v3(col, in1); - if (node->custom2) - ramp_blend(node->custom1, col, in2[3]*fac[0], in2); - else - ramp_blend(node->custom1, col, fac[0], in2); - copy_v3_v3(out, col); - out[3] = in1[3]; -} - -static void node_composit_exec_mix_rgb(void *data, bNode *node, bNodeStack **in, bNodeStack **out) -{ - /* stack order in: fac, Image, Image */ - /* stack order out: Image */ - float *fac= in[0]->vec; - - if (out[0]->hasoutput==0) return; - - /* input no image? then only color operation */ - if (in[1]->data==NULL && in[2]->data==NULL) { - do_mix_rgb(node, out[0]->vec, in[1]->vec, in[2]->vec, fac); - } - else { - /* make output size of first available input image */ - CompBuf *cbuf= in[1]->data?in[1]->data:in[2]->data; - CompBuf *stackbuf= alloc_compbuf(cbuf->x, cbuf->y, CB_RGBA, 1); /* allocs */ - - composit3_pixel_processor(node, stackbuf, in[1]->data, in[1]->vec, in[2]->data, in[2]->vec, in[0]->data, fac, do_mix_rgb, CB_RGBA, CB_RGBA, CB_VAL); - - out[0]->data= stackbuf; - - generate_preview(data, node, out[0]->data); - } -} - -#endif /* WITH_COMPOSITOR_LEGACY */ - /* custom1 = mix type */ void register_node_type_cmp_mix_rgb(bNodeTreeType *ttype) { @@ -94,9 +52,6 @@ void register_node_type_cmp_mix_rgb(bNodeTreeType *ttype) node_type_socket_templates(&ntype, cmp_node_mix_rgb_in, cmp_node_mix_rgb_out); node_type_size(&ntype, 110, 60, 120); node_type_label(&ntype, node_blend_label); -#ifdef WITH_COMPOSITOR_LEGACY - node_type_exec(&ntype, node_composit_exec_mix_rgb); -#endif nodeRegisterType(ttype, &ntype); } diff --git a/source/blender/nodes/composite/nodes/node_composite_movieclip.c b/source/blender/nodes/composite/nodes/node_composite_movieclip.c index 370cff5e0d7..85745d2ff40 100644 --- a/source/blender/nodes/composite/nodes/node_composite_movieclip.c +++ b/source/blender/nodes/composite/nodes/node_composite_movieclip.c @@ -42,106 +42,6 @@ static bNodeSocketTemplate cmp_node_movieclip_out[] = { { -1, 0, "" } }; -#ifdef WITH_COMPOSITOR_LEGACY - -static CompBuf *node_composit_get_movieclip(RenderData *rd, MovieClip *clip, MovieClipUser *user) -{ - ImBuf *orig_ibuf, *ibuf; - CompBuf *stackbuf; - int type; - - float *rect; - int alloc = FALSE; - - orig_ibuf = BKE_movieclip_get_ibuf(clip, user); - - if (orig_ibuf == NULL || (orig_ibuf->rect == NULL && orig_ibuf->rect_float == NULL)) { - IMB_freeImBuf(orig_ibuf); - return NULL; - } - - ibuf = IMB_dupImBuf(orig_ibuf); - IMB_freeImBuf(orig_ibuf); - - if (ibuf->rect_float == NULL || (ibuf->userflags & IB_RECT_INVALID)) { - IMB_float_from_rect(ibuf); - ibuf->userflags &= ~IB_RECT_INVALID; - } - - /* now we need a float buffer from the image with matching color management */ - if (ibuf->channels == 4) { - rect = node_composit_get_float_buffer(rd, ibuf, &alloc); - } - else { - /* non-rgba passes can't use color profiles */ - rect = ibuf->rect_float; - } - /* done coercing into the correct color management */ - - if (!alloc) { - rect = MEM_dupallocN(rect); - alloc = TRUE; - } - - type = ibuf->channels; - - if (rd->scemode & R_COMP_CROP) { - stackbuf = get_cropped_compbuf(&rd->disprect, rect, ibuf->x, ibuf->y, type); - if (alloc) - MEM_freeN(rect); - } - else { - /* we put imbuf copy on stack, cbuf knows rect is from other ibuf when freed! */ - stackbuf = alloc_compbuf(ibuf->x, ibuf->y, type, FALSE); - stackbuf->rect = rect; - stackbuf->malloc = alloc; - } - - IMB_freeImBuf(ibuf); - - return stackbuf; -} - -static void node_composit_exec_movieclip(void *data, bNode *node, bNodeStack **UNUSED(in), bNodeStack **out) -{ - if (node->id) { - RenderData *rd = data; - MovieClip *clip = (MovieClip *)node->id; - MovieClipUser *user = (MovieClipUser *)node->storage; - CompBuf *stackbuf = NULL; - - BKE_movieclip_user_set_frame(user, rd->cfra); - - stackbuf = node_composit_get_movieclip(rd, clip, user); - - if (stackbuf) { - MovieTrackingStabilization *stab = &clip->tracking.stabilization; - - /* put image on stack */ - out[0]->data = stackbuf; - - if (stab->flag & TRACKING_2D_STABILIZATION) { - float loc[2], scale, angle; - int clip_framenr = BKE_movieclip_remap_scene_to_clip_frame(clip, rd->cfra); - - BKE_tracking_stabilization_data_get(&clip->tracking, clip_framenr, stackbuf->x, stackbuf->y, - loc, &scale, &angle); - - out[1]->vec[0] = loc[0]; - out[2]->vec[0] = loc[1]; - - out[3]->vec[0] = scale; - out[4]->vec[0] = angle; - } - - /* generate preview */ - generate_preview(data, node, stackbuf); - } - } -} - -#endif /* WITH_COMPOSITOR_LEGACY */ - static void init(bNodeTree *UNUSED(ntree), bNode *node, bNodeTemplate *UNUSED(ntemp)) { MovieClipUser *user = MEM_callocN(sizeof(MovieClipUser), "node movie clip user"); @@ -159,9 +59,6 @@ void register_node_type_cmp_movieclip(bNodeTreeType *ttype) node_type_size(&ntype, 120, 80, 300); node_type_init(&ntype, init); node_type_storage(&ntype, "MovieClipUser", node_free_standard_storage, node_copy_standard_storage); -#ifdef WITH_COMPOSITOR_LEGACY - node_type_exec(&ntype, node_composit_exec_movieclip); -#endif nodeRegisterType(ttype, &ntype); } diff --git a/source/blender/nodes/composite/nodes/node_composite_moviedistortion.c b/source/blender/nodes/composite/nodes/node_composite_moviedistortion.c index 9f4cd467c94..4817c59bbbd 100644 --- a/source/blender/nodes/composite/nodes/node_composite_moviedistortion.c +++ b/source/blender/nodes/composite/nodes/node_composite_moviedistortion.c @@ -30,9 +30,6 @@ * \ingroup cmpnodes */ -#include "BLF_translation.h" - - #include "node_composite_util.h" /* **************** Translate ******************** */ @@ -47,66 +44,6 @@ static bNodeSocketTemplate cmp_node_moviedistortion_out[] = { { -1, 0, "" } }; -#ifdef WITH_COMPOSITOR_LEGACY -static void node_composit_exec_moviedistortion(void *data, bNode *node, bNodeStack **in, bNodeStack **out) -{ - if (in[0]->data) { - if (node->id) { - MovieClip *clip = (MovieClip *)node->id; - CompBuf *cbuf = typecheck_compbuf(in[0]->data, CB_RGBA); - CompBuf *stackbuf = alloc_compbuf(cbuf->x, cbuf->y, CB_RGBA, 0); - ImBuf *ibuf; - - ibuf = IMB_allocImBuf(cbuf->x, cbuf->y, 32, 0); - - if (ibuf) { - RenderData *rd = data; - ImBuf *obuf; - MovieTracking *tracking = &clip->tracking; - int width, height; - float overscan = 0.0f; - MovieClipUser user = {0}; - - BKE_movieclip_user_set_frame(&user, rd->cfra); - - ibuf->rect_float = cbuf->rect; - - BKE_movieclip_get_size(clip, &user, &width, &height); - - if (!node->storage) - node->storage = BKE_tracking_distortion_new(); - - if (node->custom1 == 0) - obuf = BKE_tracking_distortion_exec(node->storage, tracking, ibuf, width, height, overscan, 1); - else - obuf = BKE_tracking_distortion_exec(node->storage, tracking, ibuf, width, height, overscan, 0); - - stackbuf->rect = obuf->rect_float; - stackbuf->malloc = TRUE; - - obuf->mall &= ~IB_rectfloat; - obuf->rect_float = NULL; - - IMB_freeImBuf(ibuf); - IMB_freeImBuf(obuf); - } - - /* pass on output and free */ - out[0]->data = stackbuf; - - if (cbuf != in[0]->data) - free_compbuf(cbuf); - } - else { - CompBuf *cbuf = in[0]->data; - CompBuf *stackbuf = pass_on_compbuf(cbuf); - - out[0]->data = stackbuf; - } - } -} -#endif /* WITH_COMPOSITOR_LEGACY */ - static const char *label(bNode *node) { if (node->custom1 == 0) @@ -137,9 +74,6 @@ void register_node_type_cmp_moviedistortion(bNodeTreeType *ttype) node_type_socket_templates(&ntype, cmp_node_moviedistortion_in, cmp_node_moviedistortion_out); node_type_size(&ntype, 140, 100, 320); node_type_label(&ntype, label); -#ifdef WITH_COMPOSITOR_LEGACY - node_type_exec(&ntype, node_composit_exec_moviedistortion); -#endif node_type_storage(&ntype, NULL, storage_free, storage_copy); diff --git a/source/blender/nodes/composite/nodes/node_composite_normal.c b/source/blender/nodes/composite/nodes/node_composite_normal.c index d104e8f03e6..1497757bbf4 100644 --- a/source/blender/nodes/composite/nodes/node_composite_normal.c +++ b/source/blender/nodes/composite/nodes/node_composite_normal.c @@ -45,44 +45,6 @@ static bNodeSocketTemplate cmp_node_normal_out[] = { { -1, 0, "" } }; -#ifdef WITH_COMPOSITOR_LEGACY - -static void do_normal(bNode *node, float *out, float *in) -{ - bNodeSocket *sock= node->outputs.first; - float *nor= ((bNodeSocketValueVector*)sock->default_value)->value; - - /* render normals point inside... the widget points outside */ - out[0] = -dot_v3v3(nor, in); -} - -/* generates normal, does dot product */ -static void node_composit_exec_normal(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out) -{ - bNodeSocket *sock= node->outputs.first; - float *nor= ((bNodeSocketValueVector*)sock->default_value)->value; - /* stack order input: normal */ - /* stack order output: normal, value */ - - /* input no image? then only vector op */ - if (in[0]->data==NULL) { - copy_v3_v3(out[0]->vec, nor); - /* render normals point inside... the widget points outside */ - out[1]->vec[0] = -dot_v3v3(out[0]->vec, in[0]->vec); - } - else if (out[1]->hasoutput) { - /* make output size of input image */ - CompBuf *cbuf= in[0]->data; - CompBuf *stackbuf= alloc_compbuf(cbuf->x, cbuf->y, CB_VAL, 1); /* allocs */ - - composit1_pixel_processor(node, stackbuf, in[0]->data, in[0]->vec, do_normal, CB_VEC3); - - out[1]->data= stackbuf; - } -} - -#endif /* WITH_COMPOSITOR_LEGACY */ - static void init(bNodeTree *UNUSED(ntree), bNode *node, bNodeTemplate *UNUSED(ntemp)) { bNodeSocket *sock= node->outputs.first; @@ -101,9 +63,6 @@ void register_node_type_cmp_normal(bNodeTreeType *ttype) node_type_socket_templates(&ntype, cmp_node_normal_in, cmp_node_normal_out); node_type_init(&ntype, init); node_type_size(&ntype, 100, 60, 200); -#ifdef WITH_COMPOSITOR_LEGACY - node_type_exec(&ntype, node_composit_exec_normal); -#endif nodeRegisterType(ttype, &ntype); } diff --git a/source/blender/nodes/composite/nodes/node_composite_normalize.c b/source/blender/nodes/composite/nodes/node_composite_normalize.c index 19b543dce5d..f90a5cdba74 100644 --- a/source/blender/nodes/composite/nodes/node_composite_normalize.c +++ b/source/blender/nodes/composite/nodes/node_composite_normalize.c @@ -43,69 +43,6 @@ static bNodeSocketTemplate cmp_node_normalize_out[] = { { -1, 0, "" } }; -#ifdef WITH_COMPOSITOR_LEGACY - -static void do_normalize(bNode *UNUSED(node), float *out, float *src, float *min, float *mult) -{ - float res; - res = (src[0] - min[0]) * mult[0]; - if (res > 1.0f) { - out[0] = 1.0f; - } - else if (res < 0.0f) { - out[0] = 0.0f; - } - else { - out[0] = res; - } -} - -/* The code below assumes all data is inside range +- this, and that input buffer is single channel */ -#define BLENDER_ZMAX 10000.0f - -static void node_composit_exec_normalize(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out) -{ - /* stack order in: valbuf */ - /* stack order out: valbuf */ - if (out[0]->hasoutput==0) return; - - /* Input has no image buffer? Then pass the value */ - if (in[0]->data==NULL) { - copy_v4_v4(out[0]->vec, in[0]->vec); - } - else { - float min = 1.0f+BLENDER_ZMAX; - float max = -1.0f-BLENDER_ZMAX; - float mult = 1.0f; - float *val; - /* make output size of input image */ - CompBuf *cbuf= in[0]->data; - int tot= cbuf->x*cbuf->y; - CompBuf *stackbuf= alloc_compbuf(cbuf->x, cbuf->y, CB_VAL, 1); /* allocs */ - - for (val = cbuf->rect; tot; tot--, val++) { - if ((*val > max) && (*val <= BLENDER_ZMAX)) { - max = *val; - } - if ((*val < min) && (*val >= -BLENDER_ZMAX)) { - min = *val; - } - } - /* In the rare case of flat buffer, which would cause a divide by 0, just pass the input to the output */ - if ((max-min) != 0.0f) { - mult = 1.0f/(max-min); - composit3_pixel_processor(node, stackbuf, in[0]->data, in[0]->vec, NULL, &min, NULL, &mult, do_normalize, CB_VAL, CB_VAL, CB_VAL); - } - else { - memcpy(stackbuf->rect, cbuf->rect, sizeof(float) * cbuf->x * cbuf->y); - } - - out[0]->data= stackbuf; - } -} - -#endif /* WITH_COMPOSITOR_LEGACY */ - void register_node_type_cmp_normalize(bNodeTreeType *ttype) { static bNodeType ntype; @@ -113,9 +50,6 @@ void register_node_type_cmp_normalize(bNodeTreeType *ttype) node_type_base(ttype, &ntype, CMP_NODE_NORMALIZE, "Normalize", NODE_CLASS_OP_VECTOR, NODE_OPTIONS); node_type_socket_templates(&ntype, cmp_node_normalize_in, cmp_node_normalize_out); node_type_size(&ntype, 100, 60, 150); -#ifdef WITH_COMPOSITOR_LEGACY - node_type_exec(&ntype, node_composit_exec_normalize); -#endif nodeRegisterType(ttype, &ntype); } diff --git a/source/blender/nodes/composite/nodes/node_composite_outputFile.c b/source/blender/nodes/composite/nodes/node_composite_outputFile.c index fe23f7373fb..e8a650682c2 100644 --- a/source/blender/nodes/composite/nodes/node_composite_outputFile.c +++ b/source/blender/nodes/composite/nodes/node_composite_outputFile.c @@ -225,183 +225,6 @@ static void update_output_file(bNodeTree *UNUSED(ntree), bNode *node) } } -#ifdef WITH_COMPOSITOR_LEGACY - -/* write input data into individual files */ -static void exec_output_file_singlelayer(RenderData *rd, bNode *node, bNodeStack **in) -{ - Main *bmain= G.main; /* TODO, have this passed along */ - NodeImageMultiFile *nimf= node->storage; - bNodeSocket *sock; - int i; - int has_preview = 0; - - for (sock=node->inputs.first, i=0; sock; sock=sock->next, ++i) { - if (in[i]->data) { - NodeImageMultiFileSocket *sockdata = sock->storage; - ImageFormatData *format = (sockdata->use_node_format ? &nimf->format : &sockdata->format); - char path[FILE_MAX]; - char filename[FILE_MAX]; - CompBuf *cbuf = NULL; - ImBuf *ibuf; - - switch (format->planes) { - case R_IMF_PLANES_BW: - cbuf = typecheck_compbuf(in[i]->data, CB_VAL); - break; - case R_IMF_PLANES_RGB: - cbuf = typecheck_compbuf(in[i]->data, CB_VEC3); - break; - case R_IMF_PLANES_RGBA: - cbuf = typecheck_compbuf(in[i]->data, CB_RGBA); - break; - } - - ibuf = IMB_allocImBuf(cbuf->x, cbuf->y, format->planes, 0); - /* XXX have to set this explicitly it seems */ - switch (format->planes) { - case R_IMF_PLANES_BW: ibuf->channels = 1; break; - case R_IMF_PLANES_RGB: ibuf->channels = 3; break; - case R_IMF_PLANES_RGBA: ibuf->channels = 4; break; - } - ibuf->rect_float = cbuf->rect; - ibuf->dither = rd->dither_intensity; - - /* get full path */ - BLI_join_dirfile(path, FILE_MAX, nimf->base_path, sockdata->path); - BKE_makepicstring(filename, path, bmain->name, rd->cfra, format, (rd->scemode & R_EXTENSION), TRUE); - - if (0 == BKE_imbuf_write(ibuf, filename, format)) - printf("Cannot save Node File Output to %s\n", filename); - else - printf("Saved: %s\n", filename); - - IMB_freeImBuf(ibuf); - - /* simply pick the first valid input for preview */ - if (!has_preview) { - generate_preview(rd, node, cbuf); - has_preview = 1; - } - - if (in[i]->data != cbuf) - free_compbuf(cbuf); - } - } -} - -/* write input data into layers */ -static void exec_output_file_multilayer(RenderData *rd, bNode *node, bNodeStack **in) -{ - Main *bmain= G.main; /* TODO, have this passed along */ - NodeImageMultiFile *nimf= node->storage; - void *exrhandle= IMB_exr_get_handle(); - char filename[FILE_MAX]; - bNodeSocket *sock; - int i; - /* Must have consistent pixel size for exr file, simply take the first valid input size. */ - int rectx = -1; - int recty = -1; - int has_preview = 0; - - BKE_makepicstring_from_type(filename, nimf->base_path, bmain->name, rd->cfra, R_IMF_IMTYPE_MULTILAYER, (rd->scemode & R_EXTENSION), TRUE); - BLI_make_existing_file(filename); - - for (sock=node->inputs.first, i=0; sock; sock=sock->next, ++i) { - if (in[i]->data) { - NodeImageMultiFileSocket *sockdata = sock->storage; - CompBuf *cbuf = in[i]->data; - char channelname[EXR_TOT_MAXNAME]; /* '.' and single character channel name is appended */ - char *channelname_ext; - - if (cbuf->rect_procedural) { - printf("Error writing multilayer EXR: Procedural buffer not supported\n"); - continue; - } - if (rectx < 0) { - rectx = cbuf->x; - recty = cbuf->y; - } - else if (cbuf->x != rectx || cbuf->y != recty) { - printf("Error: Multilayer EXR output node %s expects same resolution for all input buffers. Layer %s skipped.\n", node->name, sock->name); - continue; - } - - BLI_strncpy(channelname, sockdata->layer, sizeof(channelname)-2); - channelname_ext = channelname + strlen(channelname); - - /* create channels */ - switch (cbuf->type) { - case CB_VAL: - strcpy(channelname_ext, ".V"); - IMB_exr_add_channel(exrhandle, NULL, channelname, 1, rectx, cbuf->rect); - break; - case CB_VEC2: - strcpy(channelname_ext, ".X"); - IMB_exr_add_channel(exrhandle, NULL, channelname, 2, 2*rectx, cbuf->rect); - strcpy(channelname_ext, ".Y"); - IMB_exr_add_channel(exrhandle, NULL, channelname, 2, 2*rectx, cbuf->rect+1); - break; - case CB_VEC3: - strcpy(channelname_ext, ".X"); - IMB_exr_add_channel(exrhandle, NULL, channelname, 3, 3*rectx, cbuf->rect); - strcpy(channelname_ext, ".Y"); - IMB_exr_add_channel(exrhandle, NULL, channelname, 3, 3*rectx, cbuf->rect+1); - strcpy(channelname_ext, ".Z"); - IMB_exr_add_channel(exrhandle, NULL, channelname, 3, 3*rectx, cbuf->rect+2); - break; - case CB_RGBA: - strcpy(channelname_ext, ".R"); - IMB_exr_add_channel(exrhandle, NULL, channelname, 4, 4*rectx, cbuf->rect); - strcpy(channelname_ext, ".G"); - IMB_exr_add_channel(exrhandle, NULL, channelname, 4, 4*rectx, cbuf->rect+1); - strcpy(channelname_ext, ".B"); - IMB_exr_add_channel(exrhandle, NULL, channelname, 4, 4*rectx, cbuf->rect+2); - strcpy(channelname_ext, ".A"); - IMB_exr_add_channel(exrhandle, NULL, channelname, 4, 4*rectx, cbuf->rect+3); - break; - } - - /* simply pick the first valid input for preview */ - if (!has_preview) { - generate_preview(rd, node, cbuf); - has_preview = 1; - } - } - } - - /* when the filename has no permissions, this can fail */ - if (IMB_exr_begin_write(exrhandle, filename, rectx, recty, nimf->format.exr_codec)) { - IMB_exr_write_channels(exrhandle); - } - else { - /* TODO, get the error from openexr's exception */ - /* XXX nice way to do report? */ - printf("Error Writing Render Result, see console\n"); - } - - IMB_exr_close(exrhandle); -} - -static void node_composit_exec_outputfile(void *data, bNode *node, bNodeStack **in, bNodeStack **UNUSED(out)) -{ - RenderData *rd= data; - NodeImageMultiFile *nimf= node->storage; - - if (G.is_rendering == FALSE) { - /* only output files when rendering a sequence - - * otherwise, it overwrites the output files just - * scrubbing through the timeline when the compositor updates */ - return; - } - - if (nimf->format.imtype==R_IMF_IMTYPE_MULTILAYER) - exec_output_file_multilayer(rd, node, in); - else - exec_output_file_singlelayer(rd, node, in); -} -#endif /* WITH_COMPOSITOR_LEGACY */ - void register_node_type_cmp_output_file(bNodeTreeType *ttype) { static bNodeType ntype; @@ -412,9 +235,6 @@ void register_node_type_cmp_output_file(bNodeTreeType *ttype) node_type_init(&ntype, init_output_file); node_type_storage(&ntype, "NodeImageMultiFile", free_output_file, copy_output_file); node_type_update(&ntype, update_output_file, NULL); -#ifdef WITH_COMPOSITOR_LEGACY - node_type_exec(&ntype, node_composit_exec_outputfile); -#endif nodeRegisterType(ttype, &ntype); } diff --git a/source/blender/nodes/composite/nodes/node_composite_premulkey.c b/source/blender/nodes/composite/nodes/node_composite_premulkey.c index 7f7b7692b02..88f583b402e 100644 --- a/source/blender/nodes/composite/nodes/node_composite_premulkey.c +++ b/source/blender/nodes/composite/nodes/node_composite_premulkey.c @@ -44,27 +44,6 @@ static bNodeSocketTemplate cmp_node_premulkey_out[] = { { -1, 0, "" } }; -#ifdef WITH_COMPOSITOR_LEGACY - -static void node_composit_exec_premulkey(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out) -{ - if (out[0]->hasoutput==0) - return; - - if (in[0]->data) { - CompBuf *stackbuf, *cbuf= typecheck_compbuf(in[0]->data, CB_RGBA); - - stackbuf= dupalloc_compbuf(cbuf); - premul_compbuf(stackbuf, node->custom1 == 1); - - out[0]->data = stackbuf; - if (cbuf != in[0]->data) - free_compbuf(cbuf); - } -} - -#endif /* WITH_COMPOSITOR_LEGACY */ - void register_node_type_cmp_premulkey(bNodeTreeType *ttype) { static bNodeType ntype; @@ -72,9 +51,6 @@ void register_node_type_cmp_premulkey(bNodeTreeType *ttype) node_type_base(ttype, &ntype, CMP_NODE_PREMULKEY, "Alpha Convert", NODE_CLASS_CONVERTOR, NODE_OPTIONS); node_type_socket_templates(&ntype, cmp_node_premulkey_in, cmp_node_premulkey_out); node_type_size(&ntype, 140, 100, 320); -#ifdef WITH_COMPOSITOR_LEGACY - node_type_exec(&ntype, node_composit_exec_premulkey); -#endif nodeRegisterType(ttype, &ntype); } diff --git a/source/blender/nodes/composite/nodes/node_composite_rgb.c b/source/blender/nodes/composite/nodes/node_composite_rgb.c index 54fba650783..ad06d7a9a7e 100644 --- a/source/blender/nodes/composite/nodes/node_composite_rgb.c +++ b/source/blender/nodes/composite/nodes/node_composite_rgb.c @@ -39,18 +39,6 @@ static bNodeSocketTemplate cmp_node_rgb_out[] = { { -1, 0, "" } }; -#ifdef WITH_COMPOSITOR_LEGACY - -static void node_composit_exec_rgb(void *UNUSED(data), bNode *node, bNodeStack **UNUSED(in), bNodeStack **out) -{ - bNodeSocket *sock= node->outputs.first; - float *col= ((bNodeSocketValueRGBA*)sock->default_value)->value; - - copy_v4_v4(out[0]->vec, col); -} - -#endif /* WITH_COMPOSITOR_LEGACY */ - static void node_composit_init_rgb(bNodeTree *UNUSED(ntree), bNode *node, bNodeTemplate *UNUSED(ntemp)) { bNodeSocket *sock= node->outputs.first; @@ -70,9 +58,6 @@ void register_node_type_cmp_rgb(bNodeTreeType *ttype) node_type_socket_templates(&ntype, NULL, cmp_node_rgb_out); node_type_init(&ntype, node_composit_init_rgb); node_type_size(&ntype, 140, 80, 140); -#ifdef WITH_COMPOSITOR_LEGACY - node_type_exec(&ntype, node_composit_exec_rgb); -#endif nodeRegisterType(ttype, &ntype); } diff --git a/source/blender/nodes/composite/nodes/node_composite_rotate.c b/source/blender/nodes/composite/nodes/node_composite_rotate.c index 50c8b2a78c1..4eb869e5444 100644 --- a/source/blender/nodes/composite/nodes/node_composite_rotate.c +++ b/source/blender/nodes/composite/nodes/node_composite_rotate.c @@ -44,87 +44,6 @@ static bNodeSocketTemplate cmp_node_rotate_out[] = { { -1, 0, "" } }; -#ifdef WITH_COMPOSITOR_LEGACY - -/* only supports RGBA nodes now */ -static void node_composit_exec_rotate(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out) -{ - - if (out[0]->hasoutput==0) - return; - - if (in[0]->data) { - CompBuf *cbuf= typecheck_compbuf(in[0]->data, CB_RGBA); - CompBuf *stackbuf= alloc_compbuf(cbuf->x, cbuf->y, CB_RGBA, 1); /* note, this returns zero'd image */ - float rad, u, v, s, c, centx, centy, miny, maxy, minx, maxx; - int x, y, yo, xo; - ImBuf *ibuf, *obuf; - - rad= in[1]->vec[0]; - - - s= sin(rad); - c= cos(rad); - centx= cbuf->x/2; - centy= cbuf->y/2; - - minx= -centx; - maxx= -centx + (float)cbuf->x; - miny= -centy; - maxy= -centy + (float)cbuf->y; - - - ibuf=IMB_allocImBuf(cbuf->x, cbuf->y, 32, 0); - obuf=IMB_allocImBuf(stackbuf->x, stackbuf->y, 32, 0); - - if (ibuf && obuf) { - ibuf->rect_float=cbuf->rect; - obuf->rect_float=stackbuf->rect; - - for (y=miny; y<maxy; y++) { - yo= y+(int)centy; - - for (x=minx; x<maxx;x++) { - u=c*x + y*s + centx; - v=-s*x + c*y + centy; - xo= x+(int)centx; - - switch (node->custom1) { - case 0: - nearest_interpolation(ibuf, obuf, u, v, xo, yo); - break; - case 1: - bilinear_interpolation(ibuf, obuf, u, v, xo, yo); - break; - case 2: - bicubic_interpolation(ibuf, obuf, u, v, xo, yo); - break; - } - - } - } - - /* rotate offset vector too, but why negative rad, ehh?? Has to be replaced with [3][3] matrix once (ton) */ - s= sin(-rad); - c= cos(-rad); - centx= (float)cbuf->xof; centy= (float)cbuf->yof; - stackbuf->xof= (int)( c*centx + s*centy); - stackbuf->yof= (int)(-s*centx + c*centy); - - IMB_freeImBuf(ibuf); - IMB_freeImBuf(obuf); - } - - /* pass on output and free */ - out[0]->data= stackbuf; - if (cbuf!=in[0]->data) { - free_compbuf(cbuf); - } - } -} - -#endif /* WITH_COMPOSITOR_LEGACY */ - static void node_composit_init_rotate(bNodeTree *UNUSED(ntree), bNode *node, bNodeTemplate *UNUSED(ntemp)) { node->custom1= 1; /* Bilinear Filter*/ @@ -138,9 +57,6 @@ void register_node_type_cmp_rotate(bNodeTreeType *ttype) node_type_socket_templates(&ntype, cmp_node_rotate_in, cmp_node_rotate_out); node_type_size(&ntype, 140, 100, 320); node_type_init(&ntype, node_composit_init_rotate); -#ifdef WITH_COMPOSITOR_LEGACY - node_type_exec(&ntype, node_composit_exec_rotate); -#endif nodeRegisterType(ttype, &ntype); } diff --git a/source/blender/nodes/composite/nodes/node_composite_scale.c b/source/blender/nodes/composite/nodes/node_composite_scale.c index 2224d653c37..5136aec112d 100644 --- a/source/blender/nodes/composite/nodes/node_composite_scale.c +++ b/source/blender/nodes/composite/nodes/node_composite_scale.c @@ -45,147 +45,6 @@ static bNodeSocketTemplate cmp_node_scale_out[] = { { -1, 0, "" } }; -#ifdef WITH_COMPOSITOR_LEGACY - -/* only supports RGBA nodes now */ -/* node->custom1 stores if input values are absolute or relative scale */ -static void node_composit_exec_scale(void *data, bNode *node, bNodeStack **in, bNodeStack **out) -{ - if (out[0]->hasoutput == 0) - return; - - if (in[0]->data) { - RenderData *rd = data; - CompBuf *stackbuf, *cbuf = typecheck_compbuf(in[0]->data, CB_RGBA); - ImBuf *ibuf; - int newx, newy; - float ofsx = 0.0f, ofsy = 0.0f; - - if (node->custom1 == CMP_SCALE_RELATIVE) { - newx = MAX2((int)(in[1]->vec[0] * cbuf->x), 1); - newy = MAX2((int)(in[2]->vec[0] * cbuf->y), 1); - } - else if (node->custom1 == CMP_SCALE_SCENEPERCENT) { - newx = cbuf->x * (rd->size / 100.0f); - newy = cbuf->y * (rd->size / 100.0f); - } - else if (node->custom1 == CMP_SCALE_RENDERPERCENT) { - - if (node->custom3 != 0.0f || node->custom4 != 0.0f) { - const float w_dst = (rd->xsch * rd->size) / 100; - const float h_dst = (rd->ysch * rd->size) / 100; - - if (w_dst > h_dst) { - ofsx = node->custom3 * w_dst; - ofsy = node->custom4 * w_dst; - } - else { - ofsx = node->custom3 * h_dst; - ofsy = node->custom4 * h_dst; - } - } - - /* supports framing options */ - if (node->custom2 & CMP_SCALE_RENDERSIZE_FRAME_ASPECT) { - /* apply aspect from clip */ - const float w_src = cbuf->x; - const float h_src = cbuf->y; - - /* destination aspect is already applied from the camera frame */ - const float w_dst = (rd->xsch * rd->size) / 100; - const float h_dst = (rd->ysch * rd->size) / 100; - - const float asp_src = w_src / h_src; - const float asp_dst = w_dst / h_dst; - - if (fabsf(asp_src - asp_dst) >= FLT_EPSILON) { - if ((asp_src > asp_dst) == ((node->custom2 & CMP_SCALE_RENDERSIZE_FRAME_CROP) != 0)) { - /* fit X */ - const float div = asp_src / asp_dst; - newx = w_dst * div; - newy = h_dst; - } - else { - /* fit Y */ - const float div = asp_dst / asp_src; - newx = w_dst; - newy = h_dst * div; - } - } - else { - /* same as below - no aspect correction needed */ - newx = w_dst; - newy = h_dst; - } - } - else { - /* stretch */ - newx = (rd->xsch * rd->size) / 100; - newy = (rd->ysch * rd->size) / 100; - } - } - else { /* CMP_SCALE_ABSOLUTE */ - newx = MAX2((int)in[1]->vec[0], 1); - newy = MAX2((int)in[2]->vec[0], 1); - } - newx = MIN2(newx, CMP_SCALE_MAX); - newy = MIN2(newy, CMP_SCALE_MAX); - - ibuf = IMB_allocImBuf(cbuf->x, cbuf->y, 32, 0); - if (ibuf) { - ibuf->rect_float = cbuf->rect; - IMB_scaleImBuf(ibuf, newx, newy); - - if (ibuf->rect_float == cbuf->rect) { - /* no scaling happened. */ - stackbuf = pass_on_compbuf(in[0]->data); - } - else { - stackbuf = alloc_compbuf(newx, newy, CB_RGBA, 0); - stackbuf->rect = ibuf->rect_float; - stackbuf->malloc = 1; - } - - ibuf->rect_float = NULL; - ibuf->mall &= ~IB_rectfloat; - IMB_freeImBuf(ibuf); - - /* also do the translation vector */ - stackbuf->xof = (int)(ofsx + (((float)newx / (float)cbuf->x) * (float)cbuf->xof)); - stackbuf->yof = (int)(ofsy + (((float)newy / (float)cbuf->y) * (float)cbuf->yof)); - } - else { - stackbuf = dupalloc_compbuf(cbuf); - printf("Scaling to %dx%d failed\n", newx, newy); - } - - out[0]->data = stackbuf; - if (cbuf != in[0]->data) - free_compbuf(cbuf); - } - else if (node->custom1 == CMP_SCALE_ABSOLUTE) { - CompBuf *stackbuf; - int a, x, y; - float *fp; - - x = MAX2((int)in[1]->vec[0], 1); - y = MAX2((int)in[2]->vec[0], 1); - - stackbuf = alloc_compbuf(x, y, CB_RGBA, 1); - fp = stackbuf->rect; - - a = stackbuf->x * stackbuf->y; - while (a--) { - copy_v4_v4(fp, in[0]->vec); - fp += 4; - } - - out[0]->data = stackbuf; - } -} - -#endif /* WITH_COMPOSITOR_LEGACY */ - void register_node_type_cmp_scale(bNodeTreeType *ttype) { static bNodeType ntype; @@ -193,9 +52,6 @@ void register_node_type_cmp_scale(bNodeTreeType *ttype) node_type_base(ttype, &ntype, CMP_NODE_SCALE, "Scale", NODE_CLASS_DISTORT, NODE_OPTIONS); node_type_socket_templates(&ntype, cmp_node_scale_in, cmp_node_scale_out); node_type_size(&ntype, 140, 100, 320); -#ifdef WITH_COMPOSITOR_LEGACY - node_type_exec(&ntype, node_composit_exec_scale); -#endif nodeRegisterType(ttype, &ntype); } diff --git a/source/blender/nodes/composite/nodes/node_composite_sepcombHSVA.c b/source/blender/nodes/composite/nodes/node_composite_sepcombHSVA.c index f1a75493718..83b9d5d3fcd 100644 --- a/source/blender/nodes/composite/nodes/node_composite_sepcombHSVA.c +++ b/source/blender/nodes/composite/nodes/node_composite_sepcombHSVA.c @@ -46,63 +46,6 @@ static bNodeSocketTemplate cmp_node_sephsva_out[] = { { -1, 0, "" } }; -#ifdef WITH_COMPOSITOR_LEGACY - -static void do_sephsva(bNode *UNUSED(node), float *out, float *in) -{ - float h, s, v; - - rgb_to_hsv(in[0], in[1], in[2], &h, &s, &v); - - out[0] = h; - out[1] = s; - out[2] = v; - out[3] = in[3]; -} - -static void node_composit_exec_sephsva(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out) -{ - /* stack order out: bw channels */ - /* stack order in: col */ - - /* input no image? then only color operation */ - if (in[0]->data==NULL) { - float h, s, v; - - rgb_to_hsv(in[0]->vec[0], in[0]->vec[1], in[0]->vec[2], &h, &s, &v); - - out[0]->vec[0] = h; - out[1]->vec[0] = s; - out[2]->vec[0] = v; - out[3]->vec[0] = in[0]->vec[3]; - } - else if ((out[0]->hasoutput) || (out[1]->hasoutput) || (out[2]->hasoutput) || (out[3]->hasoutput)) { - /* create new buffer so input buffer doesn't get corrupted */ - CompBuf *cbuf= dupalloc_compbuf(in[0]->data); - CompBuf *cbuf2= typecheck_compbuf(cbuf, CB_RGBA); - - /* convert the RGB stackbuf to an HSV representation */ - composit1_pixel_processor(node, cbuf2, cbuf2, in[0]->vec, do_sephsva, CB_RGBA); - - /* separate each of those channels */ - if (out[0]->hasoutput) - out[0]->data= valbuf_from_rgbabuf(cbuf2, CHAN_R); - if (out[1]->hasoutput) - out[1]->data= valbuf_from_rgbabuf(cbuf2, CHAN_G); - if (out[2]->hasoutput) - out[2]->data= valbuf_from_rgbabuf(cbuf2, CHAN_B); - if (out[3]->hasoutput) - out[3]->data= valbuf_from_rgbabuf(cbuf2, CHAN_A); - - /*not used anymore */ - if (cbuf2!=cbuf) - free_compbuf(cbuf2); - free_compbuf(cbuf); - } -} - -#endif /* WITH_COMPOSITOR_LEGACY */ - void register_node_type_cmp_sephsva(bNodeTreeType *ttype) { static bNodeType ntype; @@ -110,9 +53,6 @@ void register_node_type_cmp_sephsva(bNodeTreeType *ttype) node_type_base(ttype, &ntype, CMP_NODE_SEPHSVA, "Separate HSVA", NODE_CLASS_CONVERTOR, 0); node_type_socket_templates(&ntype, cmp_node_sephsva_in, cmp_node_sephsva_out); node_type_size(&ntype, 80, 40, 140); -#ifdef WITH_COMPOSITOR_LEGACY - node_type_exec(&ntype, node_composit_exec_sephsva); -#endif nodeRegisterType(ttype, &ntype); } @@ -131,53 +71,6 @@ static bNodeSocketTemplate cmp_node_combhsva_out[] = { { -1, 0, "" } }; -#ifdef WITH_COMPOSITOR_LEGACY - -static void do_comb_hsva(bNode *UNUSED(node), float *out, float *in1, float *in2, float *in3, float *in4) -{ - float r, g, b; - hsv_to_rgb(in1[0], in2[0], in3[0], &r, &g, &b); - - out[0] = r; - out[1] = g; - out[2] = b; - out[3] = in4[0]; -} - -static void node_composit_exec_combhsva(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out) -{ - /* stack order out: 1 rgba channels */ - /* stack order in: 4 value channels */ - - /* input no image? then only color operation in HSV */ - if ((in[0]->data==NULL) && (in[1]->data==NULL) && (in[2]->data==NULL) && (in[3]->data==NULL)) { - hsv_to_rgb(in[0]->vec[0], in[1]->vec[0], in[2]->vec[0], - &out[0]->vec[0], &out[0]->vec[1], &out[0]->vec[2]); - out[0]->vec[3] = in[3]->vec[0]; - } - else { - /* make output size of first available input image */ - CompBuf *cbuf; - CompBuf *stackbuf; - - /* allocate a CompBuf the size of the first available input */ - if (in[0]->data) cbuf = in[0]->data; - else if (in[1]->data) cbuf = in[1]->data; - else if (in[2]->data) cbuf = in[2]->data; - else cbuf = in[3]->data; - - stackbuf = alloc_compbuf(cbuf->x, cbuf->y, CB_RGBA, 1); /* allocs */ - - composit4_pixel_processor(node, stackbuf, in[0]->data, in[0]->vec, in[1]->data, in[1]->vec, - in[2]->data, in[2]->vec, in[3]->data, in[3]->vec, - do_comb_hsva, CB_VAL, CB_VAL, CB_VAL, CB_VAL); - - out[0]->data= stackbuf; - } -} - -#endif /* WITH_COMPOSITOR_LEGACY */ - void register_node_type_cmp_combhsva(bNodeTreeType *ttype) { static bNodeType ntype; @@ -185,9 +78,6 @@ void register_node_type_cmp_combhsva(bNodeTreeType *ttype) node_type_base(ttype, &ntype, CMP_NODE_COMBHSVA, "Combine HSVA", NODE_CLASS_CONVERTOR, NODE_OPTIONS); node_type_socket_templates(&ntype, cmp_node_combhsva_in, cmp_node_combhsva_out); node_type_size(&ntype, 80, 40, 140); -#ifdef WITH_COMPOSITOR_LEGACY - node_type_exec(&ntype, node_composit_exec_combhsva); -#endif nodeRegisterType(ttype, &ntype); } diff --git a/source/blender/nodes/composite/nodes/node_composite_sepcombRGBA.c b/source/blender/nodes/composite/nodes/node_composite_sepcombRGBA.c index 83b2c731020..8508087da0f 100644 --- a/source/blender/nodes/composite/nodes/node_composite_sepcombRGBA.c +++ b/source/blender/nodes/composite/nodes/node_composite_sepcombRGBA.c @@ -45,42 +45,6 @@ static bNodeSocketTemplate cmp_node_seprgba_out[] = { { -1, 0, "" } }; -#ifdef WITH_COMPOSITOR_LEGACY - -static void node_composit_exec_seprgba(void *UNUSED(data), bNode *UNUSED(node), bNodeStack **in, bNodeStack **out) -{ - /* stack order out: bw channels */ - /* stack order in: col */ - - /* input no image? then only color operation */ - if (in[0]->data==NULL) { - out[0]->vec[0] = in[0]->vec[0]; - out[1]->vec[0] = in[0]->vec[1]; - out[2]->vec[0] = in[0]->vec[2]; - out[3]->vec[0] = in[0]->vec[3]; - } - else { - /* make sure we get right rgba buffer */ - CompBuf *cbuf= typecheck_compbuf(in[0]->data, CB_RGBA); - - /* don't do any pixel processing, just copy the stack directly (faster, I presume) */ - if (out[0]->hasoutput) - out[0]->data= valbuf_from_rgbabuf(cbuf, CHAN_R); - if (out[1]->hasoutput) - out[1]->data= valbuf_from_rgbabuf(cbuf, CHAN_G); - if (out[2]->hasoutput) - out[2]->data= valbuf_from_rgbabuf(cbuf, CHAN_B); - if (out[3]->hasoutput) - out[3]->data= valbuf_from_rgbabuf(cbuf, CHAN_A); - - if (cbuf!=in[0]->data) - free_compbuf(cbuf); - - } -} - -#endif /* WITH_COMPOSITOR_LEGACY */ - void register_node_type_cmp_seprgba(bNodeTreeType *ttype) { static bNodeType ntype; @@ -88,9 +52,6 @@ void register_node_type_cmp_seprgba(bNodeTreeType *ttype) node_type_base(ttype, &ntype, CMP_NODE_SEPRGBA, "Separate RGBA", NODE_CLASS_CONVERTOR, 0); node_type_socket_templates(&ntype, cmp_node_seprgba_in, cmp_node_seprgba_out); node_type_size(&ntype, 80, 40, 140); -#ifdef WITH_COMPOSITOR_LEGACY - node_type_exec(&ntype, node_composit_exec_seprgba); -#endif nodeRegisterType(ttype, &ntype); } @@ -110,51 +71,6 @@ static bNodeSocketTemplate cmp_node_combrgba_out[] = { { -1, 0, "" } }; -#ifdef WITH_COMPOSITOR_LEGACY - -static void do_combrgba(bNode *UNUSED(node), float *out, float *in1, float *in2, float *in3, float *in4) -{ - out[0] = in1[0]; - out[1] = in2[0]; - out[2] = in3[0]; - out[3] = in4[0]; -} - -static void node_composit_exec_combrgba(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out) -{ - /* stack order out: 1 rgba channels */ - /* stack order in: 4 value channels */ - - /* input no image? then only color operation */ - if ((in[0]->data==NULL) && (in[1]->data==NULL) && (in[2]->data==NULL) && (in[3]->data==NULL)) { - out[0]->vec[0] = in[0]->vec[0]; - out[0]->vec[1] = in[1]->vec[0]; - out[0]->vec[2] = in[2]->vec[0]; - out[0]->vec[3] = in[3]->vec[0]; - } - else { - /* make output size of first available input image */ - CompBuf *cbuf; - CompBuf *stackbuf; - - /* allocate a CompBuf the size of the first available input */ - if (in[0]->data) cbuf = in[0]->data; - else if (in[1]->data) cbuf = in[1]->data; - else if (in[2]->data) cbuf = in[2]->data; - else cbuf = in[3]->data; - - stackbuf = alloc_compbuf(cbuf->x, cbuf->y, CB_RGBA, 1); /* allocs */ - - composit4_pixel_processor(node, stackbuf, in[0]->data, in[0]->vec, in[1]->data, in[1]->vec, - in[2]->data, in[2]->vec, in[3]->data, in[3]->vec, - do_combrgba, CB_VAL, CB_VAL, CB_VAL, CB_VAL); - - out[0]->data= stackbuf; - } -} - -#endif /* WITH_COMPOSITOR_LEGACY */ - void register_node_type_cmp_combrgba(bNodeTreeType *ttype) { static bNodeType ntype; @@ -162,9 +78,6 @@ void register_node_type_cmp_combrgba(bNodeTreeType *ttype) node_type_base(ttype, &ntype, CMP_NODE_COMBRGBA, "Combine RGBA", NODE_CLASS_CONVERTOR, NODE_OPTIONS); node_type_socket_templates(&ntype, cmp_node_combrgba_in, cmp_node_combrgba_out); node_type_size(&ntype, 80, 40, 140); -#ifdef WITH_COMPOSITOR_LEGACY - node_type_exec(&ntype, node_composit_exec_combrgba); -#endif nodeRegisterType(ttype, &ntype); } diff --git a/source/blender/nodes/composite/nodes/node_composite_sepcombYCCA.c b/source/blender/nodes/composite/nodes/node_composite_sepcombYCCA.c index 982d674708c..a7cc7367c67 100644 --- a/source/blender/nodes/composite/nodes/node_composite_sepcombYCCA.c +++ b/source/blender/nodes/composite/nodes/node_composite_sepcombYCCA.c @@ -46,109 +46,6 @@ static bNodeSocketTemplate cmp_node_sepycca_out[] = { { -1, 0, "" } }; -#ifdef WITH_COMPOSITOR_LEGACY - -static void do_sepycca_601(bNode *UNUSED(node), float *out, float *in) -{ - float y, cb, cr; - - rgb_to_ycc(in[0], in[1], in[2], &y, &cb, &cr, BLI_YCC_ITU_BT601); - - /*divided by 255 to normalize for viewing in */ - out[0] = y/255.0f; - out[1] = cb/255.0f; - out[2] = cr/255.0f; - out[3] = in[3]; -} - -static void do_sepycca_709(bNode *UNUSED(node), float *out, float *in) -{ - float y, cb, cr; - - rgb_to_ycc(in[0], in[1], in[2], &y, &cb, &cr, BLI_YCC_ITU_BT709); - - /*divided by 255 to normalize for viewing in */ - out[0] = y/255.0f; - out[1] = cb/255.0f; - out[2] = cr/255.0f; - out[3] = in[3]; -} - -static void do_sepycca_jfif(bNode *UNUSED(node), float *out, float *in) -{ - float y, cb, cr; - - rgb_to_ycc(in[0], in[1], in[2], &y, &cb, &cr, BLI_YCC_JFIF_0_255); - - /*divided by 255 to normalize for viewing in */ - out[0] = y/255.0f; - out[1] = cb/255.0f; - out[2] = cr/255.0f; - out[3] = in[3]; -} - -static void node_composit_exec_sepycca(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out) -{ - /* input no image? then only color operation */ - if (in[0]->data==NULL) { - float y, cb, cr; - - switch (node->custom1) { - case 1: - rgb_to_ycc(in[0]->vec[0], in[0]->vec[1], in[0]->vec[2], &y, &cb, &cr, BLI_YCC_ITU_BT709); - break; - case 2: - rgb_to_ycc(in[0]->vec[0], in[0]->vec[1], in[0]->vec[2], &y, &cb, &cr, BLI_YCC_JFIF_0_255); - break; - case 0: - default: - rgb_to_ycc(in[0]->vec[0], in[0]->vec[1], in[0]->vec[2], &y, &cb, &cr, BLI_YCC_ITU_BT601); - break; - } - - /*divided by 255 to normalize for viewing in */ - out[0]->vec[0] = y/255.0f; - out[1]->vec[0] = cb/255.0f; - out[2]->vec[0] = cr/255.0f; - out[3]->vec[0] = in[0]->vec[3]; - } - else if ((out[0]->hasoutput) || (out[1]->hasoutput) || (out[2]->hasoutput) || (out[3]->hasoutput)) { - /* make copy of buffer so input buffer doesn't get corrupted */ - CompBuf *cbuf= dupalloc_compbuf(in[0]->data); - CompBuf *cbuf2=typecheck_compbuf(cbuf, CB_RGBA); - - /* convert the RGB stackbuf to an HSV representation */ - switch (node->custom1) { - case 1: - composit1_pixel_processor(node, cbuf2, cbuf2, in[0]->vec, do_sepycca_709, CB_RGBA); - break; - case 2: - composit1_pixel_processor(node, cbuf2, cbuf2, in[0]->vec, do_sepycca_jfif, CB_RGBA); - break; - case 0: - default: - composit1_pixel_processor(node, cbuf2, cbuf2, in[0]->vec, do_sepycca_601, CB_RGBA); - break; - } - - /* separate each of those channels */ - if (out[0]->hasoutput) - out[0]->data= valbuf_from_rgbabuf(cbuf2, CHAN_R); - if (out[1]->hasoutput) - out[1]->data= valbuf_from_rgbabuf(cbuf2, CHAN_G); - if (out[2]->hasoutput) - out[2]->data= valbuf_from_rgbabuf(cbuf2, CHAN_B); - if (out[3]->hasoutput) - out[3]->data= valbuf_from_rgbabuf(cbuf2, CHAN_A); - - /*not used anymore */ - if (cbuf2!=cbuf) - free_compbuf(cbuf2); - free_compbuf(cbuf); - } -} - -#endif /* WITH_COMPOSITOR_LEGACY */ void register_node_type_cmp_sepycca(bNodeTreeType *ttype) { @@ -157,9 +54,6 @@ void register_node_type_cmp_sepycca(bNodeTreeType *ttype) node_type_base(ttype, &ntype, CMP_NODE_SEPYCCA, "Separate YCbCrA", NODE_CLASS_CONVERTOR, NODE_OPTIONS); node_type_socket_templates(&ntype, cmp_node_sepycca_in, cmp_node_sepycca_out); node_type_size(&ntype, 80, 40, 140); -#ifdef WITH_COMPOSITOR_LEGACY - node_type_exec(&ntype, node_composit_exec_sepycca); -#endif nodeRegisterType(ttype, &ntype); } @@ -179,128 +73,6 @@ static bNodeSocketTemplate cmp_node_combycca_out[] = { { -1, 0, "" } }; -#ifdef WITH_COMPOSITOR_LEGACY - -static void do_comb_ycca_601(bNode *UNUSED(node), float *out, float *in1, float *in2, float *in3, float *in4) -{ - float r, g, b; - float y, cb, cr; - - /*need to un-normalize the data*/ - y=in1[0]*255; - cb=in2[0]*255; - cr=in3[0]*255; - - ycc_to_rgb(y, cb, cr, &r, &g, &b, BLI_YCC_ITU_BT601); - - out[0] = r; - out[1] = g; - out[2] = b; - out[3] = in4[0]; -} - -static void do_comb_ycca_709(bNode *UNUSED(node), float *out, float *in1, float *in2, float *in3, float *in4) -{ - float r, g, b; - float y, cb, cr; - - /*need to un-normalize the data*/ - y=in1[0]*255; - cb=in2[0]*255; - cr=in3[0]*255; - - ycc_to_rgb(y, cb, cr, &r, &g, &b, BLI_YCC_ITU_BT709); - - out[0] = r; - out[1] = g; - out[2] = b; - out[3] = in4[0]; -} - -static void do_comb_ycca_jfif(bNode *UNUSED(node), float *out, float *in1, float *in2, float *in3, float *in4) -{ - float r, g, b; - float y, cb, cr; - - /*need to un-normalize the data*/ - y=in1[0]*255; - cb=in2[0]*255; - cr=in3[0]*255; - - ycc_to_rgb(y, cb, cr, &r, &g, &b, BLI_YCC_JFIF_0_255); - - out[0] = r; - out[1] = g; - out[2] = b; - out[3] = in4[0]; -} - -static void node_composit_exec_combycca(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out) -{ - /* stack order out: 1 ycca channels */ - /* stack order in: 4 value channels */ - - /* input no image? then only color operation */ - if ((in[0]->data==NULL) && (in[1]->data==NULL) && (in[2]->data==NULL) && (in[3]->data==NULL)) { - float y = in[0]->vec[0] * 255; - float cb = in[1]->vec[0] * 255; - float cr = in[2]->vec[0] * 255; - - switch (node->custom1) { - case 1: - ycc_to_rgb(y, cb, cr, &out[0]->vec[0], &out[0]->vec[1], &out[0]->vec[2], BLI_YCC_ITU_BT709); - break; - case 2: - ycc_to_rgb(y, cb, cr, &out[0]->vec[0], &out[0]->vec[1], &out[0]->vec[2], BLI_YCC_JFIF_0_255); - break; - case 0: - default: - ycc_to_rgb(y, cb, cr, &out[0]->vec[0], &out[0]->vec[1], &out[0]->vec[2], BLI_YCC_ITU_BT601); - break; - } - - out[0]->vec[3] = in[3]->vec[0]; - } - else { - /* make output size of first available input image */ - CompBuf *cbuf; - CompBuf *stackbuf; - - /* allocate a CompBuf the size of the first available input */ - if (in[0]->data) cbuf = in[0]->data; - else if (in[1]->data) cbuf = in[1]->data; - else if (in[2]->data) cbuf = in[2]->data; - else cbuf = in[3]->data; - - stackbuf = alloc_compbuf(cbuf->x, cbuf->y, CB_RGBA, 1); /* allocs */ - - - switch (node->custom1) { - case 1: - composit4_pixel_processor(node, stackbuf, in[0]->data, in[0]->vec, in[1]->data, in[1]->vec, - in[2]->data, in[2]->vec, in[3]->data, in[3]->vec, - do_comb_ycca_709, CB_VAL, CB_VAL, CB_VAL, CB_VAL); - break; - - case 2: - composit4_pixel_processor(node, stackbuf, in[0]->data, in[0]->vec, in[1]->data, in[1]->vec, - in[2]->data, in[2]->vec, in[3]->data, in[3]->vec, - do_comb_ycca_jfif, CB_VAL, CB_VAL, CB_VAL, CB_VAL); - break; - case 0: - default: - composit4_pixel_processor(node, stackbuf, in[0]->data, in[0]->vec, in[1]->data, in[1]->vec, - in[2]->data, in[2]->vec, in[3]->data, in[3]->vec, - do_comb_ycca_601, CB_VAL, CB_VAL, CB_VAL, CB_VAL); - break; - } - - out[0]->data= stackbuf; - } -} - -#endif /* WITH_COMPOSITOR_LEGACY */ - void register_node_type_cmp_combycca(bNodeTreeType *ttype) { static bNodeType ntype; @@ -308,9 +80,6 @@ void register_node_type_cmp_combycca(bNodeTreeType *ttype) node_type_base(ttype, &ntype, CMP_NODE_COMBYCCA, "Combine YCbCrA", NODE_CLASS_CONVERTOR, NODE_OPTIONS); node_type_socket_templates(&ntype, cmp_node_combycca_in, cmp_node_combycca_out); node_type_size(&ntype, 80, 40, 140); -#ifdef WITH_COMPOSITOR_LEGACY - node_type_exec(&ntype, node_composit_exec_combycca); -#endif nodeRegisterType(ttype, &ntype); } diff --git a/source/blender/nodes/composite/nodes/node_composite_sepcombYUVA.c b/source/blender/nodes/composite/nodes/node_composite_sepcombYUVA.c index 0a9575971b4..88edf7ec6b0 100644 --- a/source/blender/nodes/composite/nodes/node_composite_sepcombYUVA.c +++ b/source/blender/nodes/composite/nodes/node_composite_sepcombYUVA.c @@ -46,63 +46,6 @@ static bNodeSocketTemplate cmp_node_sepyuva_out[] = { { -1, 0, "" } }; -#ifdef WITH_COMPOSITOR_LEGACY - -static void do_sepyuva(bNode *UNUSED(node), float *out, float *in) -{ - float y, u, v; - - rgb_to_yuv(in[0], in[1], in[2], &y, &u, &v); - - out[0] = y; - out[1] = u; - out[2] = v; - out[3] = in[3]; -} - -static void node_composit_exec_sepyuva(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out) -{ - /* stack order out: bw channels */ - /* stack order in: col */ - - /* input no image? then only color operation */ - if (in[0]->data==NULL) { - float y, u, v; - - rgb_to_yuv(in[0]->vec[0], in[0]->vec[1], in[0]->vec[2], &y, &u, &v); - - out[0]->vec[0] = y; - out[1]->vec[0] = u; - out[2]->vec[0] = v; - out[3]->vec[0] = in[0]->vec[3]; - } - else if ((out[0]->hasoutput) || (out[1]->hasoutput) || (out[2]->hasoutput) || (out[3]->hasoutput)) { - /* make copy of buffer so input image doesn't get corrupted */ - CompBuf *cbuf= dupalloc_compbuf(in[0]->data); - CompBuf *cbuf2=typecheck_compbuf(cbuf, CB_RGBA); - - /* convert the RGB stackbuf to an YUV representation */ - composit1_pixel_processor(node, cbuf2, cbuf2, in[0]->vec, do_sepyuva, CB_RGBA); - - /* separate each of those channels */ - if (out[0]->hasoutput) - out[0]->data= valbuf_from_rgbabuf(cbuf2, CHAN_R); - if (out[1]->hasoutput) - out[1]->data= valbuf_from_rgbabuf(cbuf2, CHAN_G); - if (out[2]->hasoutput) - out[2]->data= valbuf_from_rgbabuf(cbuf2, CHAN_B); - if (out[3]->hasoutput) - out[3]->data= valbuf_from_rgbabuf(cbuf2, CHAN_A); - - /*not used anymore */ - if (cbuf2!=cbuf) - free_compbuf(cbuf2); - free_compbuf(cbuf); - } -} - -#endif /* WITH_COMPOSITOR_LEGACY */ - void register_node_type_cmp_sepyuva(bNodeTreeType *ttype) { @@ -111,9 +54,6 @@ void register_node_type_cmp_sepyuva(bNodeTreeType *ttype) node_type_base(ttype, &ntype, CMP_NODE_SEPYUVA, "Separate YUVA", NODE_CLASS_CONVERTOR, 0); node_type_socket_templates(&ntype, cmp_node_sepyuva_in, cmp_node_sepyuva_out); node_type_size(&ntype, 80, 40, 140); -#ifdef WITH_COMPOSITOR_LEGACY - node_type_exec(&ntype, node_composit_exec_sepyuva); -#endif nodeRegisterType(ttype, &ntype); } @@ -133,54 +73,6 @@ static bNodeSocketTemplate cmp_node_combyuva_out[] = { { -1, 0, "" } }; -#ifdef WITH_COMPOSITOR_LEGACY - -static void do_comb_yuva(bNode *UNUSED(node), float *out, float *in1, float *in2, float *in3, float *in4) -{ - float r, g, b; - yuv_to_rgb(in1[0], in2[0], in3[0], &r, &g, &b); - - out[0] = r; - out[1] = g; - out[2] = b; - out[3] = in4[0]; -} - -static void node_composit_exec_combyuva(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out) -{ - /* stack order out: 1 rgba channels */ - /* stack order in: 4 value channels */ - - /* input no image? then only color operation */ - if ((in[0]->data==NULL) && (in[1]->data==NULL) && (in[2]->data==NULL) && (in[3]->data==NULL)) { - out[0]->vec[0] = in[0]->vec[0]; - out[0]->vec[1] = in[1]->vec[0]; - out[0]->vec[2] = in[2]->vec[0]; - out[0]->vec[3] = in[3]->vec[0]; - } - else { - /* make output size of first available input image */ - CompBuf *cbuf; - CompBuf *stackbuf; - - /* allocate a CompBuf the size of the first available input */ - if (in[0]->data) cbuf = in[0]->data; - else if (in[1]->data) cbuf = in[1]->data; - else if (in[2]->data) cbuf = in[2]->data; - else cbuf = in[3]->data; - - stackbuf = alloc_compbuf(cbuf->x, cbuf->y, CB_RGBA, 1); /* allocs */ - - composit4_pixel_processor(node, stackbuf, in[0]->data, in[0]->vec, in[1]->data, in[1]->vec, - in[2]->data, in[2]->vec, in[3]->data, in[3]->vec, - do_comb_yuva, CB_VAL, CB_VAL, CB_VAL, CB_VAL); - - out[0]->data= stackbuf; - } -} - -#endif /* WITH_COMPOSITOR_LEGACY */ - void register_node_type_cmp_combyuva(bNodeTreeType *ttype) { static bNodeType ntype; @@ -188,9 +80,6 @@ void register_node_type_cmp_combyuva(bNodeTreeType *ttype) node_type_base(ttype, &ntype, CMP_NODE_COMBYUVA, "Combine YUVA", NODE_CLASS_CONVERTOR, NODE_OPTIONS); node_type_socket_templates(&ntype, cmp_node_combyuva_in, cmp_node_combyuva_out); node_type_size(&ntype, 80, 40, 140); -#ifdef WITH_COMPOSITOR_LEGACY - node_type_exec(&ntype, node_composit_exec_combyuva); -#endif nodeRegisterType(ttype, &ntype); } diff --git a/source/blender/nodes/composite/nodes/node_composite_setalpha.c b/source/blender/nodes/composite/nodes/node_composite_setalpha.c index 59c104869fe..0cec19b15af 100644 --- a/source/blender/nodes/composite/nodes/node_composite_setalpha.c +++ b/source/blender/nodes/composite/nodes/node_composite_setalpha.c @@ -43,41 +43,6 @@ static bNodeSocketTemplate cmp_node_setalpha_out[] = { { -1, 0, "" } }; -#ifdef WITH_COMPOSITOR_LEGACY - -static void node_composit_exec_setalpha(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out) -{ - /* stack order out: RGBA image */ - /* stack order in: col, alpha */ - - /* input no image? then only color operation */ - if (in[0]->data==NULL && in[1]->data==NULL) { - out[0]->vec[0] = in[0]->vec[0]; - out[0]->vec[1] = in[0]->vec[1]; - out[0]->vec[2] = in[0]->vec[2]; - out[0]->vec[3] = in[1]->vec[0]; - } - else { - /* make output size of input image */ - CompBuf *cbuf= in[0]->data?in[0]->data:in[1]->data; - CompBuf *stackbuf= alloc_compbuf(cbuf->x, cbuf->y, CB_RGBA, 1); /* allocs */ - - if (in[1]->data==NULL && in[1]->vec[0]==1.0f) { - /* pass on image */ - composit1_pixel_processor(node, stackbuf, in[0]->data, in[0]->vec, do_copy_rgb, CB_RGBA); - } - else { - /* send an compbuf or a value to set as alpha - composit2_pixel_processor handles choosing the right one */ - composit2_pixel_processor(node, stackbuf, in[0]->data, in[0]->vec, in[1]->data, in[1]->vec, do_copy_a_rgba, CB_RGBA, CB_VAL); - } - - out[0]->data= stackbuf; - } -} - -#endif /* WITH_COMPOSITOR_LEGACY */ - - void register_node_type_cmp_setalpha(bNodeTreeType *ttype) { static bNodeType ntype; @@ -85,9 +50,6 @@ void register_node_type_cmp_setalpha(bNodeTreeType *ttype) node_type_base(ttype, &ntype, CMP_NODE_SETALPHA, "Set Alpha", NODE_CLASS_CONVERTOR, NODE_OPTIONS); node_type_socket_templates(&ntype, cmp_node_setalpha_in, cmp_node_setalpha_out); node_type_size(&ntype, 120, 40, 140); -#ifdef WITH_COMPOSITOR_LEGACY - node_type_exec(&ntype, node_composit_exec_setalpha); -#endif nodeRegisterType(ttype, &ntype); } diff --git a/source/blender/nodes/composite/nodes/node_composite_splitViewer.c b/source/blender/nodes/composite/nodes/node_composite_splitViewer.c index 523f1dee406..3f4c3d67e2c 100644 --- a/source/blender/nodes/composite/nodes/node_composite_splitViewer.c +++ b/source/blender/nodes/composite/nodes/node_composite_splitViewer.c @@ -39,110 +39,6 @@ static bNodeSocketTemplate cmp_node_splitviewer_in[] = { { -1, 0, "" } }; -#ifdef WITH_COMPOSITOR_LEGACY - -static void do_copy_split_rgba(bNode *UNUSED(node), float *out, float *in1, float *in2, float *fac) -{ - if (*fac==0.0f) { - copy_v4_v4(out, in1); - } - else { - copy_v4_v4(out, in2); - } -} - -static void node_composit_exec_splitviewer(void *data, bNode *node, bNodeStack **in, bNodeStack **UNUSED(out)) -{ - /* image assigned to output */ - /* stack order input sockets: image image */ - - if (in[0]->data==NULL || in[1]->data==NULL) - return; - - if (node->id && (node->flag & NODE_DO_OUTPUT)) { /* only one works on out */ - Image *ima= (Image *)node->id; - RenderData *rd= data; - ImBuf *ibuf; - CompBuf *cbuf, *buf1, *buf2, *mask; - int x, y; - float offset; - void *lock; - - buf1= typecheck_compbuf(in[0]->data, CB_RGBA); - buf2= typecheck_compbuf(in[1]->data, CB_RGBA); - - BKE_image_user_frame_calc(node->storage, rd->cfra, 0); - - /* always returns for viewer image, but we check nevertheless */ - ibuf= BKE_image_acquire_ibuf(ima, node->storage, &lock); - if (ibuf==NULL) { - printf("node_composit_exec_viewer error\n"); - BKE_image_release_ibuf(ima, ibuf, lock); - return; - } - - /* free all in ibuf */ - imb_freerectImBuf(ibuf); - imb_freerectfloatImBuf(ibuf); - IMB_freezbuffloatImBuf(ibuf); - - /* make ibuf, and connect to ima */ - ibuf->x= buf1->x; - ibuf->y= buf1->y; - imb_addrectfloatImBuf(ibuf); - - ima->ok= IMA_OK_LOADED; - - /* output buf */ - cbuf= alloc_compbuf(buf1->x, buf1->y, CB_RGBA, 0); /* no alloc*/ - cbuf->rect= ibuf->rect_float; - - /* mask buf */ - mask= alloc_compbuf(buf1->x, buf1->y, CB_VAL, 1); - - - /* Check which offset mode is selected and limit offset if needed */ - if (node->custom2 == 0) { - offset = buf1->x / 100.0f * node->custom1; - CLAMP(offset, 0, buf1->x); - } - else { - offset = buf1->y / 100.0f * node->custom1; - CLAMP(offset, 0, buf1->y); - } - - if (node->custom2 == 0) { - for (y=0; y<buf1->y; y++) { - float *fac= mask->rect + y*buf1->x; - for (x=offset; x>0; x--, fac++) - *fac= 1.0f; - } - } - else { - for (y=0; y<offset; y++) { - float *fac= mask->rect + y*buf1->x; - for (x=buf1->x; x>0; x--, fac++) - *fac= 1.0f; - } - } - - composit3_pixel_processor(node, cbuf, buf1, in[0]->vec, buf2, in[1]->vec, mask, NULL, do_copy_split_rgba, CB_RGBA, CB_RGBA, CB_VAL); - - BKE_image_release_ibuf(ima, ibuf, lock); - - generate_preview(data, node, cbuf); - free_compbuf(cbuf); - free_compbuf(mask); - - if (in[0]->data != buf1) - free_compbuf(buf1); - if (in[1]->data != buf2) - free_compbuf(buf2); - } -} - -#endif /* WITH_COMPOSITOR_LEGACY */ - static void node_composit_init_splitviewer(bNodeTree *UNUSED(ntree), bNode *node, bNodeTemplate *UNUSED(ntemp)) { ImageUser *iuser= MEM_callocN(sizeof(ImageUser), "node image user"); @@ -162,9 +58,6 @@ void register_node_type_cmp_splitviewer(bNodeTreeType *ttype) node_type_size(&ntype, 140, 100, 320); node_type_init(&ntype, node_composit_init_splitviewer); node_type_storage(&ntype, "ImageUser", node_free_standard_storage, node_copy_standard_storage); -#ifdef WITH_COMPOSITOR_LEGACY - node_type_exec(&ntype, node_composit_exec_splitviewer); -#endif /* Do not allow muting for this node. */ node_type_internal_links(&ntype, NULL); diff --git a/source/blender/nodes/composite/nodes/node_composite_stabilize2d.c b/source/blender/nodes/composite/nodes/node_composite_stabilize2d.c index 1787e075a14..964e54eb862 100644 --- a/source/blender/nodes/composite/nodes/node_composite_stabilize2d.c +++ b/source/blender/nodes/composite/nodes/node_composite_stabilize2d.c @@ -45,32 +45,6 @@ static bNodeSocketTemplate cmp_node_stabilize2d_out[] = { { -1, 0, "" } }; -#ifdef WITH_COMPOSITOR_LEGACY - -static void node_composit_exec_stabilize2d(void *data, bNode *node, bNodeStack **in, bNodeStack **out) -{ - if (in[0]->data && node->id) { - RenderData *rd = data; - MovieClip *clip = (MovieClip *)node->id; - CompBuf *cbuf = typecheck_compbuf(in[0]->data, CB_RGBA); - CompBuf *stackbuf; - float loc[2], scale, angle; - int clip_framenr = BKE_movieclip_remap_scene_to_clip_frame(clip, rd->cfra); - - BKE_tracking_stabilization_data_get(&clip->tracking, clip_framenr, cbuf->x, cbuf->y, loc, &scale, &angle); - - stackbuf = node_composit_transform(cbuf, loc[0], loc[1], angle, scale, node->custom1); - - /* pass on output and free */ - out[0]->data = stackbuf; - - if (cbuf != in[0]->data) - free_compbuf(cbuf); - } -} - -#endif /* WITH_COMPOSITOR_LEGACY */ - void register_node_type_cmp_stabilize2d(bNodeTreeType *ttype) { static bNodeType ntype; @@ -78,9 +52,6 @@ void register_node_type_cmp_stabilize2d(bNodeTreeType *ttype) node_type_base(ttype, &ntype, CMP_NODE_STABILIZE2D, "Stabilize 2D", NODE_CLASS_DISTORT, NODE_OPTIONS); node_type_socket_templates(&ntype, cmp_node_stabilize2d_in, cmp_node_stabilize2d_out); node_type_size(&ntype, 140, 100, 320); -#ifdef WITH_COMPOSITOR_LEGACY - node_type_exec(&ntype, node_composit_exec_stabilize2d); -#endif nodeRegisterType(ttype, &ntype); } diff --git a/source/blender/nodes/composite/nodes/node_composite_texture.c b/source/blender/nodes/composite/nodes/node_composite_texture.c index b6518c48638..17b5720c7ad 100644 --- a/source/blender/nodes/composite/nodes/node_composite_texture.c +++ b/source/blender/nodes/composite/nodes/node_composite_texture.c @@ -44,108 +44,6 @@ static bNodeSocketTemplate cmp_node_texture_out[] = { { -1, 0, "" } }; -#ifdef WITH_COMPOSITOR_LEGACY - -/* called without rect allocated */ -static void texture_procedural(CompBuf *cbuf, float *out, float xco, float yco) -{ - bNode *node= cbuf->node; - TexResult texres= {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0, NULL}; - float vec[3], *size, nor[3] = {0.0f, 0.0f, 0.0f}, col[4]; - int retval, type= cbuf->procedural_type; - - size= cbuf->procedural_size; - - vec[0] = size[0]*(xco + cbuf->procedural_offset[0]); - vec[1] = size[1]*(yco + cbuf->procedural_offset[1]); - vec[2] = size[2]*cbuf->procedural_offset[2]; - - retval= multitex_ext((Tex *)node->id, vec, NULL, NULL, 0, &texres); - - if (type==CB_VAL) { - if (texres.talpha) - col[0] = texres.ta; - else - col[0] = texres.tin; - } - else if (type==CB_RGBA) { - if (texres.talpha) - col[3] = texres.ta; - else - col[3] = texres.tin; - - if ((retval & TEX_RGB)) { - copy_v3_v3(col, &texres.tr); - } - else { - copy_v3_fl(col, col[3]); - } - } - else { - copy_v3_v3(col, nor); - } - - typecheck_compbuf_color(out, col, cbuf->type, cbuf->procedural_type); -} - -/* texture node outputs get a small rect, to make sure all other nodes accept it */ -/* only the pixel-processor nodes do something with it though */ -static void node_composit_exec_texture(void *data, bNode *node, bNodeStack **in, bNodeStack **out) -{ - /* outputs: value, color, normal */ - - if (node->id) { - RenderData *rd= data; - short sizex, sizey; - - /* first make the preview image */ - CompBuf *prevbuf= alloc_compbuf(140, 140, CB_RGBA, 1); /* alloc */ - - prevbuf->rect_procedural= texture_procedural; - prevbuf->node= node; - copy_v3_v3(prevbuf->procedural_offset, in[0]->vec); - copy_v3_v3(prevbuf->procedural_size, in[1]->vec); - prevbuf->procedural_type= CB_RGBA; - composit1_pixel_processor(node, prevbuf, prevbuf, out[0]->vec, do_copy_rgba, CB_RGBA); - - generate_preview(data, node, prevbuf); - free_compbuf(prevbuf); - - /* texture procedural buffer type doesnt work well, we now render a buffer in scene size */ - sizex = (rd->size*rd->xsch)/100; - sizey = (rd->size*rd->ysch)/100; - - if (out[0]->hasoutput) { - CompBuf *stackbuf= alloc_compbuf(sizex, sizey, CB_VAL, 1); /* alloc */ - - stackbuf->rect_procedural= texture_procedural; - stackbuf->node= node; - copy_v3_v3(stackbuf->procedural_offset, in[0]->vec); - copy_v3_v3(stackbuf->procedural_size, in[1]->vec); - stackbuf->procedural_type= CB_VAL; - composit1_pixel_processor(node, stackbuf, stackbuf, out[0]->vec, do_copy_value, CB_VAL); - stackbuf->rect_procedural= NULL; - - out[0]->data= stackbuf; - } - if (out[1]->hasoutput) { - CompBuf *stackbuf= alloc_compbuf(sizex, sizey, CB_RGBA, 1); /* alloc */ - - stackbuf->rect_procedural= texture_procedural; - stackbuf->node= node; - copy_v3_v3(stackbuf->procedural_offset, in[0]->vec); - copy_v3_v3(stackbuf->procedural_size, in[1]->vec); - stackbuf->procedural_type= CB_RGBA; - composit1_pixel_processor(node, stackbuf, stackbuf, out[0]->vec, do_copy_rgba, CB_RGBA); - stackbuf->rect_procedural= NULL; - - out[1]->data= stackbuf; - } - } -} - -#endif /* WITH_COMPOSITOR_LEGACY */ - void register_node_type_cmp_texture(bNodeTreeType *ttype) { static bNodeType ntype; @@ -153,9 +51,6 @@ void register_node_type_cmp_texture(bNodeTreeType *ttype) node_type_base(ttype, &ntype, CMP_NODE_TEXTURE, "Texture", NODE_CLASS_INPUT, NODE_OPTIONS|NODE_PREVIEW); node_type_socket_templates(&ntype, cmp_node_texture_in, cmp_node_texture_out); node_type_size(&ntype, 120, 80, 240); -#ifdef WITH_COMPOSITOR_LEGACY - node_type_exec(&ntype, node_composit_exec_texture); -#endif nodeRegisterType(ttype, &ntype); } diff --git a/source/blender/nodes/composite/nodes/node_composite_tonemap.c b/source/blender/nodes/composite/nodes/node_composite_tonemap.c index 00b1a5514dc..94492431c9f 100644 --- a/source/blender/nodes/composite/nodes/node_composite_tonemap.c +++ b/source/blender/nodes/composite/nodes/node_composite_tonemap.c @@ -41,114 +41,6 @@ static bNodeSocketTemplate cmp_node_tonemap_out[] = { { -1, 0, "" } }; -#ifdef WITH_COMPOSITOR_LEGACY - -static float avgLogLum(CompBuf *src, float* auto_key, float* Lav, float* Cav) -{ - float lsum = 0; - int p = src->x*src->y; - fRGB* bc = (fRGB*)src->rect; - float avl, maxl = -1e10f, minl = 1e10f; - const float sc = 1.f/(src->x*src->y); - *Lav = 0.f; - while (p--) { - float L = rgb_to_luma_y(bc[0]); - *Lav += L; - add_v3_v3(Cav, bc[0]); - lsum += (float)log((double)MAX2(L, 0.0) + 1e-5); - maxl = (L > maxl) ? L : maxl; - minl = (L < minl) ? L : minl; - bc++; - } - *Lav *= sc; - mul_v3_fl(Cav, sc); - maxl = log((double)maxl + 1e-5); minl = log((double)minl + 1e-5f); avl = lsum*sc; - *auto_key = (maxl > minl) ? ((maxl - avl) / (maxl - minl)) : 1.f; - return exp((double)avl); -} - - -static void tonemap(NodeTonemap* ntm, CompBuf* dst, CompBuf* src) -{ - int x, y; - float dr, dg, db, al, igm = (ntm->gamma==0.f) ? 1 : (1.f / ntm->gamma); - float auto_key, Lav, Cav[3] = {0, 0, 0}; - - al = avgLogLum(src, &auto_key, &Lav, Cav); - al = (al == 0.f) ? 0.f : (ntm->key / al); - - if (ntm->type == 1) { - // Reinhard/Devlin photoreceptor - const float f = exp((double)-ntm->f); - const float m = (ntm->m > 0.f) ? ntm->m : (0.3f + 0.7f*pow((double)auto_key, 1.4)); - const float ic = 1.f - ntm->c, ia = 1.f - ntm->a; - if (ntm->m == 0.f) printf("tonemap node, M: %g\n", m); - for (y=0; y<src->y; ++y) { - fRGB* sp = (fRGB*)&src->rect[y*src->x*src->type]; - fRGB* dp = (fRGB*)&dst->rect[y*src->x*src->type]; - for (x=0; x<src->x; ++x) { - const float L = rgb_to_luma_y(sp[x]); - float I_l = sp[x][0] + ic*(L - sp[x][0]); - float I_g = Cav[0] + ic*(Lav - Cav[0]); - float I_a = I_l + ia*(I_g - I_l); - dp[x][0] /= (dp[x][0] + pow((double)f*I_a, (double)m)); - I_l = sp[x][1] + ic*(L - sp[x][1]); - I_g = Cav[1] + ic*(Lav - Cav[1]); - I_a = I_l + ia*(I_g - I_l); - dp[x][1] /= (dp[x][1] + pow((double)f*I_a, (double)m)); - I_l = sp[x][2] + ic*(L - sp[x][2]); - I_g = Cav[2] + ic*(Lav - Cav[2]); - I_a = I_l + ia*(I_g - I_l); - dp[x][2] /= (dp[x][2] + pow((double)f*I_a, (double)m)); - } - } - return; - } - - // Reinhard simple photographic tm (simplest, not using whitepoint var) - for (y=0; y<src->y; y++) { - fRGB* sp = (fRGB*)&src->rect[y*src->x*src->type]; - fRGB* dp = (fRGB*)&dst->rect[y*src->x*src->type]; - for (x=0; x<src->x; x++) { - copy_v4_v4(dp[x], sp[x]); - mul_v3_fl(dp[x], al); - dr = dp[x][0] + ntm->offset; - dg = dp[x][1] + ntm->offset; - db = dp[x][2] + ntm->offset; - dp[x][0] /= ((dr == 0.f) ? 1.f : dr); - dp[x][1] /= ((dg == 0.f) ? 1.f : dg); - dp[x][2] /= ((db == 0.f) ? 1.f : db); - if (igm != 0.f) { - dp[x][0] = pow((double)MAX2(dp[x][0], 0.0), igm); - dp[x][1] = pow((double)MAX2(dp[x][1], 0.0), igm); - dp[x][2] = pow((double)MAX2(dp[x][2], 0.0), igm); - } - } - } -} - - -static void node_composit_exec_tonemap(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out) -{ - CompBuf *new, *img = in[0]->data; - - if ((img==NULL) || (out[0]->hasoutput==0)) return; - - if (img->type != CB_RGBA) - img = typecheck_compbuf(img, CB_RGBA); - - new = dupalloc_compbuf(img); - - tonemap(node->storage, new, img); - - out[0]->data = new; - - if (img!=in[0]->data) - free_compbuf(img); -} - -#endif /* WITH_COMPOSITOR_LEGACY */ - static void node_composit_init_tonemap(bNodeTree *UNUSED(ntree), bNode *node, bNodeTemplate *UNUSED(ntemp)) { NodeTonemap *ntm = MEM_callocN(sizeof(NodeTonemap), "node tonemap data"); @@ -174,9 +66,6 @@ void register_node_type_cmp_tonemap(bNodeTreeType *ttype) node_type_size(&ntype, 150, 120, 200); node_type_init(&ntype, node_composit_init_tonemap); node_type_storage(&ntype, "NodeTonemap", node_free_standard_storage, node_copy_standard_storage); -#ifdef WITH_COMPOSITOR_LEGACY - node_type_exec(&ntype, node_composit_exec_tonemap); -#endif nodeRegisterType(ttype, &ntype); } diff --git a/source/blender/nodes/composite/nodes/node_composite_trackpos.c b/source/blender/nodes/composite/nodes/node_composite_trackpos.c index 4364ca61ba1..41dc5633ee5 100644 --- a/source/blender/nodes/composite/nodes/node_composite_trackpos.c +++ b/source/blender/nodes/composite/nodes/node_composite_trackpos.c @@ -39,15 +39,6 @@ static bNodeSocketTemplate cmp_node_trackpos_out[] = { { -1, 0, "" } }; -#ifdef WITH_COMPOSITOR_LEGACY - -static void node_composit_exec_trackpos(void *UNUSED(data), bNode *UNUSED(node), bNodeStack **UNUSED(in), bNodeStack **UNUSED(out)) -{ - /* pass */ -} - -#endif /* WITH_COMPOSITOR_LEGACY */ - static void init(bNodeTree *UNUSED(ntree), bNode *node, bNodeTemplate *UNUSED(ntemp)) { NodeTrackPosData *data = MEM_callocN(sizeof(NodeTrackPosData), "node track position data"); @@ -64,9 +55,6 @@ void register_node_type_cmp_trackpos(bNodeTreeType *ttype) node_type_size(&ntype, 120, 80, 300); node_type_init(&ntype, init); node_type_storage(&ntype, "NodeTrackPosData", node_free_standard_storage, node_copy_standard_storage); -#ifdef WITH_COMPOSITOR_LEGACY - node_type_exec(&ntype, node_composit_exec_trackpos); -#endif nodeRegisterType(ttype, &ntype); } diff --git a/source/blender/nodes/composite/nodes/node_composite_transform.c b/source/blender/nodes/composite/nodes/node_composite_transform.c index d6bb545cd5c..f51e49328ab 100644 --- a/source/blender/nodes/composite/nodes/node_composite_transform.c +++ b/source/blender/nodes/composite/nodes/node_composite_transform.c @@ -48,89 +48,6 @@ static bNodeSocketTemplate cmp_node_transform_out[] = { { -1, 0, "" } }; -#ifdef WITH_COMPOSITOR_LEGACY - -CompBuf* node_composit_transform(CompBuf *cbuf, float x, float y, float angle, float scale, int filter_type) -{ - CompBuf *stackbuf = alloc_compbuf(cbuf->x, cbuf->y, CB_RGBA, TRUE); - ImBuf *ibuf, *obuf; - float mat[4][4], lmat[4][4], rmat[4][4], smat[4][4], cmat[4][4], icmat[4][4]; - float svec[3] = {scale, scale, scale}, loc[2] = {x, y}; - - unit_m4(rmat); - unit_m4(lmat); - unit_m4(smat); - unit_m4(cmat); - - /* image center as rotation center */ - cmat[3][0] = (float)cbuf->x/2.0f; - cmat[3][1] = (float)cbuf->y/2.0f; - invert_m4_m4(icmat, cmat); - - size_to_mat4(smat, svec); /* scale matrix */ - add_v2_v2(lmat[3], loc); /* tranlation matrix */ - rotate_m4(rmat, 'Z', angle); /* rotation matrix */ - - /* compose transformation matrix */ - mul_serie_m4(mat, lmat, cmat, rmat, smat, icmat, NULL, NULL, NULL); - - invert_m4(mat); - - ibuf = IMB_allocImBuf(cbuf->x, cbuf->y, 32, 0); - obuf = IMB_allocImBuf(stackbuf->x, stackbuf->y, 32, 0); - - if (ibuf && obuf) { - int i, j; - - ibuf->rect_float = cbuf->rect; - obuf->rect_float = stackbuf->rect; - - for (j = 0; j < cbuf->y; j++) { - for (i = 0; i < cbuf->x; i++) { - float vec[3] = {i, j, 0}; - - mul_v3_m4v3(vec, mat, vec); - - switch (filter_type) { - case 0: - nearest_interpolation(ibuf, obuf, vec[0], vec[1], i, j); - break; - case 1: - bilinear_interpolation(ibuf, obuf, vec[0], vec[1], i, j); - break; - case 2: - bicubic_interpolation(ibuf, obuf, vec[0], vec[1], i, j); - break; - } - } - } - - IMB_freeImBuf(ibuf); - IMB_freeImBuf(obuf); - } - - /* pass on output and free */ - return stackbuf; -} - -static void node_composit_exec_transform(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out) -{ - if (in[0]->data) { - CompBuf *cbuf = typecheck_compbuf(in[0]->data, CB_RGBA); - CompBuf *stackbuf; - - stackbuf = node_composit_transform(cbuf, in[1]->vec[0], in[2]->vec[0], in[3]->vec[0], in[4]->vec[0], node->custom1); - - /* pass on output and free */ - out[0]->data = stackbuf; - - if (cbuf != in[0]->data) - free_compbuf(cbuf); - } -} - -#endif /* WITH_COMPOSITOR_LEGACY */ - void register_node_type_cmp_transform(bNodeTreeType *ttype) { static bNodeType ntype; @@ -138,9 +55,6 @@ void register_node_type_cmp_transform(bNodeTreeType *ttype) node_type_base(ttype, &ntype, CMP_NODE_TRANSFORM, "Transform", NODE_CLASS_DISTORT, NODE_OPTIONS); node_type_socket_templates(&ntype, cmp_node_transform_in, cmp_node_transform_out); node_type_size(&ntype, 140, 100, 320); -#ifdef WITH_COMPOSITOR_LEGACY - node_type_exec(&ntype, node_composit_exec_transform); -#endif nodeRegisterType(ttype, &ntype); } diff --git a/source/blender/nodes/composite/nodes/node_composite_translate.c b/source/blender/nodes/composite/nodes/node_composite_translate.c index 1c2963a2f08..7c7c6304d27 100644 --- a/source/blender/nodes/composite/nodes/node_composite_translate.c +++ b/source/blender/nodes/composite/nodes/node_composite_translate.c @@ -46,23 +46,6 @@ static bNodeSocketTemplate cmp_node_translate_out[] = { { -1, 0, "" } }; -#ifdef WITH_COMPOSITOR_LEGACY - -static void node_composit_exec_translate(void *UNUSED(data), bNode *UNUSED(node), bNodeStack **in, bNodeStack **out) -{ - if (in[0]->data) { - CompBuf *cbuf= in[0]->data; - CompBuf *stackbuf= pass_on_compbuf(cbuf); - - stackbuf->xof+= (int)floor(in[1]->vec[0]); - stackbuf->yof+= (int)floor(in[2]->vec[0]); - - out[0]->data= stackbuf; - } -} - -#endif /* WITH_COMPOSITOR_LEGACY */ - void register_node_type_cmp_translate(bNodeTreeType *ttype) { static bNodeType ntype; @@ -70,9 +53,6 @@ void register_node_type_cmp_translate(bNodeTreeType *ttype) node_type_base(ttype, &ntype, CMP_NODE_TRANSLATE, "Translate", NODE_CLASS_DISTORT, NODE_OPTIONS); node_type_socket_templates(&ntype, cmp_node_translate_in, cmp_node_translate_out); node_type_size(&ntype, 140, 100, 320); -#ifdef WITH_COMPOSITOR_LEGACY - node_type_exec(&ntype, node_composit_exec_translate); -#endif nodeRegisterType(ttype, &ntype); } diff --git a/source/blender/nodes/composite/nodes/node_composite_valToRgb.c b/source/blender/nodes/composite/nodes/node_composite_valToRgb.c index 5c111998b18..c40880cc421 100644 --- a/source/blender/nodes/composite/nodes/node_composite_valToRgb.c +++ b/source/blender/nodes/composite/nodes/node_composite_valToRgb.c @@ -44,44 +44,6 @@ static bNodeSocketTemplate cmp_node_valtorgb_out[] = { { -1, 0, "" } }; -#ifdef WITH_COMPOSITOR_LEGACY - -static void do_colorband_composit(bNode *node, float *out, float *in) -{ - do_colorband(node->storage, in[0], out); -} - -static void node_composit_exec_valtorgb(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out) -{ - /* stack order in: fac */ - /* stack order out: col, alpha */ - - if (out[0]->hasoutput==0 && out[1]->hasoutput==0) - return; - - if (node->storage) { - /* input no image? then only color operation */ - if (in[0]->data==NULL) { - do_colorband(node->storage, in[0]->vec[0], out[0]->vec); - } - else { - /* make output size of input image */ - CompBuf *cbuf= in[0]->data; - CompBuf *stackbuf= alloc_compbuf(cbuf->x, cbuf->y, CB_RGBA, 1); /* allocs */ - - composit1_pixel_processor(node, stackbuf, in[0]->data, in[0]->vec, do_colorband_composit, CB_VAL); - - out[0]->data= stackbuf; - - if (out[1]->hasoutput) - out[1]->data= valbuf_from_rgbabuf(stackbuf, CHAN_A); - - } - } -} - -#endif /* WITH_COMPOSITOR_LEGACY */ - static void node_composit_init_valtorgb(bNodeTree *UNUSED(ntree), bNode *node, bNodeTemplate *UNUSED(ntemp)) { node->storage= add_colorband(1); @@ -96,9 +58,6 @@ void register_node_type_cmp_valtorgb(bNodeTreeType *ttype) node_type_size(&ntype, 240, 200, 300); node_type_init(&ntype, node_composit_init_valtorgb); node_type_storage(&ntype, "ColorBand", node_free_standard_storage, node_copy_standard_storage); -#ifdef WITH_COMPOSITOR_LEGACY - node_type_exec(&ntype, node_composit_exec_valtorgb); -#endif nodeRegisterType(ttype, &ntype); } @@ -115,38 +74,6 @@ static bNodeSocketTemplate cmp_node_rgbtobw_out[] = { { -1, 0, "" } }; -#ifdef WITH_COMPOSITOR_LEGACY - -static void do_rgbtobw(bNode *UNUSED(node), float *out, float *in) -{ - out[0] = rgb_to_bw(in); -} - -static void node_composit_exec_rgbtobw(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out) -{ - /* stack order out: bw */ - /* stack order in: col */ - - if (out[0]->hasoutput==0) - return; - - /* input no image? then only color operation */ - if (in[0]->data==NULL) { - do_rgbtobw(node, out[0]->vec, in[0]->vec); - } - else { - /* make output size of input image */ - CompBuf *cbuf= in[0]->data; - CompBuf *stackbuf= alloc_compbuf(cbuf->x, cbuf->y, CB_VAL, 1); /* allocs */ - - composit1_pixel_processor(node, stackbuf, in[0]->data, in[0]->vec, do_rgbtobw, CB_RGBA); - - out[0]->data= stackbuf; - } -} - -#endif /* WITH_COMPOSITOR_LEGACY */ - void register_node_type_cmp_rgbtobw(bNodeTreeType *ttype) { static bNodeType ntype; @@ -154,9 +81,6 @@ void register_node_type_cmp_rgbtobw(bNodeTreeType *ttype) node_type_base(ttype, &ntype, CMP_NODE_RGBTOBW, "RGB to BW", NODE_CLASS_CONVERTOR, 0); node_type_socket_templates(&ntype, cmp_node_rgbtobw_in, cmp_node_rgbtobw_out); node_type_size(&ntype, 80, 40, 120); -#ifdef WITH_COMPOSITOR_LEGACY - node_type_exec(&ntype, node_composit_exec_rgbtobw); -#endif nodeRegisterType(ttype, &ntype); } diff --git a/source/blender/nodes/composite/nodes/node_composite_value.c b/source/blender/nodes/composite/nodes/node_composite_value.c index 2c65fe6be19..05e79efa196 100644 --- a/source/blender/nodes/composite/nodes/node_composite_value.c +++ b/source/blender/nodes/composite/nodes/node_composite_value.c @@ -49,18 +49,6 @@ static void node_composit_init_value(bNodeTree *UNUSED(ntree), bNode *node, bNod dval->max = FLT_MAX; } -#ifdef WITH_COMPOSITOR_LEGACY - -static void node_composit_exec_value(void *UNUSED(data), bNode *node, bNodeStack **UNUSED(in), bNodeStack **out) -{ - bNodeSocket *sock= node->outputs.first; - float val= ((bNodeSocketValueFloat*)sock->default_value)->value; - - out[0]->vec[0] = val; -} - -#endif /* WITH_COMPOSITOR_LEGACY */ - void register_node_type_cmp_value(bNodeTreeType *ttype) { static bNodeType ntype; @@ -69,9 +57,6 @@ void register_node_type_cmp_value(bNodeTreeType *ttype) node_type_socket_templates(&ntype, NULL, cmp_node_value_out); node_type_init(&ntype, node_composit_init_value); node_type_size(&ntype, 80, 40, 120); -#ifdef WITH_COMPOSITOR_LEGACY - node_type_exec(&ntype, node_composit_exec_value); -#endif nodeRegisterType(ttype, &ntype); } diff --git a/source/blender/nodes/composite/nodes/node_composite_vecBlur.c b/source/blender/nodes/composite/nodes/node_composite_vecBlur.c index 62c2c02836a..ff4fe8d8da5 100644 --- a/source/blender/nodes/composite/nodes/node_composite_vecBlur.c +++ b/source/blender/nodes/composite/nodes/node_composite_vecBlur.c @@ -45,48 +45,6 @@ static bNodeSocketTemplate cmp_node_vecblur_out[] = { { -1, 0, "" } }; -#ifdef WITH_COMPOSITOR_LEGACY - -static void node_composit_exec_vecblur(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out) -{ - NodeBlurData *nbd = node->storage; - CompBuf *new, *img = in[0]->data, *vecbuf = in[2]->data, *zbuf = in[1]->data; - - if (img == NULL || vecbuf == NULL || zbuf == NULL || out[0]->hasoutput == 0) - return; - if (vecbuf->x != img->x || vecbuf->y != img->y) { - printf("ERROR: cannot do different sized vecbuf yet\n"); - return; - } - if (vecbuf->type != CB_VEC4) { - printf("ERROR: input should be vecbuf\n"); - return; - } - if (zbuf->type != CB_VAL) { - printf("ERROR: input should be zbuf\n"); - return; - } - if (zbuf->x != img->x || zbuf->y != img->y) { - printf("ERROR: cannot do different sized zbuf yet\n"); - return; - } - - /* allow the input image to be of another type */ - img = typecheck_compbuf(in[0]->data, CB_RGBA); - - new = dupalloc_compbuf(img); - - /* call special zbuffer version */ - RE_zbuf_accumulate_vecblur(nbd, img->x, img->y, new->rect, img->rect, vecbuf->rect, zbuf->rect); - - out[0]->data = new; - - if (img != in[0]->data) - free_compbuf(img); -} - -#endif /* WITH_COMPOSITOR_LEGACY */ - static void node_composit_init_vecblur(bNodeTree *UNUSED(ntree), bNode *node, bNodeTemplate *UNUSED(ntemp)) { NodeBlurData *nbd = MEM_callocN(sizeof(NodeBlurData), "node blur data"); @@ -105,9 +63,6 @@ void register_node_type_cmp_vecblur(bNodeTreeType *ttype) node_type_size(&ntype, 120, 80, 200); node_type_init(&ntype, node_composit_init_vecblur); node_type_storage(&ntype, "NodeBlurData", node_free_standard_storage, node_copy_standard_storage); -#ifdef WITH_COMPOSITOR_LEGACY - node_type_exec(&ntype, node_composit_exec_vecblur); -#endif nodeRegisterType(ttype, &ntype); } diff --git a/source/blender/nodes/composite/nodes/node_composite_viewer.c b/source/blender/nodes/composite/nodes/node_composite_viewer.c index 1c27cc21b06..24affc8f374 100644 --- a/source/blender/nodes/composite/nodes/node_composite_viewer.c +++ b/source/blender/nodes/composite/nodes/node_composite_viewer.c @@ -41,90 +41,6 @@ static bNodeSocketTemplate cmp_node_viewer_in[] = { { -1, 0, "" } }; -#ifdef WITH_COMPOSITOR_LEGACY - -static void node_composit_exec_viewer(void *data, bNode *node, bNodeStack **in, bNodeStack **UNUSED(out)) -{ - /* image assigned to output */ - /* stack order input sockets: col, alpha, z */ - - if (node->id && (node->flag & NODE_DO_OUTPUT)) { /* only one works on out */ - RenderData *rd = data; - Image *ima = (Image *)node->id; - ImBuf *ibuf; - CompBuf *cbuf, *tbuf; - int rectx, recty; - void *lock; - - BKE_image_user_frame_calc(node->storage, rd->cfra, 0); - - /* always returns for viewer image, but we check nevertheless */ - ibuf = BKE_image_acquire_ibuf(ima, node->storage, &lock); - if (ibuf == NULL) { - printf("node_composit_exec_viewer error\n"); - BKE_image_release_ibuf(ima, ibuf, lock); - return; - } - - /* free all in ibuf */ - imb_freerectImBuf(ibuf); - imb_freerectfloatImBuf(ibuf); - IMB_freezbuffloatImBuf(ibuf); - - /* get size */ - tbuf = in[0]->data ? in[0]->data : (in[1]->data ? in[1]->data : in[2]->data); - if (tbuf == NULL) { - rectx = 320; recty = 256; - } - else { - rectx = tbuf->x; - recty = tbuf->y; - } - - /* make ibuf, and connect to ima */ - ibuf->x = rectx; - ibuf->y = recty; - imb_addrectfloatImBuf(ibuf); - - ima->ok = IMA_OK_LOADED; - - /* now we combine the input with ibuf */ - cbuf = alloc_compbuf(rectx, recty, CB_RGBA, 0); /* no alloc*/ - cbuf->rect = ibuf->rect_float; - - /* when no alpha, we can simply copy */ - if (in[1]->data == NULL) { - composit1_pixel_processor(node, cbuf, in[0]->data, in[0]->vec, do_copy_rgba, CB_RGBA); - } - else - composit2_pixel_processor(node, cbuf, in[0]->data, in[0]->vec, in[1]->data, in[1]->vec, do_copy_a_rgba, CB_RGBA, CB_VAL); - - /* zbuf option */ - if (in[2]->data) { - CompBuf *zbuf = alloc_compbuf(rectx, recty, CB_VAL, 1); - ibuf->zbuf_float = zbuf->rect; - ibuf->mall |= IB_zbuffloat; - - composit1_pixel_processor(node, zbuf, in[2]->data, in[2]->vec, do_copy_value, CB_VAL); - - /* free compbuf, but not the rect */ - zbuf->malloc = 0; - free_compbuf(zbuf); - } - - BKE_image_release_ibuf(ima, ibuf, lock); - - generate_preview(data, node, cbuf); - free_compbuf(cbuf); - - } - else if (in[0]->data) { - generate_preview(data, node, in[0]->data); - } -} - -#endif /* WITH_COMPOSITOR_LEGACY */ - static void node_composit_init_viewer(bNodeTree *UNUSED(ntree), bNode *node, bNodeTemplate *UNUSED(ntemp)) { ImageUser *iuser = MEM_callocN(sizeof(ImageUser), "node image user"); @@ -145,9 +61,6 @@ void register_node_type_cmp_viewer(bNodeTreeType *ttype) node_type_size(&ntype, 80, 60, 200); node_type_init(&ntype, node_composit_init_viewer); node_type_storage(&ntype, "ImageUser", node_free_standard_storage, node_copy_standard_storage); -#ifdef WITH_COMPOSITOR_LEGACY - node_type_exec(&ntype, node_composit_exec_viewer); -#endif node_type_internal_links(&ntype, NULL); diff --git a/source/blender/nodes/composite/nodes/node_composite_zcombine.c b/source/blender/nodes/composite/nodes/node_composite_zcombine.c index 8e639aaa357..89d0cccd183 100644 --- a/source/blender/nodes/composite/nodes/node_composite_zcombine.c +++ b/source/blender/nodes/composite/nodes/node_composite_zcombine.c @@ -48,183 +48,6 @@ static bNodeSocketTemplate cmp_node_zcombine_out[] = { { -1, 0, "" } }; -#ifdef WITH_COMPOSITOR_LEGACY - -static void do_zcombine(bNode *node, float *out, float *src1, float *z1, float *src2, float *z2) -{ - float alpha; - float malpha; - - if (*z1 <= *z2) { - if (node->custom1) { - // use alpha in combine operation - alpha= src1[3]; - malpha= 1.0f - alpha; - out[0] = malpha*src2[0] + alpha*src1[0]; - out[1] = malpha*src2[1] + alpha*src1[1]; - out[2] = malpha*src2[2] + alpha*src1[2]; - out[3] = malpha*src2[3] + alpha*src1[3]; - } - else { - // do combination based solely on z value - copy_v4_v4(out, src1); - } - } - else { - if (node->custom1) { - // use alpha in combine operation - alpha= src2[3]; - malpha= 1.0f - alpha; - out[0] = malpha*src1[0] + alpha*src2[0]; - out[1] = malpha*src1[1] + alpha*src2[1]; - out[2] = malpha*src1[2] + alpha*src2[2]; - out[3] = malpha*src1[3] + alpha*src2[3]; - } - else { - // do combination based solely on z value - copy_v4_v4(out, src1); - } - - if (node->custom2) - *z1= *z2; - } -} - -static void do_zcombine_mask(bNode *node, float *out, float *z1, float *z2) -{ - if (*z1 > *z2) { - *out= 1.0f; - if (node->custom2) - *z1= *z2; - } -} - -static void do_zcombine_add(bNode *node, float *out, float *col1, float *col2, float *acol) -{ - float alpha; - float malpha; - - if (node->custom1) { - // use alpha in combine operation, antialiased mask in used here just as hint for the z value - if (*acol>0.0f) { - alpha= col2[3]; - malpha= 1.0f - alpha; - - - out[0] = malpha*col1[0] + alpha*col2[0]; - out[1] = malpha*col1[1] + alpha*col2[1]; - out[2] = malpha*col1[2] + alpha*col2[2]; - out[3] = malpha*col1[3] + alpha*col2[3]; - } - else { - alpha= col1[3]; - malpha= 1.0f - alpha; - - - out[0] = malpha*col2[0] + alpha*col1[0]; - out[1] = malpha*col2[1] + alpha*col1[1]; - out[2] = malpha*col2[2] + alpha*col1[2]; - out[3] = malpha*col2[3] + alpha*col1[3]; - } - } - else { - // do combination based solely on z value but with antialiased mask - alpha = *acol; - malpha= 1.0f - alpha; - - out[0] = malpha*col1[0] + alpha*col2[0]; - out[1] = malpha*col1[1] + alpha*col2[1]; - out[2] = malpha*col1[2] + alpha*col2[2]; - out[3] = malpha*col1[3] + alpha*col2[3]; - } -} - -static void node_composit_exec_zcombine(void *data, bNode *node, bNodeStack **in, bNodeStack **out) -{ - RenderData *rd= data; - CompBuf *cbuf= in[0]->data; - CompBuf *zbuf; - - /* stack order in: col z col z */ - /* stack order out: col z */ - if (out[0]->hasoutput==0 && out[1]->hasoutput==0) - return; - - /* no input image; do nothing now */ - if (in[0]->data==NULL) { - return; - } - - if (out[1]->hasoutput) { - /* copy or make a buffer for for the first z value, here we write result in */ - if (in[1]->data) - zbuf= dupalloc_compbuf(in[1]->data); - else { - float *zval; - int tot= cbuf->x*cbuf->y; - - zbuf= alloc_compbuf(cbuf->x, cbuf->y, CB_VAL, 1); - for (zval= zbuf->rect; tot; tot--, zval++) - *zval= in[1]->vec[0]; - } - /* lazy coder hack */ - node->custom2= 1; - out[1]->data= zbuf; - } - else { - node->custom2= 0; - zbuf= in[1]->data; - } - - if (rd->scemode & R_FULL_SAMPLE) { - /* make output size of first input image */ - CompBuf *stackbuf= alloc_compbuf(cbuf->x, cbuf->y, CB_RGBA, 1); // allocs - - composit4_pixel_processor(node, stackbuf, in[0]->data, in[0]->vec, zbuf, in[1]->vec, in[2]->data, in[2]->vec, - in[3]->data, in[3]->vec, do_zcombine, CB_RGBA, CB_VAL, CB_RGBA, CB_VAL); - - out[0]->data= stackbuf; - } - else { - /* make output size of first input image */ - CompBuf *stackbuf= alloc_compbuf(cbuf->x, cbuf->y, CB_RGBA, 1); /* allocs */ - CompBuf *mbuf; - float *fp; - int x; - char *aabuf; - - - /* make a mask based on comparison, optionally write zvalue */ - mbuf= alloc_compbuf(cbuf->x, cbuf->y, CB_VAL, 1); - composit2_pixel_processor(node, mbuf, zbuf, in[1]->vec, in[3]->data, in[3]->vec, do_zcombine_mask, CB_VAL, CB_VAL); - - /* convert to char */ - aabuf= MEM_mallocN(cbuf->x*cbuf->y, "aa buf"); - fp= mbuf->rect; - for (x= cbuf->x*cbuf->y-1; x>=0; x--) - if (fp[x]==0.0f) aabuf[x] = 0; - else aabuf[x] = 255; - - antialias_tagbuf(cbuf->x, cbuf->y, aabuf); - - /* convert to float */ - fp= mbuf->rect; - for (x= cbuf->x*cbuf->y-1; x>=0; x--) - if (aabuf[x]>1) - fp[x] = (1.0f/255.0f)*(float)aabuf[x]; - - composit3_pixel_processor(node, stackbuf, in[0]->data, in[0]->vec, in[2]->data, in[2]->vec, mbuf, NULL, - do_zcombine_add, CB_RGBA, CB_RGBA, CB_VAL); - /* free */ - free_compbuf(mbuf); - MEM_freeN(aabuf); - - out[0]->data= stackbuf; - } -} - -#endif /* WITH_COMPOSITOR_LEGACY */ - void register_node_type_cmp_zcombine(bNodeTreeType *ttype) { static bNodeType ntype; @@ -232,9 +55,6 @@ void register_node_type_cmp_zcombine(bNodeTreeType *ttype) node_type_base(ttype, &ntype, CMP_NODE_ZCOMBINE, "Z Combine", NODE_CLASS_OP_COLOR, NODE_OPTIONS); node_type_socket_templates(&ntype, cmp_node_zcombine_in, cmp_node_zcombine_out); node_type_size(&ntype, 80, 40, 120); -#ifdef WITH_COMPOSITOR_LEGACY - node_type_exec(&ntype, node_composit_exec_zcombine); -#endif nodeRegisterType(ttype, &ntype); } |