X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fcanvas%2Fcanvas%2Fimage.h;h=292de567230b8faea47ec1d5a4cc77a0050a5e89;hb=9a0a2a29b53a7d8b74d64039a3a594e54262ef29;hp=a3b1a269ba50a5c00274f50f604d82396191663e;hpb=be23e48e7f11a806eef043313606d62856abeb40;p=ardour.git diff --git a/libs/canvas/canvas/image.h b/libs/canvas/canvas/image.h index a3b1a269ba..292de56723 100644 --- a/libs/canvas/canvas/image.h +++ b/libs/canvas/canvas/image.h @@ -23,43 +23,61 @@ #include #include +#include "canvas/visibility.h" #include "canvas/item.h" +typedef void (*ImageReleaseCallback)(uint8_t *d, void *arg); + namespace ArdourCanvas { -class Image : public Item + +class LIBCANVAS_API Image : public Item { public: - Image (Group *, Cairo::Format, int width, int height); - + Image (Canvas *, Cairo::Format, int width, int height); + Image (Item*, Cairo::Format, int width, int height); + struct Data { - Data (boost::shared_array 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 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; }; - /** - * Returns a shared_ptr to a Data object that can be used to + /** + * Returns a shared_ptr to a Data object that can be used to * write image data to. The Data object will contain a pointer * to the buffer, along with image properties that may be * useful during the data writing. - * + * * Can be called from any thread BUT .. * * ... to avoid collisions with Image deletion, some synchronization method * may be required or the use of shared_ptr or similar. */ - boost::shared_ptr get_image (); + boost::shared_ptr get_image (bool allocate_data = true); + /** * Queues a Data object to be used to redraw this Image item @@ -74,12 +92,11 @@ public: void render (Rect const &, Cairo::RefPtr) const; void compute_bounding_box () const; - + private: Cairo::Format _format; int _width; int _height; - int _data; mutable boost::shared_ptr _current; boost::shared_ptr _pending; mutable bool _need_render;