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 | |
parent | b6ccf0e22313c84e7b677509edb59d1e53c3dc5c (diff) |
add fill-area feature to poly-line
Diffstat (limited to 'libs/canvas')
-rw-r--r-- | libs/canvas/canvas/poly_item.h | 2 | ||||
-rw-r--r-- | libs/canvas/canvas/poly_line.h | 10 | ||||
-rw-r--r-- | libs/canvas/poly_line.cc | 47 |
3 files changed, 55 insertions, 4 deletions
diff --git a/libs/canvas/canvas/poly_item.h b/libs/canvas/canvas/poly_item.h index bdb7c20b1a..311ca80933 100644 --- a/libs/canvas/canvas/poly_item.h +++ b/libs/canvas/canvas/poly_item.h @@ -32,7 +32,7 @@ public: PolyItem (Canvas*); PolyItem (Item*); - void compute_bounding_box () const; + virtual void compute_bounding_box () const; virtual void set (Points const &); Points const & get () const; diff --git a/libs/canvas/canvas/poly_line.h b/libs/canvas/canvas/poly_line.h index fce013dfd6..7c6894719c 100644 --- a/libs/canvas/canvas/poly_line.h +++ b/libs/canvas/canvas/poly_line.h @@ -28,15 +28,16 @@ namespace ArdourCanvas { class LIBCANVAS_API PolyLine : public PolyItem { - public: +public: PolyLine (Canvas*); PolyLine (Item*); void render (Rect const & area, Cairo::RefPtr<Cairo::Context>) const; virtual void set_steps (Points const &, bool stepped); + virtual void compute_bounding_box () const; - bool covers (Duple const &) const; + bool covers (Duple const &) const; /** * Set the distance at which a point will be considered to be covered * by the line. For the definition of "distance" see @@ -44,8 +45,11 @@ class LIBCANVAS_API PolyLine : public PolyItem */ void set_covers_threshold (double); - private: + void set_fill_y1 (double); + +private: double _threshold; + double _y1; }; } 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); |