From 1df483d3db901c9c2b9a0adae91756d374f82b22 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Fri, 14 Feb 2014 09:49:16 -0500 Subject: [PATCH] since we now expand rectangles to the right always, adjust the bounding box computation --- libs/canvas/rectangle.cc | 34 +++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/libs/canvas/rectangle.cc b/libs/canvas/rectangle.cc index 0b7a76b8a7..57aa92d040 100644 --- a/libs/canvas/rectangle.cc +++ b/libs/canvas/rectangle.cc @@ -85,14 +85,24 @@ Rectangle::render (Rect const & area, Cairo::RefPtr context) con } else { - // context->set_line_cap (Cairo::LINE_CAP_SQUARE); - 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); + } + + /* in theory, you'd expect us to adjust these two by + * MINUS 0.5 pixels. But the way that Cairo apparently + * does rounding can lead that approach to draw on the + * wrong pixel coordinate. So we add 0.5 even here. + */ + if (_outline_what & BOTTOM) { /* horizontal line: move y-coordinate by 0.5 pixels */ context->move_to (self.x0, self.y1 + 0.5); @@ -105,11 +115,6 @@ Rectangle::render (Rect const & area, Cairo::RefPtr context) con 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 +126,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 = _rect.fix (); + r.x1 += 0.5; + r.y1 += 0.5; + + _bounding_box = r; } _bounding_box_dirty = false;