X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=synfig-core%2Ftrunk%2Fsrc%2Fsynfig%2Fsavecanvas.cpp;h=8ccb099373b3ccf58adf5fc29228e2878d0349a2;hb=99b75ef1bb279e2314516f922f05696263d5bd27;hp=91f5dfa9c06fb17b1da20c9668b23c87020dd22a;hpb=bbf05c1d5f53f61ec5b033c5c305a497d8389d46;p=synfig.git diff --git a/synfig-core/trunk/src/synfig/savecanvas.cpp b/synfig-core/trunk/src/synfig/savecanvas.cpp index 91f5dfa..8ccb099 100644 --- a/synfig-core/trunk/src/synfig/savecanvas.cpp +++ b/synfig-core/trunk/src/synfig/savecanvas.cpp @@ -6,6 +6,7 @@ ** ** \legal ** Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley +** Copyright (c) 2007 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 @@ -57,6 +58,10 @@ #include "gradient.h" #include +extern "C" { +#include +} + #endif /* === U S I N G =========================================================== */ @@ -96,7 +101,7 @@ xmlpp::Element* encode_real(xmlpp::Element* root,Real v) return root; } -xmlpp::Element* encode_time(xmlpp::Element* root,Time t, float fps=0) +xmlpp::Element* encode_time(xmlpp::Element* root,Time t, float /*fps*/=0) { root->set_name("time"); //root->set_attribute("value",t.get_string(fps)); @@ -268,8 +273,18 @@ xmlpp::Element* encode_animated(xmlpp::Element* root,ValueNode_Animated::ConstHa //waypoint_node->add_child(encode_value(iter->get_value(),canvas)); if(iter->get_value_node()->is_exported()) waypoint_node->set_attribute("use",iter->get_value_node()->get_relative_id(canvas)); - else - encode_value_node(waypoint_node->add_child("value_node"),iter->get_value_node(),canvas); + else { + ValueNode::ConstHandle value_node = iter->get_value_node(); + if(ValueNode_Const::ConstHandle::cast_dynamic(value_node)) { + const ValueBase data = ValueNode_Const::ConstHandle::cast_dynamic(value_node)->get_value(); + if (data.get_type() == ValueBase::TYPE_CANVAS) + waypoint_node->set_attribute("use",data.get(Canvas::Handle()).get()->get_relative_id(canvas)); + else + encode_value_node(waypoint_node->add_child("value_node"),iter->get_value_node(),canvas); + } + else + encode_value_node(waypoint_node->add_child("value_node"),iter->get_value_node(),canvas); + } switch(iter->get_before()) { @@ -277,7 +292,9 @@ xmlpp::Element* encode_animated(xmlpp::Element* root,ValueNode_Animated::ConstHa waypoint_node->set_attribute("before","halt"); break; case INTERPOLATION_LINEAR: - waypoint_node->set_attribute("before","linear"); + // This is the default value for angles, so don't add a new attribute for them + if (value_node->get_type() != ValueBase::TYPE_ANGLE) + waypoint_node->set_attribute("before","linear"); break; case INTERPOLATION_MANUAL: waypoint_node->set_attribute("before","manual"); @@ -286,7 +303,9 @@ xmlpp::Element* encode_animated(xmlpp::Element* root,ValueNode_Animated::ConstHa waypoint_node->set_attribute("before","constant"); break; case INTERPOLATION_TCB: - // This is the default value, so don't add a new attribute + // This is the default value, so don't add a new attribute (unless it's an angle - they default to linear) + if (value_node->get_type() == ValueBase::TYPE_ANGLE) + waypoint_node->set_attribute("before","auto"); break; default: error("Unknown waypoint type for \"before\" attribute"); @@ -298,7 +317,9 @@ xmlpp::Element* encode_animated(xmlpp::Element* root,ValueNode_Animated::ConstHa waypoint_node->set_attribute("after","halt"); break; case INTERPOLATION_LINEAR: - waypoint_node->set_attribute("after","linear"); + // This is the default value for angles, so don't add a new attribute for them + if (value_node->get_type() != ValueBase::TYPE_ANGLE) + waypoint_node->set_attribute("after","linear"); break; case INTERPOLATION_MANUAL: waypoint_node->set_attribute("after","manual"); @@ -307,10 +328,12 @@ xmlpp::Element* encode_animated(xmlpp::Element* root,ValueNode_Animated::ConstHa waypoint_node->set_attribute("after","constant"); break; case INTERPOLATION_TCB: - // This is the default value, so don't add a new attribute + // This is the default value, so don't add a new attribute (unless it's an angle - they default to linear) + if (value_node->get_type() == ValueBase::TYPE_ANGLE) + waypoint_node->set_attribute("after","auto"); break; default: - error("Unknown waypoint type for \"before\" attribute"); + error("Unknown waypoint type for \"after\" attribute"); } if(iter->get_tension()!=0.0) @@ -563,7 +586,7 @@ xmlpp::Element* encode_layer(xmlpp::Element* root,Layer::ConstHandle layer) handle value_node=dynamic_param_list.find(iter->get_name())->second; - // If the valuenode.has no ID, then it must be defined in-place + // If the valuenode has no ID, then it must be defined in-place if(value_node->get_id().empty()) { encode_value_node(node->add_child("value_node"),value_node,layer->get_canvas().constant()); @@ -583,16 +606,25 @@ xmlpp::Element* encode_layer(xmlpp::Element* root,Layer::ConstHandle layer) continue; } - if(value.get_type()==ValueBase::TYPE_CANVAS && !value.get(Canvas::LooseHandle())->is_inline()) + if(value.get_type()==ValueBase::TYPE_CANVAS) { - Canvas::Handle child(value.get(Canvas::LooseHandle())); + // the ->is_inline() below was crashing if the canvas + // contained a PasteCanvas with the default Canvas setting; this avoids the crash + if (!value.get(Canvas::LooseHandle())) + continue; + + if (!value.get(Canvas::LooseHandle())->is_inline()) + { + Canvas::Handle child(value.get(Canvas::LooseHandle())); - if(!value.get(Canvas::Handle())) + if(!value.get(Canvas::Handle())) + continue; + xmlpp::Element *node=root->add_child("param"); + node->set_attribute("name",iter->get_name()); + node->set_attribute("use",child->get_relative_id(layer->get_canvas())); continue; - xmlpp::Element *node=root->add_child("param"); - node->set_attribute("name",iter->get_name()); - node->set_attribute("use",child->get_relative_id(layer->get_canvas())); - continue; + } } xmlpp::Element *node=root->add_child("param"); node->set_attribute("name",iter->get_name()); @@ -720,6 +752,11 @@ synfig::save_canvas(const String &filename, Canvas::ConstHandle canvas) synfig::String tmp_filename(filename+".TMP"); + if (filename_extension(filename) == ".sifz") + xmlSetCompressMode(9); + else + xmlSetCompressMode(0); + try { assert(canvas);