diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2014-06-05 18:18:28 -0400 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2014-06-05 18:18:28 -0400 |
commit | 792fe016e7bf260c84d974abcb41ab0c7dbc5cfe (patch) | |
tree | ec6bf13074e4fbcd964452dadfa6fb4cb4bf1505 /libs/canvas | |
parent | eec24b6287004f977146eb831108029745fb313f (diff) |
clip rendering of ScrollGroup to just the part of the canvas covered by the scroll group.
This stops tracks from appearing to scroll up under the rulers, among other things.
Diffstat (limited to 'libs/canvas')
-rw-r--r-- | libs/canvas/canvas/scroll_group.h | 2 | ||||
-rw-r--r-- | libs/canvas/scroll_group.cc | 30 |
2 files changed, 32 insertions, 0 deletions
diff --git a/libs/canvas/canvas/scroll_group.h b/libs/canvas/canvas/scroll_group.h index d33e9b9080..7652ae2e9b 100644 --- a/libs/canvas/canvas/scroll_group.h +++ b/libs/canvas/canvas/scroll_group.h @@ -40,6 +40,8 @@ class LIBCANVAS_API ScrollGroup : public Group bool covers_canvas (Duple const& d) const; bool covers_window (Duple const& d) const; + void render (Rect const & area, Cairo::RefPtr<Cairo::Context> context) const; + private: ScrollSensitivity _scroll_sensitivity; Duple _scroll_offset; diff --git a/libs/canvas/scroll_group.cc b/libs/canvas/scroll_group.cc index 615be8007c..0ce612018a 100644 --- a/libs/canvas/scroll_group.cc +++ b/libs/canvas/scroll_group.cc @@ -20,6 +20,7 @@ #include "pbd/compose.h" +#include "canvas/canvas.h" #include "canvas/debug.h" #include "canvas/scroll_group.h" @@ -39,6 +40,35 @@ ScrollGroup::ScrollGroup (Group* parent, Duple position, ScrollSensitivity s) } void +ScrollGroup::render (Rect const & area, Cairo::RefPtr<Cairo::Context> context) const +{ + /* clip the draw to the area that this scroll group nominally occupies + * WITHOUT scroll offsets in effect + */ + + boost::optional<Rect> r = bounding_box(); + + if (!r) { + return; + } + + Rect self (_position.x, _position.y, _position.x + r.get().width(), _position.y + r.get().height()); + + self.x1 = min (_position.x + _canvas->width(), self.x1); + self.y1 = min (_position.y + _canvas->height(), self.y1); + + context->save (); + context->rectangle (self.x0, self.y0, self.width(), self.height()); + context->clip (); + + Group::render (area, context); + + context->restore (); + + +} + +void ScrollGroup::scroll_to (Duple const& d) { if (_scroll_sensitivity & ScrollsHorizontally) { |