From bec46bc8d42dab13851b47714c1095d8c8f9f9c3 Mon Sep 17 00:00:00 2001 From: dooglus Date: Thu, 31 Jan 2008 23:43:38 +0000 Subject: [PATCH] Fix a crash that was happening if we had 2 exported canvases in a .sif file where the 2nd contained a pastecanvas that used the 1st as its canvas. The canvases are destructed in the order in which they appear in the .sif file, so by the time the 2nd is destroyed, the pastecanvas it contains no longer has a valid canvas parameter. The fix is to clear the canvas parameter of any pastecanvases using a canvas when the canvas itself is destroyed. git-svn-id: http://svn.voria.com/code@1541 1f10aa63-cdf2-0310-b900-c93c546f37ac --- synfig-core/trunk/src/synfig/canvas.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/synfig-core/trunk/src/synfig/canvas.cpp b/synfig-core/trunk/src/synfig/canvas.cpp index fcf8935..c51507a 100644 --- a/synfig-core/trunk/src/synfig/canvas.cpp +++ b/synfig-core/trunk/src/synfig/canvas.cpp @@ -90,6 +90,19 @@ 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 + 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); + 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(); -- 2.7.4