Apply 2004406: New add new Logarithm Valuenode
[synfig.git] / synfig-core / trunk / src / synfig / canvas.cpp
index 8cf1f20..67f06b9 100644 (file)
@@ -6,7 +6,7 @@
 **
 **     \legal
 **     Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
-**     Copyright (c) 2007 Chris Moore
+**     Copyright (c) 2007, 2008 Chris Moore
 **
 **     This package is free software; you can redistribute it and/or
 **     modify it under the terms of the GNU General Public License as
@@ -90,32 +90,24 @@ Canvas::on_changed()
 
 Canvas::~Canvas()
 {
-       bool keep_going = true;
-
        // we were having a crash where pastecanvas layers were still
        // refering to a canvas after it had been destroyed;  this code
        // will stop the pastecanvas layers from refering to the canvas
        // before the canvas is destroyed
 
        // the set_sub_canvas(0) ends up deleting the parent-child link,
-       // which modifies the set we're iterating through, invalidating
-       // the set iterator.  the outer while loop makes sure that we
-       // recreate the set iterator each time the set itself is modified
-       while (keep_going)
+       // which deletes the current element from the set we're iterating
+       // through, so we have to make sure we've incremented the iterator
+       // before we mess with the pastecanvas
+       std::set<Node*>::iterator iter = parent_set.begin();
+       while (iter != parent_set.end())
        {
-               keep_going = false;             // only keep going if we find a pastecanvas parent to clear
-               for (std::set<Node*>::iterator iter = parent_set.begin(); iter != parent_set.end(); iter++)
-               {
-                       Layer_PasteCanvas* paste_canvas = dynamic_cast<Layer_PasteCanvas*>(*iter);
-                       if(paste_canvas)
-                       {
-                               paste_canvas->set_sub_canvas(0);
-                               keep_going = true;
-                               break;                  // out of the for loop to the while loop
-                       }
-                       else
-                               warning("destroyed canvas has a parent that is not a pastecanvas - please report if repeatable");
-               }
+               Layer_PasteCanvas* paste_canvas = dynamic_cast<Layer_PasteCanvas*>(*iter);
+               iter++;
+               if(paste_canvas)
+                       paste_canvas->set_sub_canvas(0);
+               else
+                       warning("destroyed canvas has a parent that is not a pastecanvas - please report if repeatable");
        }
 
        //if(is_inline() && parent_) assert(0);
@@ -377,7 +369,6 @@ Canvas::_get_relative_id(etl::loose_handle<const Canvas> x)const
        return id;
 }
 
-
 ValueNode::Handle
 Canvas::find_value_node(const String &id)
 {
@@ -515,7 +506,6 @@ Canvas::remove_value_node(ValueNode::Handle x)
        x->set_id("");
 }
 
-
 etl::handle<Canvas>
 Canvas::surefind_canvas(const String &id)
 {
@@ -676,7 +666,6 @@ Canvas::find_canvas(const String &id)const
        return child_canvas->find_canvas(string(id,id.find_first_of(':')+1));
 }
 
-
 Canvas::Handle
 Canvas::create()
 {
@@ -714,10 +703,8 @@ Canvas::insert(iterator iter,etl::handle<Layer> x)
 
        x->set_canvas(this);
 
-
        add_child(x.get());
 
-
        LooseHandle correct_canvas(this);
        //while(correct_canvas->is_inline())correct_canvas=correct_canvas->parent();
        Layer::LooseHandle loose_layer(x);
@@ -739,11 +726,9 @@ Canvas::insert(iterator iter,etl::handle<Layer> x)
                                                                   &Canvas::remove_group_pair),
                                                           loose_layer))));
 
-
        if(!x->get_group().empty())
                add_group_pair(x->get_group(),x);
 
-
        changed();
 }
 
@@ -803,6 +788,7 @@ Canvas::clone(const GUID& deriv_guid)const
                // it was failing to ascertain the absolute pathname of the imported image, since it needs the pathname
                // of the canvas to get that, which is stored in the parent canvas
                canvas->parent_=parent();
+               canvas->rend_desc() = rend_desc();
                //canvas->set_inline(parent());
        }
 
@@ -994,7 +980,6 @@ Canvas::get_file_path()const
        return dirname(file_name_);
 }
 
-
 String
 Canvas::get_meta_data(const String& key)const
 {