diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2013-04-17 15:23:01 -0400 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2013-04-17 15:23:01 -0400 |
commit | 3737f346eeabb32de828172c851933c698bef5a6 (patch) | |
tree | b87bbbb5a5d1a8200a7de159a87df4305caa1b37 /libs | |
parent | ec102f94e1105a6c9f445a0cde6c2dd1b6ea4b8b (diff) | |
parent | 8f2a2877b52894349f2f5f9315c5bf7498de4b02 (diff) |
Merge branch 'cairocanvas' of git.ardour.org:ardour/ardour into cairocanvas
Diffstat (limited to 'libs')
-rw-r--r-- | libs/canvas/canvas/image.h | 22 | ||||
-rw-r--r-- | libs/canvas/image.cc | 14 |
2 files changed, 28 insertions, 8 deletions
diff --git a/libs/canvas/canvas/image.h b/libs/canvas/canvas/image.h index a3b1a269ba..0dcf8e51b3 100644 --- a/libs/canvas/canvas/image.h +++ b/libs/canvas/canvas/image.h @@ -25,27 +25,42 @@ #include "canvas/item.h" +typedef void (*ImageReleaseCallback)(uint8_t *d, void *arg); + namespace ArdourCanvas { + class Image : public Item { public: Image (Group *, Cairo::Format, int width, int height); struct Data { - Data (boost::shared_array<uint8_t> d, int w, int h, int s, Cairo::Format fmt) + Data (uint8_t *d, int w, int h, int s, Cairo::Format fmt) : data (d) , width (w) , height (h) , stride (s) , format (fmt) + , destroy_callback(NULL) + , destroy_arg(NULL) {} - boost::shared_array<uint8_t> data; + virtual ~Data () { + if (destroy_callback) { + destroy_callback(data, destroy_arg); + } else { + free(data); + } + } + + uint8_t* data; int width; int height; int stride; Cairo::Format format; + ImageReleaseCallback destroy_callback; + void* destroy_arg; }; /** @@ -59,7 +74,8 @@ public: * ... to avoid collisions with Image deletion, some synchronization method * may be required or the use of shared_ptr<Image> or similar. */ - boost::shared_ptr<Data> get_image (); + boost::shared_ptr<Data> get_image (bool allocate_data = true); + /** * Queues a Data object to be used to redraw this Image item diff --git a/libs/canvas/image.cc b/libs/canvas/image.cc index 71a5df64dd..b13859aeda 100644 --- a/libs/canvas/image.cc +++ b/libs/canvas/image.cc @@ -36,7 +36,7 @@ void Image::render (Rect const& area, Cairo::RefPtr<Cairo::Context> context) const { if (_need_render && _pending) { - _surface = Cairo::ImageSurface::create (_pending->data.get(), + _surface = Cairo::ImageSurface::create (_pending->data, _pending->format, _pending->width, _pending->height, @@ -59,14 +59,18 @@ Image::compute_bounding_box () const } boost::shared_ptr<Image::Data> -Image::get_image () +Image::get_image (bool allocate_data) { /* can be called by any thread */ int stride = Cairo::ImageSurface::format_stride_for_width (_format, _width); - boost::shared_ptr<Data> d (new Data (boost::shared_array<uint8_t> (new uint8_t[stride*_height]), _width, _height, stride, _format)); - - return d; + if (allocate_data) { + boost::shared_ptr<Data> d (new Data (new uint8_t[stride*_height], _width, _height, stride, _format)); + return d; + } else { + boost::shared_ptr<Data> d (new Data (NULL, _width, _height, stride, _format)); + return d; + } } void |