X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=synfig-core%2Ftrunk%2Fsrc%2Fsynfig%2Fcanvas.cpp;h=b521efad83893187251d513d3af2e0515f6ed61a;hb=b0903893f1eb9b330be66e3eb98e799054bacca0;hp=3f4f8cf510b9865e5581b14b6f4e2904191e6716;hpb=4af1008129ca2853a1dfabcbf1fcf55e7675c4e1;p=synfig.git diff --git a/synfig-core/trunk/src/synfig/canvas.cpp b/synfig-core/trunk/src/synfig/canvas.cpp index 3f4f8cf..b521efa 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,6 +90,26 @@ Canvas::on_changed() Canvas::~Canvas() { + // 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 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()) + { + 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); _CanvasCounter::counter--; clear(); @@ -349,7 +369,6 @@ Canvas::_get_relative_id(etl::loose_handle x)const return id; } - ValueNode::Handle Canvas::find_value_node(const String &id) { @@ -487,7 +506,6 @@ Canvas::remove_value_node(ValueNode::Handle x) x->set_id(""); } - etl::handle Canvas::surefind_canvas(const String &id) { @@ -648,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() { @@ -686,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); @@ -711,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(); } @@ -966,7 +979,6 @@ Canvas::get_file_path()const return dirname(file_name_); } - String Canvas::get_meta_data(const String& key)const { @@ -1191,19 +1203,22 @@ synfig::optimize_layers(Time time, Context context, Canvas::Handle op_canvas, bo * returns true for layers which need to be able to see * their context. we can't encapsulate those. */ - if (composite && composite->get_blend_method() == Color::BLEND_STRAIGHT && + if (composite && + Color::is_straight(composite->get_blend_method()) && !composite->reads_context()) { Canvas::Handle sub_canvas(Canvas::create_inline(op_canvas)); sub_canvas->push_back(composite = composite->clone()); - sub_canvas->set_time(time); // region and outline don't calculate their bounding rects until their time is set layer = Layer::create("PasteCanvas"); + composite->set_description(strprintf("Wrapped clone of '%s'", composite->get_non_empty_description().c_str())); layer->set_description(strprintf("PasteCanvas wrapper for '%s'", composite->get_non_empty_description().c_str())); Layer_PasteCanvas* paste_canvas(static_cast(layer.get())); - paste_canvas->set_sub_canvas(sub_canvas); - paste_canvas->set_blend_method(Color::BLEND_STRAIGHT); + paste_canvas->set_blend_method(composite->get_blend_method()); paste_canvas->set_amount(composite->get_amount()); - composite->set_amount(1.0f); + sub_canvas->set_time(time); // region and outline don't calculate their bounding rects until their time is set + composite->set_blend_method(Color::BLEND_STRAIGHT); // do this before calling set_sub_canvas(), but after set_time() + composite->set_amount(1.0f); // after set_time() + paste_canvas->set_sub_canvas(sub_canvas); } }