diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2013-04-04 00:32:52 -0400 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2013-04-04 00:32:52 -0400 |
commit | aaea166135ace01709f7e0be64f40be80f4107ec (patch) | |
tree | 0e794ef7a723e4aaf909b841a6816e405b4ceca1 /libs/canvas/line_set.cc | |
parent | 1d8bac08c0c00d44e22c581768a275e1b21a99a7 (diff) |
initial commit of hand merging, plus getting "ancient" waf script to work correctly
Diffstat (limited to 'libs/canvas/line_set.cc')
-rw-r--r-- | libs/canvas/line_set.cc | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/libs/canvas/line_set.cc b/libs/canvas/line_set.cc new file mode 100644 index 0000000000..c77ab7cf2b --- /dev/null +++ b/libs/canvas/line_set.cc @@ -0,0 +1,90 @@ +#include "pbd/xml++.h" +#include "canvas/line_set.h" +#include "canvas/utils.h" + +using namespace std; +using namespace ArdourCanvas; + +/* XXX: hard-wired to horizontal only */ + +class LineSorter { +public: + bool operator() (LineSet::Line& a, LineSet::Line& b) { + return a.y < b.y; + } +}; + +LineSet::LineSet (Group* parent) + : Item (parent) + , _height (0) +{ + +} + +XMLNode * +LineSet::get_state () const +{ + /* XXX */ + return new XMLNode ("LineSet"); +} + +void +LineSet::compute_bounding_box () const +{ + if (_lines.empty ()) { + _bounding_box = boost::optional<Rect> (); + _bounding_box_dirty = false; + return; + } + + _bounding_box = Rect (0, _lines.front().y, COORD_MAX, min (_height, _lines.back().y)); + _bounding_box_dirty = false; +} + +void +LineSet::set_height (Distance height) +{ + begin_change (); + + _height = height; + + _bounding_box_dirty = true; + end_change (); +} + +void +LineSet::render (Rect const & area, Cairo::RefPtr<Cairo::Context> context) const +{ + for (list<Line>::const_iterator i = _lines.begin(); i != _lines.end(); ++i) { + if (i->y > area.y1) { + break; + } else if (i->y > area.y0) { + set_source_rgba (context, i->color); + context->set_line_width (i->width); + context->move_to (area.x0, i->y); + context->line_to (area.x1, i->y); + context->stroke (); + } + } +} + +void +LineSet::add (Coord y, Distance width, Color color) +{ + begin_change (); + + _lines.push_back (Line (y, width, color)); + _lines.sort (LineSorter ()); + + _bounding_box_dirty = true; + end_change (); +} + +void +LineSet::clear () +{ + begin_change (); + _lines.clear (); + _bounding_box_dirty = true; + end_change (); +} |