summaryrefslogtreecommitdiff
path: root/libs
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2013-04-17 15:23:01 -0400
committerPaul Davis <paul@linuxaudiosystems.com>2013-04-17 15:23:01 -0400
commit3737f346eeabb32de828172c851933c698bef5a6 (patch)
treeb87bbbb5a5d1a8200a7de159a87df4305caa1b37 /libs
parentec102f94e1105a6c9f445a0cde6c2dd1b6ea4b8b (diff)
parent8f2a2877b52894349f2f5f9315c5bf7498de4b02 (diff)
Merge branch 'cairocanvas' of git.ardour.org:ardour/ardour into cairocanvas
Diffstat (limited to 'libs')
-rw-r--r--libs/canvas/canvas/image.h22
-rw-r--r--libs/canvas/image.cc14
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