From 3710ee5ea32841d3f62e52834aa2a55f026c6620 Mon Sep 17 00:00:00 2001 From: Tim Redfern Date: Wed, 26 Jun 2013 13:40:44 +0100 Subject: mirror node --- rotord/rotor.h | 83 +++++++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 62 insertions(+), 21 deletions(-) (limited to 'rotord/rotor.h') diff --git a/rotord/rotor.h b/rotord/rotor.h index da7e875..8720983 100755 --- a/rotord/rotor.h +++ b/rotord/rotor.h @@ -960,7 +960,7 @@ namespace Rotor { Image *output(const Frame_spec &frame){ if (image_inputs.size()) { if (image_inputs[0]->connection){ - if (image) delete image; + if (image) image->free(); Image *in=(((Image_node*)image_inputs[0]->connection)->get_output(frame)); switch (op) { case ARITHMETIC_plus: @@ -1006,7 +1006,7 @@ namespace Rotor { if (p->parameter=="white_out") p->receiver=&white_out; } }; - ~Luma_levels(){if (LUT) {delete[] LUT;} if (image) {delete image;} }; + ~Luma_levels(){if (LUT) {delete[] LUT;} if (image) delete image; }; void levels_settings(map &settings){ black_in=find_setting(settings,"black_in",0.0f); white_in=find_setting(settings,"white_in",1.0f); @@ -1027,7 +1027,7 @@ namespace Rotor { void apply_LUT(const Image& in){ apply_LUT(in,*image); } - void apply_LUT(const Image& in,Image &out){ //facility to apply to other images for ingherited classes + void apply_LUT(const Image& in,Image &out){ //facility to apply to other images for inherited classes out.setup(in.w,in.h); for (int i=0;iconnection){ if (LUT) { //copy incoming image **writable - image->free(); + if (image) image->free(); image=(((Image_node*)image_inputs[0]->connection)->get_output(frame))->clone(); for (int i=1;i &settings) { base_settings(settings); - image=new Image(); + image=nullptr; amount=find_setting(settings,"amount",1.0f); string _mode=find_setting(settings,"mode","screen"); if (_mode=="screen") mode=BLEND_screen; @@ -1206,7 +1207,7 @@ namespace Rotor { if (p->parameter=="amount") p->receiver=&amount; } }; - ~Blend(){ delete image;}; + ~Blend(){ if (image) delete image;}; Blend* clone(map &_settings) { return new Blend(_settings);}; Image *output(const Frame_spec &frame){ if (image_inputs.size()) { @@ -1214,7 +1215,7 @@ namespace Rotor { if (image_inputs.size()>1) { if (image_inputs[1]->connection) { //copy incoming image **writable - image->free(); + if (image) image->free(); image=(((Image_node*)image_inputs[0]->connection)->get_output(frame))->clone(); switch(mode){ case BLEND_screen: @@ -1245,27 +1246,68 @@ namespace Rotor { float amount; //for blend }; #define MIRROR_horiz 1 - #define MIRROR_vert 1 - /* + #define MIRROR_vert 2 + #define MIRROR_horizR 3 + #define MIRROR_vertR 4 class Mirror: public Image_node { public: Mirror(){}; Mirror(map &settings) { base_settings(settings); - image=new Image(); - amount=find_setting(settings,"amount",1.0f); - string _mode=find_setting(settings,"mode","screen"); - if (_mode=="horiz") mode=BLEND_screen; - if (_mode=="vert") mode=BLEND_multiply; + image=nullptr; + string _mode=find_setting(settings,"mode","horiz"); + if (_mode=="horiz") mode=MIRROR_horiz; + if (_mode=="vert") mode=MIRROR_vert; + if (_mode=="horizR") mode=MIRROR_horizR; + if (_mode=="vertR") mode=MIRROR_vertR; }; - ~Mirror(){ delete image;}; + ~Mirror(){ if (image) delete image;}; Mirror* clone(map &_settings) { return new Mirror(_settings);}; Image *output(const Frame_spec &frame){ if (image_inputs.size()) { if (image_inputs[0]->connection){ - - //if there aren't 2 image inputs connected just return the first - return (((Image_node*)image_inputs[0]->connection)->get_output(frame)); + //copy incoming image **writable + if (image) image->free(); + image=(((Image_node*)image_inputs[0]->connection)->get_output(frame))->clone(); + switch (mode) { + case MIRROR_horiz: + for (int i=0;iw/2;i++){ + for (int j=0;jh;j++){ + for (int k=0;k<3;k++){ + image->RGBdata[(((j*image->w)+((image->w/2)+i))*3)+k]=image->RGBdata[(((j*image->w)+((image->w/2)-i))*3)+k]; + } + } + } + break; + case MIRROR_vert: + for (int i=0;iw;i++){ + for (int j=0;jh/2;j++){ + for (int k=0;k<3;k++){ + image->RGBdata[((((image->h/2+j)*image->w)+i)*3)+k]=image->RGBdata[((((image->h/2-j)*image->w)+i)*3)+k]; + } + } + } + break; + case MIRROR_horizR: + for (int i=0;iw/2;i++){ + for (int j=0;jh;j++){ + for (int k=0;k<3;k++){ + image->RGBdata[(((j*image->w)+((image->w/2)-i))*3)+k]=image->RGBdata[(((j*image->w)+((image->w/2)+i))*3)+k]; + } + } + } + break; + case MIRROR_vertR: + for (int i=0;iw;i++){ + for (int j=0;jh/2;j++){ + for (int k=0;k<3;k++){ + image->RGBdata[((((image->h/2-j)*image->w)+i)*3)+k]=image->RGBdata[((((image->h/2+j)*image->w)+i)*3)+k]; + } + } + } + break; + } + return image; } } return nullptr; @@ -1274,7 +1316,6 @@ namespace Rotor { Image *image; //is an image generator int mode; }; - */ //------------------------------------------------------------------- class Node_factory{ public: -- cgit v1.2.3