merge from master
[ardour.git] / libs / canvas / poly_item.cc
index d6e67ede0c47b5094fbc929753f0dbec5d94b53e..2500ac90e2ea034bb7aea114549856c1cc70a758 100644 (file)
@@ -1,6 +1,24 @@
+/*
+    Copyright (C) 2011-2013 Paul Davis
+    Author: Carl Hetherington <cth@carlh.net>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
 #include <algorithm>
 
-#include "pbd/xml++.h"
 #include "pbd/compose.h"
 
 #include "canvas/poly_item.h"
@@ -52,9 +70,46 @@ PolyItem::render_path (Rect const & /*area*/, Cairo::RefPtr<Cairo::Context> cont
        bool done_first = false;
        for (Points::const_iterator i = _points.begin(); i != _points.end(); ++i) {
                if (done_first) {
-                       context->line_to (i->x, i->y);
+                       Duple c = item_to_window (Duple (i->x, i->y));
+                       context->line_to (c.x, c.y);
+               } else {
+                       Duple c = item_to_window (Duple (i->x, i->y));
+                       context->move_to (c.x, c.y);
+                       done_first = true;
+               }
+       }
+}
+
+void
+PolyItem::render_curve (Rect const & area, Cairo::RefPtr<Cairo::Context> context, Points const & first_control_points, Points const & second_control_points) const
+{
+       bool done_first = false;
+
+       if (_points.size() <= 2) {
+               render_path (area, context);
+               return;
+       }
+
+       Points::const_iterator cp1 = first_control_points.begin();
+       Points::const_iterator cp2 = second_control_points.begin();
+
+       for (Points::const_iterator i = _points.begin(); i != _points.end(); ++i) {
+
+               if (done_first) {
+
+                       Duple c1 = item_to_window (Duple (cp1->x, cp1->y));
+                       Duple c2 = item_to_window (Duple (cp2->x, cp2->y));
+                       Duple c3 = item_to_window (Duple (i->x, i->y));
+
+                       context->curve_to (c1.x, c1.y, c2.x, c2.y, c3.x, c3.y);
+
+                       cp1++;
+                       cp2++;
+                       
                } else {
-                       context->move_to (i->x, i->y);
+
+                       Duple c = item_to_window (Duple (i->x, i->y));
+                       context->move_to (c.x, c.y);
                        done_first = true;
                }
        }
@@ -77,33 +132,6 @@ PolyItem::get () const
        return _points;
 }
 
-void
-PolyItem::add_poly_item_state (XMLNode* node) const
-{
-       add_item_state (node);
-       
-       for (Points::const_iterator i = _points.begin(); i != _points.end(); ++i) {
-               XMLNode* p = new XMLNode ("Point");
-               p->add_property ("x", string_compose ("%1", i->x));
-               p->add_property ("y", string_compose ("%1", i->y));
-               node->add_child_nocopy (*p);
-       }
-}
-
-void
-PolyItem::set_poly_item_state (XMLNode const * node)
-{
-       XMLNodeList const & children = node->children ();
-       for (XMLNodeList::const_iterator i = children.begin(); i != children.end(); ++i) {
-               Duple p;
-               p.x = atof ((*i)->property("x")->value().c_str());
-               p.y = atof ((*i)->property("y")->value().c_str());
-               _points.push_back (p);
-       }
-
-       _bounding_box_dirty = true;
-}
-
 void
 PolyItem::dump (ostream& o) const
 {