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
|