summaryrefslogtreecommitdiff
path: root/rotord/src/nodes_drawing.h
blob: 4d3b51517a30c8522260b637125b0a2e04394ce0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#ifndef ROTOR_NODES_DRAWING
#define ROTOR_NODES_DRAWING

#include "rotor.h"
#include <cairo.h>

namespace Rotor {
	class Draw_node: public Image_node {
		public:
			Draw_node(){image=nullptr;};
			Draw_node(map<string,string> &settings) {
				image=nullptr;
			};
			~Draw_node(){ if (image) delete image;};
			Draw_node* clone(map<string,string> &_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<string,string> &settings) {
				image=nullptr;
				base_settings(settings);
			};
			~Hello_draw(){ if (image) delete image;};
			Hello_draw* clone(map<string,string> &_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<string,string> &settings) {
				image=nullptr;
				base_settings(settings);
			};
			~Shape(){ if (image) delete image;};
			Shape* clone(map<string,string> &_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