summaryrefslogtreecommitdiff
path: root/libs/canvas
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
parentb6ccf0e22313c84e7b677509edb59d1e53c3dc5c (diff)
add fill-area feature to poly-line
Diffstat (limited to 'libs/canvas')
-rw-r--r--libs/canvas/canvas/poly_item.h2
-rw-r--r--libs/canvas/canvas/poly_line.h10
-rw-r--r--libs/canvas/poly_line.cc47
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);