The return of threaded waveform rendering and related crashes.
[ardour.git] / libs / canvas / outline.cc
index 8db2c27f8fec9ac3f27de1bb5f5d7495136c27c7..9416859e59b0a8ef9269c042b211076f01731884 100644 (file)
@@ -1,57 +1,74 @@
+/*
+    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 <cairomm/context.h>
 
-#include "pbd/xml++.h"
 #include "pbd/compose.h"
 #include "pbd/convert.h"
 
 #include "ardour/utils.h"
+
+#include "canvas/item.h"
 #include "canvas/outline.h"
 #include "canvas/utils.h"
 #include "canvas/debug.h"
 
 using namespace ArdourCanvas;
 
-Outline::Outline (Group* parent)
-       : Item (parent)
+Outline::Outline (Item& self)
+       : _self (self)
        , _outline_color (0x000000ff)
-       , _outline_width (0.5)
+       , _outline_width (1.0)
        , _outline (true)
 {
-
 }
 
 void
 Outline::set_outline_color (Color color)
 {
-       begin_change ();
-       
-       _outline_color = color;
-
-       end_change ();
+       if (color != _outline_color) {
+               _self.begin_visual_change ();
+               _outline_color = color;
+               _self.end_visual_change ();
+       }
 }
 
 void
 Outline::set_outline_width (Distance width)
 {
-       begin_change ();
-       
-       _outline_width = width;
-
-       _bounding_box_dirty = true;
-       end_change ();
-
-       DEBUG_TRACE (PBD::DEBUG::CanvasItemsDirtied, "canvas item dirty: outline width change\n");      
+       if (width != _outline_width) {
+               _self.begin_change ();
+               _outline_width = width;
+               _self._bounding_box_dirty = true;
+               _self.end_change ();
+       }
 }
 
 void
 Outline::set_outline (bool outline)
 {
-       begin_change ();
-
-       _outline = outline;
-
-       _bounding_box_dirty = true;
-       end_change ();
+       if (outline != _outline) {
+               _self.begin_change ();
+               _outline = outline;
+               _self._bounding_box_dirty = true;
+               _self.end_change ();
+       }
 }
 
 void
@@ -61,20 +78,3 @@ Outline::setup_outline_context (Cairo::RefPtr<Cairo::Context> context) const
        context->set_line_width (_outline_width);
 }
 
-void
-Outline::add_outline_state (XMLNode* node) const
-{
-       node->add_property ("outline-color", string_compose ("%1", _outline_color));
-       node->add_property ("outline", _outline ? "yes" : "no");
-       node->add_property ("outline-width", string_compose ("%1", _outline_width));
-}
-
-void
-Outline::set_outline_state (XMLNode const * node)
-{
-       _outline_color = atoll (node->property("outline-color")->value().c_str());
-       _outline = PBD::string_is_affirmative (node->property("outline")->value().c_str());
-       _outline_width = atof (node->property("outline-width")->value().c_str());
-
-       _bounding_box_dirty = true;
-}