X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=synfig-core%2Ftrunk%2Fsrc%2Fsynfig%2Fsavecanvas.cpp;h=eb2bf759d04843d8a181b08a282833a22ed1c96b;hb=756c0d29ac1742f231e6615f9a577e574e35a4af;hp=299472ba2b63be87213e20b6da2c144e5af67633;hpb=fb2d9bbd722ff979bc7f21b85c1e5a85cf03bf89;p=synfig.git diff --git a/synfig-core/trunk/src/synfig/savecanvas.cpp b/synfig-core/trunk/src/synfig/savecanvas.cpp index 299472b..eb2bf75 100644 --- a/synfig-core/trunk/src/synfig/savecanvas.cpp +++ b/synfig-core/trunk/src/synfig/savecanvas.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 @@ -79,6 +79,9 @@ using namespace synfig; /* === G L O B A L S ======================================================= */ +ReleaseVersion save_canvas_version = ReleaseVersion(RELEASE_VERSION_END-1); +int valuenode_too_new_count; + /* === P R O C E D U R E S ================================================= */ xmlpp::Element* encode_canvas(xmlpp::Element* root,Canvas::ConstHandle canvas); @@ -342,27 +345,6 @@ xmlpp::Element* encode_animated(xmlpp::Element* root,ValueNode_Animated::ConstHa return root; } -xmlpp::Element* encode_composite(xmlpp::Element* root,ValueNode_Composite::ConstHandle value_node,Canvas::ConstHandle canvas=0) -{ - assert(value_node); - root->set_name("composite"); - - root->set_attribute("type",ValueBase::type_name(value_node->get_type())); - - int i; - for(i=0;ilink_count();i++) - { - string name(value_node->link_name(i)); - assert(value_node->get_link(i)); - if(value_node->get_link(i)->is_exported()) - root->set_attribute(name,value_node->get_link(i)->get_relative_id(canvas)); - else - encode_value_node(root->add_child(name)->add_child("value_node"),value_node->get_link(i).constant(),canvas); - } - - return root; -} - xmlpp::Element* encode_subtract(xmlpp::Element* root,ValueNode_Subtract::ConstHandle value_node,Canvas::ConstHandle canvas=0) { assert(value_node); @@ -491,7 +473,26 @@ xmlpp::Element* encode_dynamic_list(xmlpp::Element* root,ValueNode_DynamicList:: xmlpp::Element* encode_linkable_value_node(xmlpp::Element* root,LinkableValueNode::ConstHandle value_node,Canvas::ConstHandle canvas=0) { assert(value_node); - root->set_name(value_node->get_name()); + + String name(value_node->get_name()); + ReleaseVersion saving_version(get_file_version()); + ReleaseVersion feature_version(LinkableValueNode::book()[name].release_version); + + if (saving_version < feature_version) + { + valuenode_too_new_count++; + warning("can't save <%s> valuenodes in this old file format version", name.c_str()); + + ValueBase value((*value_node)(0)); + encode_value(root,value,canvas); + + // ValueNode_Const::ConstHandle const_value(ValueNode_Const::create((*value_node)(0))); + // encode_value_node(root,const_value,canvas); + + return root; + } + + root->set_name(name); root->set_attribute("type",ValueBase::type_name(value_node->get_type())); @@ -517,9 +518,6 @@ xmlpp::Element* encode_value_node(xmlpp::Element* root,ValueNode::ConstHandle va if(ValueNode_Animated::ConstHandle::cast_dynamic(value_node)) encode_animated(root,ValueNode_Animated::ConstHandle::cast_dynamic(value_node),canvas); else - if(ValueNode_Composite::ConstHandle::cast_dynamic(value_node)) - encode_composite(root,ValueNode_Composite::ConstHandle::cast_dynamic(value_node),canvas); - else if(ValueNode_Subtract::ConstHandle::cast_dynamic(value_node)) encode_subtract(root,ValueNode_Subtract::ConstHandle::cast_dynamic(value_node),canvas); else @@ -738,6 +736,18 @@ xmlpp::Element* encode_canvas(xmlpp::Element* root,Canvas::ConstHandle canvas) return root; } +xmlpp::Element* encode_canvas_toplevel(xmlpp::Element* root,Canvas::ConstHandle canvas) +{ + valuenode_too_new_count = 0; + + xmlpp::Element* ret = encode_canvas(root, canvas); + + if (valuenode_too_new_count) + warning("saved %d valuenodes as constant values in old file format\n", valuenode_too_new_count); + + return ret; +} + bool synfig::save_canvas(const String &filename, Canvas::ConstHandle canvas) { @@ -755,7 +765,7 @@ synfig::save_canvas(const String &filename, Canvas::ConstHandle canvas) assert(canvas); xmlpp::Document document; - encode_canvas(document.create_root_node("canvas"),canvas); + encode_canvas_toplevel(document.create_root_node("canvas"),canvas); document.write_to_file_formatted(tmp_filename); } @@ -793,7 +803,19 @@ synfig::canvas_to_string(Canvas::ConstHandle canvas) xmlpp::Document document; - encode_canvas(document.create_root_node("canvas"),canvas); + encode_canvas_toplevel(document.create_root_node("canvas"),canvas); return document.write_to_string_formatted(); } + +void +synfig::set_file_version(ReleaseVersion version) +{ + save_canvas_version = version; +} + +ReleaseVersion +synfig::get_file_version() +{ + return save_canvas_version; +}