canvas items must be able to use fractional positions when rendering.

This is required to be able to draw precise single pixel lines, as described
in the Cairo FAQ
This commit is contained in:
Paul Davis 2015-02-09 16:40:10 -05:00
parent ef79d1c4d4
commit 736038556f
2 changed files with 9 additions and 7 deletions

View file

@ -154,7 +154,7 @@ public:
Duple item_to_window (Duple const&, bool rounded = true) const;
Duple window_to_item (Duple const&) const;
Rect item_to_window (Rect const&) const;
Rect item_to_window (Rect const&, bool rounded = true) const;
Rect window_to_item (Rect const&) const;
void raise_to_top ();

View file

@ -231,14 +231,16 @@ Item::window_to_item (ArdourCanvas::Duple const & d) const
}
ArdourCanvas::Rect
Item::item_to_window (ArdourCanvas::Rect const & r) const
Item::item_to_window (ArdourCanvas::Rect const & r, bool rounded) const
{
Rect ret = item_to_canvas (r).translate (-scroll_offset());
ret.x0 = round (ret.x0);
ret.x1 = round (ret.x1);
ret.y0 = round (ret.y0);
ret.y1 = round (ret.y1);
if (rounded) {
ret.x0 = round (ret.x0);
ret.x1 = round (ret.x1);
ret.y0 = round (ret.y0);
ret.y1 = round (ret.y1);
}
return ret;
}
@ -766,7 +768,7 @@ Item::render_children (Rect const & area, Cairo::RefPtr<Cairo::Context> context)
continue;
}
Rect item = (*i)->item_to_window (item_bbox.get());
Rect item = (*i)->item_to_window (item_bbox.get(), false);
boost::optional<Rect> d = item.intersection (area);
if (d) {