diff options
Diffstat (limited to 'rotord/rotor.h')
| -rwxr-xr-x | rotord/rotor.h | 83 |
1 files changed, 62 insertions, 21 deletions
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<string,string> &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;i<out.w*out.h*3;i++){ out.RGBdata[i]=LUT[in.RGBdata[i]]; @@ -1086,7 +1086,7 @@ namespace Rotor { number=find_setting(settings,"number",1); fadeto=find_setting(settings,"fadeto",1.0f); levels_settings(settings); - image=new Image(); + image=nullptr; lastframe=-1; mode=find_setting(settings,"mode",0.0f); } @@ -1104,7 +1104,8 @@ namespace Rotor { }; //~Echo_trails(){if (image) {delete image;} }; ~Echo_trails(){ - for (auto i:images) {delete i.second;} + if (image) delete image; + for (auto i:images) {if (image) delete i.second;} }; Image *output(const Frame_spec &frame){ //check if cache is valid @@ -1137,7 +1138,7 @@ namespace Rotor { if (image_inputs[0]->connection){ 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<number;i++){ //check echo frame isn't at negative time @@ -1194,7 +1195,7 @@ namespace Rotor { Blend(){}; Blend(map<string,string> &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<string,string> &_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<string,string> &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<string,string> &_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;i<image->w/2;i++){ + for (int j=0;j<image->h;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;i<image->w;i++){ + for (int j=0;j<image->h/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;i<image->w/2;i++){ + for (int j=0;j<image->h;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;i<image->w;i++){ + for (int j=0;j<image->h/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: |
