Merge remote-tracking branch 'remotes/origin/exportvis' into windows+cc
[ardour.git] / libs / canvas / canvas / image.h
1 /*
2     Copyright (C) 2013 Paul Davis
3
4     This program is free software; you can redistribute it and/or modify
5     it under the terms of the GNU General Public License as published by
6     the Free Software Foundation; either version 2 of the License, or
7     (at your option) any later version.
8
9     This program is distributed in the hope that it will be useful,
10     but WITHOUT ANY WARRANTY; without even the implied warranty of
11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12     GNU General Public License for more details.
13
14     You should have received a copy of the GNU General Public License
15     along with this program; if not, write to the Free Software
16     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17 */
18
19 #ifndef __CANVAS_IMAGE__
20 #define __CANVAS_IMAGE__
21
22 #include <stdint.h>
23 #include <boost/shared_ptr.hpp>
24 #include <boost/shared_array.hpp>
25
26 #include "canvas/item.h"
27
28 typedef void (*ImageReleaseCallback)(uint8_t *d, void *arg);
29
30 namespace ArdourCanvas {
31
32
33 class Image : public Item
34 {
35 public:
36     Image (Group *, Cairo::Format, int width, int height);
37     
38     struct Data {
39         Data (uint8_t *d, int w, int h, int s, Cairo::Format fmt)
40                 : data (d)
41                 , width (w)
42                 , height (h)
43                 , stride (s)
44                 , format (fmt)
45                 , destroy_callback(NULL)
46                 , destroy_arg(NULL)
47         {}
48
49         virtual ~Data () {
50                 if (destroy_callback) {
51                         destroy_callback(data, destroy_arg);
52                 } else {
53                         free(data);
54                 }
55         }
56
57         uint8_t* data;
58         int width;
59         int height;
60         int stride;
61         Cairo::Format format;
62         ImageReleaseCallback  destroy_callback;
63         void* destroy_arg;
64     };
65
66     /** 
67      * Returns a shared_ptr to a Data object that can be used to 
68      * write image data to. The Data object will contain a pointer
69      * to the buffer, along with image properties that may be
70      * useful during the data writing.
71      * 
72      * Can be called from any thread BUT ..
73      *
74      * ... to avoid collisions with Image deletion, some synchronization method
75      * may be required or the use of shared_ptr<Image> or similar.
76      */
77     boost::shared_ptr<Data> get_image (bool allocate_data = true);
78
79
80     /**
81      * Queues a Data object to be used to redraw this Image item
82      * at the earliest possible opportunity.
83      *
84      * May be called from any thread BUT ...
85      *
86      * ... to avoid collisions with Image deletion, some synchronization method
87      * may be required or the use of shared_ptr<Image> or similar.
88      */
89     void put_image (boost::shared_ptr<Data>);
90
91     void render (Rect const &, Cairo::RefPtr<Cairo::Context>) const;
92     void compute_bounding_box () const;
93     
94 private:
95     Cairo::Format            _format;
96     int                      _width;
97     int                      _height;
98     int                      _data;
99     mutable boost::shared_ptr<Data>  _current;
100     boost::shared_ptr<Data>  _pending;
101     mutable bool             _need_render;
102     mutable Cairo::RefPtr<Cairo::Surface> _surface;
103
104     void accept_data ();
105     PBD::Signal0<void> DataReady;
106     PBD::ScopedConnectionList data_connections;
107 };
108
109 }
110 #endif