#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) { image=nullptr; base_settings(settings); if(CAIRO_HAS_IMAGE_SURFACE==1) { cerr<<"cairo has image surface"< &_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 { 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 } //draw onto new or input image //image->convert32(); //pad frame out to 32 bits for cairo //turns out cairo doesn't draw at all if the stride definition is wrong //crashes like this though cv::Mat chans; cv::cvtColor(image->rgb, chans, CV_RGB2RGBA, 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); cairo_rectangle(cr, 0,0, image->w/2, image->h/2); cairo_set_source_rgb(cr, 0,1.0,0); //cairo colour is 0.0->1.0 cairo_fill(cr); 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, 20); cairo_text_extents (cr, "hello world!", &te); cairo_move_to (cr, 20,20); cairo_show_text (cr, "hello world!"); cairo_fill(cr); //image->convert24(); //convert frame back to 24 bits cv::cvtColor(chans,image->rgb,CV_RGBA2RGB,3); return image; } private: Image *image; //is an image generator }; } #endif