X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fcanvas%2Frectangle.cc;h=57c26874c454de36fb256c46f3b3f75cd7bc751b;hb=e36f74e071d4c14862d23da5ff0d49df0940d536;hp=06a41e074c0fe6514c58b40ca12b7cdfc4778bb3;hpb=cf293d05934f3f8d664127967dad20877d8f9594;p=ardour.git diff --git a/libs/canvas/rectangle.cc b/libs/canvas/rectangle.cc index 06a41e074c..57c26874c4 100644 --- a/libs/canvas/rectangle.cc +++ b/libs/canvas/rectangle.cc @@ -55,44 +55,48 @@ Rectangle::render (Rect const & area, Cairo::RefPtr context) con boost::optional r = self.intersection (area); if (!r) { - std::cerr << whatami() << '/' << name << " not covered by render area! ... " << self << " vs. " << area << std::endl; return; } Rect draw = r.get (); - if (_fill) { + if (_fill && !_transparent) { if (_stops.empty()) { setup_fill_context (context); } else { setup_gradient_context (context, self, Duple (draw.x0, draw.y0)); } + context->rectangle (draw.x0, draw.y0, draw.width(), draw.height()); context->fill (); - } + } if (_outline) { setup_outline_context (context); + + /* see the cairo FAQ on single pixel lines to see why we do + * the 0.5 pixel additions. + */ if (_outline_what == What (LEFT|RIGHT|BOTTOM|TOP)) { - context->rectangle (self.x0 + 0.5, self.y0 + 0.5, self.width(), self.height()); + context->rectangle (self.x0 + 0.5, self.y0 + 0.5, self.width() - 1.0, self.height() - 1.0); } else { - context->set_line_cap (Cairo::LINE_CAP_SQUARE); - - /* see the cairo FAQ on single pixel lines to see why we do - * this expansion of the perimeter. - */ - if (_outline_what & LEFT) { /* vertical line: move x-coordinate by 0.5 pixels */ context->move_to (self.x0 + 0.5, self.y0); context->line_to (self.x0 + 0.5, self.y1); } + if (_outline_what & TOP) { + /* horizontal line: move y-coordinate by 0.5 pixels */ + context->move_to (self.x0, self.y0 + 0.5); + context->line_to (self.x1, self.y0 + 0.5); + } + if (_outline_what & BOTTOM) { /* horizontal line: move y-coordinate by 0.5 pixels */ context->move_to (self.x0, self.y1 - 0.5); @@ -101,15 +105,10 @@ Rectangle::render (Rect const & area, Cairo::RefPtr context) con if (_outline_what & RIGHT) { /* vertical line: move x-coordinate by 0.5 pixels */ - context->move_to (self.x1 - 0.5, self.y0); - context->line_to (self.x1 - 0.5, self.y1); + context->move_to (self.x1 + 0.5, self.y0); + context->line_to (self.x1 + 0.5, self.y1); } - if (_outline_what & TOP) { - /* horizontal line: move y-coordinate by 0.5 pixels */ - context->move_to (self.x0, self.y0 + 0.5); - context->line_to (self.x1, self.y0 + 0.5); - } } context->stroke (); @@ -121,15 +120,14 @@ Rectangle::compute_bounding_box () const { if (!_rect.empty()) { Rect r = _rect.fix (); + /* take into acount the 0.5 addition to the bounding + box for the right and bottom edges, see ::render() above + */ - /* our outlines are always inside our coordinates, but we have - * to ensure that our bounding box fully *contains* the - * rectangle - * - * XXX: or something like that, waffle. - * - */ - _bounding_box = r.expand (1.0); + r.x1 += 1.0; // XXX this makes no sense but is necessary + r.y1 += 0.5; + + _bounding_box = r; } _bounding_box_dirty = false; @@ -141,82 +139,77 @@ Rectangle::set (Rect const & r) /* We don't update the bounding box here; it's just as cheap to do it when asked. */ - - begin_change (); - - _rect = r; - - _bounding_box_dirty = true; - end_change (); - DEBUG_TRACE (PBD::DEBUG::CanvasItemsDirtied, "canvas item dirty: rectangle change (set)\n"); + if (r != _rect) { + + begin_change (); + + _rect = r; + + _bounding_box_dirty = true; + end_change (); + } } void Rectangle::set_x0 (Coord x0) { - begin_change (); - - _rect.x0 = x0; - - _bounding_box_dirty = true; - end_change (); - - DEBUG_TRACE (PBD::DEBUG::CanvasItemsDirtied, "canvas item dirty: rectangle change (x0)\n"); + if (x0 != _rect.x0) { + begin_change (); + + _rect.x0 = x0; + + _bounding_box_dirty = true; + end_change (); + } } void Rectangle::set_y0 (Coord y0) { - begin_change (); - - _rect.y0 = y0; - - _bounding_box_dirty = true; - end_change(); - - DEBUG_TRACE (PBD::DEBUG::CanvasItemsDirtied, "canvas item dirty: rectangle change (y0)\n"); + if (y0 != _rect.y0) { + begin_change (); + + _rect.y0 = y0; + + _bounding_box_dirty = true; + end_change(); + } } void Rectangle::set_x1 (Coord x1) { - begin_change (); - - _rect.x1 = x1; - - _bounding_box_dirty = true; - end_change (); - - DEBUG_TRACE (PBD::DEBUG::CanvasItemsDirtied, "canvas item dirty: rectangle change (x1)\n"); + if (x1 != _rect.x1) { + begin_change (); + + _rect.x1 = x1; + + _bounding_box_dirty = true; + end_change (); + } } void Rectangle::set_y1 (Coord y1) { - begin_change (); - - _rect.y1 = y1; - - _bounding_box_dirty = true; - end_change (); - - DEBUG_TRACE (PBD::DEBUG::CanvasItemsDirtied, "canvas item dirty: rectangle change (y1)\n"); + if (y1 != _rect.y1) { + begin_change (); + + _rect.y1 = y1; + + _bounding_box_dirty = true; + end_change (); + } } void Rectangle::set_outline_what (What what) { - begin_change (); - - _outline_what = what; - - end_change (); -} - -void -Rectangle::set_outline_what (int what) -{ - set_outline_what ((What) what); + if (what != _outline_what) { + begin_visual_change (); + _outline_what = what; + end_visual_change (); + } }