summaryrefslogtreecommitdiff
path: root/libs/canvas/poly_line.cc
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2016-07-05 00:39:39 +0200
committerRobin Gareus <robin@gareus.org>2016-07-05 00:39:39 +0200
commit17b162c5dac40ccd608fc90117d3fa5c2012cb71 (patch)
treeedfe7f527e3826cdb7a37758440be4c4d6252689 /libs/canvas/poly_line.cc
parentb6ccf0e22313c84e7b677509edb59d1e53c3dc5c (diff)
add fill-area feature to poly-line
Diffstat (limited to 'libs/canvas/poly_line.cc')
-rw-r--r--libs/canvas/poly_line.cc47
1 files changed, 47 insertions, 0 deletions
diff --git a/libs/canvas/poly_line.cc b/libs/canvas/poly_line.cc
index 5d6abb9814..5086df76a3 100644
--- a/libs/canvas/poly_line.cc
+++ b/libs/canvas/poly_line.cc
@@ -28,6 +28,7 @@ using namespace ArdourCanvas;
PolyLine::PolyLine (Canvas* c)
: PolyItem (c)
, _threshold (1.0)
+ , _y1 (0)
{
}
@@ -38,8 +39,54 @@ PolyLine::PolyLine (Item* parent)
}
void
+PolyLine::compute_bounding_box () const
+{
+ PolyItem::compute_bounding_box ();
+ if (_y1 > 0 && _bounding_box) {
+ _bounding_box.get().x0 = 0;
+ _bounding_box.get().x1 = COORD_MAX;
+ if (_y1 > _bounding_box.get().y1) {
+ _bounding_box.get().y1 = _y1;
+ }
+ }
+}
+
+void
+PolyLine::set_fill_y1 (double y1) {
+ begin_change ();
+ _bounding_box_dirty = true;
+ _y1 = y1;
+ end_change ();
+}
+
+void
PolyLine::render (Rect const & area, Cairo::RefPtr<Cairo::Context> context) const
{
+ if (_fill && _y1 > 0 && _points.size() > 0) {
+ const ArdourCanvas::Rect& vp (_canvas->visible_area());
+ setup_fill_context (context);
+
+ Duple y (0, _y1);
+ float y1 = item_to_window (y).y;
+ render_path (area, context);
+ Duple c0 (item_to_window (_points.back()));
+ Duple c1 (item_to_window (_points.front()));
+ if (c0.x < vp.x1) {
+ context->line_to (vp.x1, c0.y);
+ context->line_to (vp.x1, y1);
+ } else {
+ context->line_to (vp.x1, y1);
+ }
+ if (c1.x > vp.x0) {
+ context->line_to (vp.x0, y1);
+ context->line_to (vp.x0, c1.y);
+ } else {
+ context->line_to (vp.x0, y1);
+ }
+ context->close_path ();
+ context->fill ();
+ }
+
if (_outline) {
setup_outline_context (context);
render_path (area, context);