diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2013-10-31 11:49:36 -0400 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2013-10-31 11:49:36 -0400 |
commit | b46244d527b40e3fc224f49c0555c04af0ceee49 (patch) | |
tree | b2d4294af2f05cd8ef929e5157edec17ee5790de /libs | |
parent | ff560fa361721849a66254f18b769a9be6346bfd (diff) |
finally (?) fix up logic for rectangle drawing (fill+stroke) to tackle what is hopefully the last of the expose problems
Diffstat (limited to 'libs')
-rw-r--r-- | libs/canvas/canvas.cc | 20 | ||||
-rw-r--r-- | libs/canvas/group.cc | 40 | ||||
-rw-r--r-- | libs/canvas/rectangle.cc | 43 |
3 files changed, 57 insertions, 46 deletions
diff --git a/libs/canvas/canvas.cc b/libs/canvas/canvas.cc index 77a9cddd62..081206d78b 100644 --- a/libs/canvas/canvas.cc +++ b/libs/canvas/canvas.cc @@ -85,12 +85,18 @@ Canvas::render (Rect const & area, Cairo::RefPtr<Cairo::Context> const & context boost::optional<Rect> draw = root_bbox->intersection (area); if (draw) { + + // context->rectangle (area.x0, area.y0, area.x1 - area.x0, area.y1 - area.y0); + // context->set_source_rgba (1.0, 0, 0, 1.0); + // context->fill (); + /* there's a common area between the root and the requested area, so render it. */ _root.render (*draw, context); } + } ostream& @@ -185,7 +191,10 @@ Canvas::window_to_canvas (Duple const & d) const Duple Canvas::canvas_to_window (Duple const & d) const { - return d.translate (Duple (-_scroll_offset_x, -_scroll_offset_y)); + Duple wd = d.translate (Duple (-_scroll_offset_x, -_scroll_offset_y)); + wd.x = round (wd.x); + wd.y = round (wd.y); + return wd; } Rect @@ -197,7 +206,12 @@ Canvas::window_to_canvas (Rect const & r) const Rect Canvas::canvas_to_window (Rect const & r) const { - return r.translate (Duple (-_scroll_offset_x, -_scroll_offset_y)); + Rect wr = r.translate (Duple (-_scroll_offset_x, -_scroll_offset_y)); + wr.x0 = floor (wr.x0); + wr.x1 = ceil (wr.x1); + wr.y0 = floor (wr.y0); + wr.y1 = ceil (wr.y1); + return wr; } /** Called when an item has moved. @@ -369,7 +383,6 @@ GtkCanvas::enter_leave_items (Duple const & point, int state) if (bbox) { if (!new_item->item_to_canvas (bbox.get()).contains (point)) { leave_event.detail = GDK_NOTIFY_UNKNOWN; - cerr << string_compose ("\tLeave %1 %2\n", new_item->whatami(), new_item->name); DEBUG_TRACE (PBD::DEBUG::CanvasEvents, string_compose ("Leave %1 %2\n", new_item->whatami(), new_item->name)); (*i)->Event (reinterpret_cast<GdkEvent*> (&leave_event)); within_items.erase (i); @@ -388,7 +401,6 @@ GtkCanvas::enter_leave_items (Duple const & point, int state) if (new_item->Event (reinterpret_cast<GdkEvent*> (&enter_event))) { - cerr << string_compose ("\tEntered %1 %2\n", new_item->whatami(), new_item->name); DEBUG_TRACE (PBD::DEBUG::CanvasEvents, string_compose ("Enter %1 %2\n", new_item->whatami(), new_item->name)); break; } diff --git a/libs/canvas/group.cc b/libs/canvas/group.cc index 0e2c1dbf94..54c50ac595 100644 --- a/libs/canvas/group.cc +++ b/libs/canvas/group.cc @@ -106,37 +106,41 @@ Group::render (Rect const & area, Cairo::RefPtr<Cairo::Context> context) const } Rect item = (*i)->item_to_window (item_bbox.get()); - item.expand (0.5); - boost::optional<Rect> draw = item.intersection (area); + boost::optional<Rect> d = item.intersection (area); - if (draw) { + if (d) { + Rect draw = d.get(); + if (draw.width() && draw.height()) { #ifdef CANVAS_DEBUG - if (DEBUG_ENABLED(PBD::DEBUG::CanvasRender)) { - if (dynamic_cast<Group*>(*i) == 0) { - cerr << _canvas->render_indent() << "render " - << ' ' - << (*i)->whatami() - << ' ' - << (*i)->name - << " item = " - << item - << " intersect = " - << draw.get() - << endl; + if (DEBUG_ENABLED(PBD::DEBUG::CanvasRender)) { + if (dynamic_cast<Group*>(*i) == 0) { + cerr << _canvas->render_indent() << "render " + << ' ' + << (*i)->whatami() + << ' ' + << (*i)->name + << " item = " + << item + << " intersect = " + << draw + << endl; + } } - } #endif - (*i)->render (area, context); - ++render_count; + (*i)->render (area, context); + ++render_count; + } } else { + #ifdef CANVAS_DEBUG if (DEBUG_ENABLED(PBD::DEBUG::CanvasRender)) { //cerr << string_compose ("%1skip render of %2 %3, no intersection\n", _canvas->render_indent(), (*i)->whatami(), // (*i)->name); } #endif + } } diff --git a/libs/canvas/rectangle.cc b/libs/canvas/rectangle.cc index e3508429b7..d90fd3a943 100644 --- a/libs/canvas/rectangle.cc +++ b/libs/canvas/rectangle.cc @@ -53,24 +53,14 @@ void Rectangle::render (Rect const & area, Cairo::RefPtr<Cairo::Context> context) const { Rect self = item_to_window (_rect); - boost::optional<Rect> d = self.intersection (area); + boost::optional<Rect> r = self.intersection (area); - if (!d) { + if (!r) { + std::cerr << whatami() << '/' << name << " not covered by render area! ... " << self << " vs. " << area << std::endl; return; } - - Rect draw = d.get(); - static const double boundary = 0.5; - const double x_limit = _canvas->visible_area().width(); - - draw.x0 = max (self.x0, max (0.0, draw.x0 - boundary)); - draw.x1 = min (self.x1, min (x_limit, draw.x1 + boundary)); - draw.y0 = max (self.y0, max (0.0, draw.y0 - boundary)); - draw.y1 = min (self.y1, min (x_limit, draw.y1 + boundary)); - - Rect fill_rect = draw; - Rect stroke_rect = fill_rect.expand (0.5); + Rect draw = r.get (); if (_fill) { if (_stops.empty()) { @@ -78,7 +68,7 @@ Rectangle::render (Rect const & area, Cairo::RefPtr<Cairo::Context> context) con } else { setup_gradient_context (context, self, Duple (draw.x0, draw.y0)); } - context->rectangle (fill_rect.x0, fill_rect.y0, fill_rect.width(), fill_rect.height()); + context->rectangle (draw.x0, draw.y0, draw.width(), draw.height()); context->fill (); } @@ -86,27 +76,32 @@ Rectangle::render (Rect const & area, Cairo::RefPtr<Cairo::Context> context) con setup_outline_context (context); + context->save (); + context->rectangle (draw.x0, draw.y0, draw.width(), draw.height()); + context->clip (); + if (_outline_what & LEFT) { - context->move_to (stroke_rect.x0, stroke_rect.y0); - context->line_to (stroke_rect.x0, stroke_rect.y1); + context->move_to (self.x0, self.y0); + context->line_to (self.x0, self.y1); } if (_outline_what & BOTTOM) { - context->move_to (stroke_rect.x0, stroke_rect.y1); - context->line_to (stroke_rect.x1, stroke_rect.y1); + context->move_to (self.x0, self.y1); + context->line_to (self.x1, self.y1); } if (_outline_what & RIGHT) { - context->move_to (stroke_rect.x1, stroke_rect.y0); - context->line_to (stroke_rect.x1, stroke_rect.y1); + context->move_to (self.x1, self.y0); + context->line_to (self.x1, self.y1); } if (_outline_what & TOP) { - context->move_to (stroke_rect.x0, stroke_rect.y0); - context->line_to (stroke_rect.x1, stroke_rect.y0); + context->move_to (self.x0, self.y0); + context->line_to (self.x1, self.y0); } context->stroke (); + context->restore (); } } @@ -114,7 +109,7 @@ void Rectangle::compute_bounding_box () const { Rect r = _rect.fix (); - _bounding_box = boost::optional<Rect> (r.expand (_outline_width)); + _bounding_box = boost::optional<Rect> (r.expand (_outline_width/2.0)); _bounding_box_dirty = false; } |