2 ////////////////////////////////////////////////////////////////////
5 // Written by Francois Fleuret //
6 // Contact <francois.fleuret@idiap.ch> for comments & bug reports //
9 ////////////////////////////////////////////////////////////////////
11 #include "canvas_cairo.h"
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;
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);
25 _data = new unsigned char [actual_width * actual_height * depth];
27 _image = cairo_image_surface_create_for_data(_data,
31 actual_width * depth);
33 _context_resource = cairo_create(_image);
35 cairo_scale(_context_resource, scale, scale);
37 cairo_set_source_rgb(_context_resource, 1.0, 1.0, 1.0);
38 cairo_set_line_width (_context_resource, 1.0);
40 cairo_rectangle(_context_resource, 0, 0, width, height);
42 cairo_fill(_context_resource);
45 CanvasCairo::~CanvasCairo() {
46 cairo_destroy(_context_resource);
47 cairo_surface_destroy(_image);
52 void CanvasCairo::set_line_width(scalar_t w) {
53 cairo_set_line_width (_context_resource, w);
56 void CanvasCairo::set_drawing_color(scalar_t r, scalar_t g, scalar_t b) {
57 cairo_set_source_rgb(_context_resource, r, g, b);
60 void CanvasCairo::draw_polygon(int filled, int nb, scalar_t *x, scalar_t *y) {
61 cairo_move_to(_context_resource, x[0], y[0]);
62 for(int n = 0; n < nb; n++) {
63 cairo_line_to(_context_resource, x[n], y[n]);
65 cairo_close_path(_context_resource);
68 cairo_stroke_preserve(_context_resource);
69 cairo_fill(_context_resource);
71 cairo_stroke(_context_resource);
75 void CanvasCairo::write_png(FILE *file) {
76 cairo_surface_write_to_png_stream(_image, write_cairo_to_file, file);