diff options
Diffstat (limited to 'rotord/src/nodes_transform.h')
| -rw-r--r-- | rotord/src/nodes_transform.h | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/rotord/src/nodes_transform.h b/rotord/src/nodes_transform.h index 624ad21..99f553e 100644 --- a/rotord/src/nodes_transform.h +++ b/rotord/src/nodes_transform.h @@ -186,6 +186,74 @@ namespace Rotor { private: Image still; }; +#define MIRROR_horiz 1 +#define MIRROR_vert 2 +#define MIRROR_horizR 3 +#define MIRROR_vertR 4 + class Mirror: public Image_node { + public: + Mirror(){ + create_image_input("image input","Image input"); + create_attribute("mode","Mirror mode","Mirror mode","horiz",{"horiz","vert","horizR","vertR"}); + title="Mirror"; + description="Mirror video across a central axis"; + UID="1fed5b26-2d0a-11e3-9901-4b5ea78a005d"; + }; + Mirror(map<string,string> &settings):Mirror() { + base_settings(settings); + }; + ~Mirror(){ }; + Mirror* clone(map<string,string> &_settings) { return new Mirror(_settings);}; + Image *output(const Frame_spec &frame){ + Image *in=image_inputs[0]->get(frame); + if (in){ + //copy incoming image **writable + image=(*in); + //could be more efficient here by only copying once + switch (attributes["mode"]->intVal) { + 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 ℑ + } + return nullptr; + } + private: + }; } #endif |
