summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2015-02-09 16:40:10 -0500
committerPaul Davis <paul@linuxaudiosystems.com>2015-02-09 16:40:10 -0500
commit736038556fa41607d54a57fd3339d4fd1782bddf (patch)
treef9bfe7a8ea40bba7de3d53cbacf8974955954f7d
parentef79d1c4d4ce45c0ad14b3dcaaff723b5f521aa2 (diff)
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
-rw-r--r--libs/canvas/canvas/item.h2
-rw-r--r--libs/canvas/item.cc14
2 files changed, 9 insertions, 7 deletions
diff --git a/libs/canvas/canvas/item.h b/libs/canvas/canvas/item.h
index 308b2437c3..60fadabfbd 100644
--- a/libs/canvas/canvas/item.h
+++ b/libs/canvas/canvas/item.h
@@ -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 ();
diff --git a/libs/canvas/item.cc b/libs/canvas/item.cc
index 9a851891d9..ab8764a97a 100644
--- a/libs/canvas/item.cc
+++ b/libs/canvas/item.cc
@@ -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) {