diff options
author | Robin Gareus <robin@gareus.org> | 2016-07-05 00:39:39 +0200 |
---|---|---|
committer | Robin Gareus <robin@gareus.org> | 2016-07-05 00:39:39 +0200 |
commit | 17b162c5dac40ccd608fc90117d3fa5c2012cb71 (patch) | |
tree | edfe7f527e3826cdb7a37758440be4c4d6252689 /libs/canvas/poly_line.cc | |
parent | b6ccf0e22313c84e7b677509edb59d1e53c3dc5c (diff) |
add fill-area feature to poly-line
Diffstat (limited to 'libs/canvas/poly_line.cc')
-rw-r--r-- | libs/canvas/poly_line.cc | 47 |
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); |