#ifndef ROTOR_NODES_DRAWING #define ROTOR_NODES_DRAWING #include "rotor.h" #include namespace Rotor { class Draw: public Image_node { public: Draw(){image=nullptr;}; Draw(map &settings) { base_settings(settings); }; ~Draw(){ if (image) delete image;}; Draw* clone(map &_settings) { return new Draw(_settings);}; Image *output(const Frame_spec &frame){ if (image_inputs.size()) { if (image_inputs[0]->connection){ //copy incoming image **writable if (image) delete image; image=(((Image_node*)image_inputs[0]->connection)->get_output(frame))->clone(); } else image->setup(frame.w,frame.h); } else image->setup(frame.w,frame.h); //do this twice or use a goto //draw onto new or input image cairo_surface_t * cs = cairo_image_surface_create_for_data (image->RGBdata, CAIRO_FORMAT_RGB24, image->w, image->h, image->getStride()); cairo_t *c=cairo_create(cs); cairo_rectangle(c, image->w/2, image->h/2, image->w, image->h); cairo_set_source_rgb(c, 1.0, 0.0, 0.0); cairo_fill(c); return image; } private: Image *image; //is an image generator }; } #endif