remove debug output and get logic correct to cause first render to always use the...
[ardour.git] / libs / canvas / image.cc
index 9deb184f2c67ca5b7e9b0bb1beed8e8c874808c7..46cadd0d1cc32008b3c0482725715970c11df2bc 100644 (file)
 
 using namespace ArdourCanvas;
 
-Image::Image (Group* group, Cairo::Format fmt, int width, int height)
-       : Item (group)
+Image::Image (Canvas* canvas, Cairo::Format fmt, int width, int height)
+       : Item (canvas)
+       , _format (fmt)
+       , _width (width)
+       , _height (height)
+       , _need_render (false)
+{
+       DataReady.connect (data_connections, MISSING_INVALIDATOR, boost::bind (&Image::accept_data, this), gui_context());
+}
+
+Image::Image (Item* parent, Cairo::Format fmt, int width, int height)
+       : Item (parent)
        , _format (fmt)
        , _width (width)
        , _height (height)
        , _need_render (false)
 {
-       boost::shared_ptr<Data> d0 (new Data (NULL, 0, 0, 0, _format)); _current = d0;
-       boost::shared_ptr<Data> d1 (new Data (NULL, 0, 0, 0, _format)); _pending = d1;
        DataReady.connect (data_connections, MISSING_INVALIDATOR, boost::bind (&Image::accept_data, this), gui_context());
 }
 
@@ -45,10 +53,13 @@ Image::render (Rect const& area, Cairo::RefPtr<Cairo::Context> context) const
                                                        _pending->stride);
                _current = _pending;
        }
+       
+       Rect self = item_to_window (Rect (0, 0, _width, _height));
+       boost::optional<Rect> draw = self.intersection (area);
 
-       if (_surface) {
-               context->set_source (_surface, 0, 0);
-               context->rectangle (area.x0, area.y0, area.width(), area.height());
+       if (_surface && draw) {
+               context->set_source (_surface, self.x0, self.y0);
+               context->rectangle (draw->x0, draw->y0, draw->width(), draw->height());
                context->fill ();
        }
 }