#ifndef ROTOR_NODES_DRAWING #define ROTOR_NODES_DRAWING #include "rotor.h" #include namespace Rotor { class Draw_node: public Image_node { public: Draw_node(){image=nullptr;}; Draw_node(map &settings) { image=nullptr; }; ~Draw_node(){ if (image) delete image;}; Draw_node* clone(map &_settings) { return new Draw_node(_settings);}; virtual void vector_output(cairo_t * cr,const Frame_spec &frame){}; Image *output(const Frame_spec &frame){ //get new or input image to draw upon 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 { if (!image) image =new Image(); image->setup(frame.w,frame.h); } } else { if (!image) image =new Image(); image->setup(frame.w,frame.h); //do this twice or use a goto } //convert to 32 bit - this can probably be optimised further cv::Mat chans; cv::cvtColor(image->rgb, chans, CV_BGR2RGBA, 4); cairo_surface_t * cs = cairo_image_surface_create_for_data (chans.data, CAIRO_FORMAT_RGB24, image->w, image->h, image->w*4); cairo_t * cr = cairo_create (cs); //do any kind of vector drawing vector_output(cr,frame); //convert frame back to 24 bits cv::cvtColor(chans,image->rgb,CV_RGBA2BGR,3); cairo_destroy(cr); cairo_surface_destroy(cs); return image; } private: Image *image; //is an image generator }; class Hello_draw: public Draw_node { public: Hello_draw(){image=nullptr;}; Hello_draw(map &settings) { image=nullptr; base_settings(settings); }; ~Hello_draw(){ if (image) delete image;}; Hello_draw* clone(map &_settings) { return new Hello_draw(_settings);}; void vector_output(cairo_t * cr,const Frame_spec &frame){ cairo_text_extents_t te; cairo_set_source_rgb (cr, 1.0, 0.0, 0.0); cairo_select_font_face (cr, "Georgia", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_BOLD); cairo_set_font_size (cr, 50); cairo_text_extents(cr, "hello, world!", &te); cairo_move_to (cr,(frame.w-te.width)/2,(frame.h-te.height)/2); cairo_show_text (cr, "hello, world!"); cairo_fill(cr); } private: Image *image; //is an image generator }; class Shape: public Draw_node { public: Shape(){image=nullptr;}; Shape(map &settings) { image=nullptr; base_settings(settings); }; ~Shape(){ if (image) delete image;}; Shape* clone(map &_settings) { return new Shape(_settings);}; void vector_output(cairo_t * cr,const Frame_spec &frame){ cairo_text_extents_t te; cairo_set_source_rgb (cr, 1.0, 0.0, 0.0); cairo_select_font_face (cr, "Georgia", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_BOLD); cairo_set_font_size (cr, 50); cairo_text_extents(cr, "hello, world!", &te); cairo_move_to (cr,(frame.w-te.width)/2,(frame.h-te.height)/2); cairo_show_text (cr, "hello, world!"); cairo_fill(cr); } private: Image *image; //is an image generator }; } #endif