f4c4accb324c1ac14b5f549c6d486609bc4c9cd6
[universe.git] / canvas_cairo.cc
1
2 ////////////////////////////////////////////////////////////////////
3 // START_IP_HEADER                                                //
4 //                                                                //
5 // Written by Francois Fleuret                                    //
6 // Contact <francois.fleuret@idiap.ch> for comments & bug reports //
7 //                                                                //
8 // END_IP_HEADER                                                  //
9 ////////////////////////////////////////////////////////////////////
10
11 #include "canvas_cairo.h"
12
13 static cairo_status_t write_cairo_to_file(void *closure,
14                                           const unsigned char *data,
15                                           unsigned int length) {
16   fwrite(data, 1, length, (FILE *) closure);
17   return CAIRO_STATUS_SUCCESS;
18 }
19
20 CanvasCairo::CanvasCairo(scalar_t scale, int width, int height) {
21   const int actual_width = int(width * scale);
22   const int actual_height = int(height * scale);
23   const int depth = 4;
24
25   _data = new unsigned char [actual_width * actual_height * depth];
26
27   _image = cairo_image_surface_create_for_data(_data,
28                                                CAIRO_FORMAT_RGB24,
29                                                actual_width,
30                                                actual_height,
31                                                actual_width * depth);
32
33   _context_resource = cairo_create(_image);
34
35   cairo_scale(_context_resource, scale, scale);
36
37   cairo_set_source_rgb(_context_resource, 1.0, 1.0, 1.0);
38   // cairo_set_source_rgb(_context_resource, 0.0, 0.0, 0.0);
39
40   cairo_rectangle(_context_resource, 0, 0, width, height);
41
42   cairo_fill(_context_resource);
43 }
44
45 CanvasCairo::~CanvasCairo() {
46   cairo_destroy(_context_resource);
47   cairo_surface_destroy(_image);
48   delete[] _data;
49 }
50
51 void CanvasCairo::set_drawing_color(scalar_t r, scalar_t g, scalar_t b) {
52   cairo_set_source_rgb(_context_resource, r, g, b);
53 }
54
55 void CanvasCairo::draw_polygon(int filled, int nb, scalar_t *x, scalar_t *y) {
56   cairo_set_line_width(_context_resource, 1.0);
57   cairo_move_to(_context_resource, x[0], y[0]);
58   for(int n = 0; n < nb; n++) {
59     cairo_line_to(_context_resource, x[n], y[n]);
60   }
61   cairo_close_path(_context_resource);
62
63   if(filled) {
64     cairo_stroke_preserve(_context_resource);
65     cairo_fill(_context_resource);
66   } else {
67     cairo_stroke(_context_resource);
68   }
69 }
70
71 void CanvasCairo::write_png(FILE *file) {
72   cairo_surface_write_to_png_stream(_image, write_cairo_to_file, file);
73 }