X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=synfig-core%2Ftrunk%2Fsrc%2Fsynfig%2Fcanvas.cpp;h=67f06b94fc1c9496ed7080b6c5a9ae3039b1bd82;hb=376a3dcd5c49955bebcb04543446e7378b8ef298;hp=8cf1f20bdcd777b08cb5a549766d78b94f28b9b4;hpb=78e15db42e8bd6cfce82576d3c1d1659200b2074;p=synfig.git diff --git a/synfig-core/trunk/src/synfig/canvas.cpp b/synfig-core/trunk/src/synfig/canvas.cpp index 8cf1f20..67f06b9 100644 --- a/synfig-core/trunk/src/synfig/canvas.cpp +++ b/synfig-core/trunk/src/synfig/canvas.cpp @@ -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::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::iterator iter = parent_set.begin(); iter != parent_set.end(); iter++) - { - Layer_PasteCanvas* paste_canvas = dynamic_cast(*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(*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 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::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 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 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 {