static void node_composit_exec_cvMult(void *data, bNode *node, bNodeStack **in, bNodeStack **out) { CvArr* dst; CvArr* src1; CvArr* src2; CV_FUNCNAME( "cvMult" ); if(out[0]->hasoutput==0) return; cvSetErrMode(1); //Parent mode error __CV_BEGIN__; if((in[0]->data)&&(in[1]->data)){ CV_CALL(src1 = in[0]->data); CV_CALL(src2 = in[1]->data); if(!BOCV_checkAreSameType(src1, src2)) CV_ERROR( CV_StsBadArg,"The source inputs are differents" ); CV_CALL(dst=BOCV_CreateArrFrom(src2)); if(dst) { CV_CALL(cvMul(src1, src2, dst, 1.0)); CV_CALL(out[0]->data= dst); } } __CV_END__; }
static void node_composit_exec_cvAnd(void *data, bNode *node, bNodeStack **in, bNodeStack **out) { CvArr* dst; CvArr* src1; CvArr* src2; CvArr* mask=NULL; CompBuf* dst_buf; if(out[0]->hasoutput==0) return; if((in[0]->data)){ //Inputs src1 = BOCV_IplImage_attach(in[0]->data); mask = BOCV_Mask_attach(in[2]->data); //Output dst_buf=dupalloc_compbuf(in[0]->data); dst=BOCV_IplImage_attach(dst_buf); //Check Image - Mask sizes if(mask){ if (!BOCV_checkMask(src1, mask)){ node->error= 1; return; } } if(in[1]->data){ src2 = BOCV_IplImage_attach(in[1]->data); //Checks //Check Image Sizes if(!BOCV_checkAreSameType(src1, src2)){ node->error= 1; return; } //Check Image number Channels if(!BOCV_checkSameNChannels(src1, src2)){ node->error= 1; return; } cvAnd(src1, src2, dst, mask); BOCV_IplImage_detach(src2); }else{ CvScalar s; s.val[0]= (in[1]->vec[0]); s.val[1]= (in[1]->vec[1]); s.val[2]= (in[1]->vec[2]); s.val[3]= 0; cvAndS(src1, s, dst, mask); } out[0]->data= dst_buf; BOCV_IplImage_detach(src1); BOCV_IplImage_detach(mask); BOCV_IplImage_detach(dst); } }
int BOCV_checkMask(void* src1, void* mask){ if(!BOCV_checkAreSameType(src1, mask)){ return 0; } if(CV_IS_IMAGE(mask)){ if(((IplImage*)mask)->nChannels!=1){ BKE_report(NULL, 1<<4,"Mask must be 1 channel, please convert to gray"); return 0; } } return 1; }
static void node_composit_exec_cvSub(void *data, bNode *node, bNodeStack **in, bNodeStack **out) { CvArr* dst; CvArr* src1; CvArr* src2; CvArr* mask = NULL; CompBuf *dst_buf; if (out[0]->hasoutput == 0) return; if ((in[0]->data)) { src1 = BOCV_IplImage_attach(in[0]->data); if (in[2]->data) { mask = BOCV_Mask_attach(in[2]->data); if (!BOCV_checkMask(src1, mask)) { node->error = 1; return; } } //Create output dst_buf = dupalloc_compbuf(in[0]->data); dst = BOCV_IplImage_attach(dst_buf); //If there are second input if (in[1]->data) { src2 = BOCV_IplImage_attach(in[1]->data); if (!BOCV_checkAreSameType(src1, src2)) { node->error = 1; return; } if (!BOCV_checkSameNChannels(src1, src2)) { node->error = 1; return; } cvSub(src1, src2, dst, mask); BOCV_IplImage_detach(src2); } else { CvScalar s; s.val[0] = (in[1]->vec[0]); s.val[1] = (in[1]->vec[1]); s.val[2] = (in[1]->vec[2]); s.val[3] = 0; cvSubS(src1, s, dst, mask); } out[0]->data = dst_buf; BOCV_IplImage_detach(src1); BOCV_IplImage_detach(dst); } }
static void node_composit_exec_cvDiv(void *data, bNode *node, bNodeStack **in, bNodeStack **out) { CvArr* dst; CvArr* src1; CvArr* src2; CompBuf *dst_buf; if (out[0]->hasoutput == 0) return; if ((in[0]->data) && in[1]->data) { //Get inuts src1 = BOCV_IplImage_attach(in[0]->data); src2 = BOCV_IplImage_attach(in[1]->data); //Create output dst_buf = dupalloc_compbuf(in[0]->data); dst = BOCV_IplImage_attach(dst_buf); //Check for inputs if (!BOCV_checkAreSameType(src1, src2)) { node->error = 1; return; } if (!BOCV_checkSameNChannels(src1, src2)) { node->error = 1; return; } cvDiv(src1, src2, dst, in[2]->vec[0]); //Output out[0]->data = dst_buf; //Release memory BOCV_IplImage_detach(src1); BOCV_IplImage_detach(src2); BOCV_IplImage_detach(dst); } }