X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=synfig-core%2Ftrunk%2Fsrc%2Fsynfig%2Fsavecanvas.cpp;h=690277cf630f1af91daeac96aab832d038cf19f8;hb=c3ad95144d148602f672e95ddda1f18fc35502f8;hp=06f5657a6e5d42476b349f9574a00be7d486eff7;hpb=28f28705612902c15cd0702cc891fba35bf2d2df;p=synfig.git diff --git a/synfig-core/trunk/src/synfig/savecanvas.cpp b/synfig-core/trunk/src/synfig/savecanvas.cpp index 06f5657..690277c 100644 --- a/synfig-core/trunk/src/synfig/savecanvas.cpp +++ b/synfig-core/trunk/src/synfig/savecanvas.cpp @@ -2,19 +2,20 @@ /*! \file savecanvas.cpp ** \brief Writeme ** -** $Id: savecanvas.cpp,v 1.2 2005/01/07 03:29:12 darco Exp $ +** $Id$ ** ** \legal -** Copyright (c) 2002 Robert B. Quattlebaum Jr. +** Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley ** -** This software and associated documentation -** are CONFIDENTIAL and PROPRIETARY property of -** the above-mentioned copyright holder. +** This package is free software; you can redistribute it and/or +** modify it under the terms of the GNU General Public License as +** published by the Free Software Foundation; either version 2 of +** the License, or (at your option) any later version. ** -** You may not copy, print, publish, or in any -** other way distribute this software without -** a prior written agreement with -** the copyright holder. +** This package is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +** General Public License for more details. ** \endlegal */ /* ========================================================================= */ @@ -28,6 +29,10 @@ # include #endif +#ifdef HAVE_SYS_ERRNO_H +# include +#endif + #include "savecanvas.h" #include "general.h" #include "valuenode.h" @@ -50,6 +55,7 @@ #include #include #include "gradient.h" +#include #endif @@ -90,7 +96,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)); @@ -163,7 +169,7 @@ xmlpp::Element* encode_bline_point(xmlpp::Element* root,BLinePoint bline_point) if(bline_point.get_split_tangent_flag()) encode_vector(root->add_child("t2")->add_child("vector"),bline_point.get_tangent2()); - + encode_real(root->add_child("width")->add_child("real"),bline_point.get_width()); encode_real(root->add_child("origin")->add_child("real"),bline_point.get_origin()); return root; @@ -172,7 +178,7 @@ xmlpp::Element* encode_bline_point(xmlpp::Element* root,BLinePoint bline_point) xmlpp::Element* encode_gradient(xmlpp::Element* root,Gradient x) { root->set_name("gradient"); - + Gradient::const_iterator iter; x.sort(); for(iter=x.begin();iter!=x.end();iter++) @@ -189,7 +195,7 @@ xmlpp::Element* encode_value(xmlpp::Element* root,const ValueBase &data,Canvas:: xmlpp::Element* encode_list(xmlpp::Element* root,std::list list, Canvas::ConstHandle canvas=0) { root->set_name("list"); - + while(!list.empty()) { encode_value(root->add_child("value"),list.front(),canvas); @@ -262,9 +268,19 @@ 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()) { case INTERPOLATION_HALT: @@ -383,9 +399,8 @@ xmlpp::Element* encode_subtract(xmlpp::Element* root,ValueNode_Subtract::ConstHa xmlpp::Element* encode_dynamic_list(xmlpp::Element* root,ValueNode_DynamicList::ConstHandle value_node,Canvas::ConstHandle canvas=0) { assert(value_node); -// const float fps(canvas?canvas->rend_desc().get_frame_rate():0); - const float fps(0); - + const float fps(canvas?canvas->rend_desc().get_frame_rate():0); + root->set_name(value_node->get_name()); root->set_attribute("type",ValueBase::type_name(value_node->get_contained_type())); @@ -393,7 +408,7 @@ xmlpp::Element* encode_dynamic_list(xmlpp::Element* root,ValueNode_DynamicList:: vector::const_iterator iter; ValueNode_BLine::ConstHandle bline_value_node(ValueNode_BLine::ConstHandle::cast_dynamic(value_node)); - + if(bline_value_node) { if(bline_value_node->get_loop()) @@ -401,7 +416,7 @@ xmlpp::Element* encode_dynamic_list(xmlpp::Element* root,ValueNode_DynamicList:: else root->set_attribute("loop","false"); } - + for(iter=value_node->list.begin();iter!=value_node->list.end();++iter) { xmlpp::Element *entry_node=root->add_child("entry"); @@ -420,41 +435,47 @@ xmlpp::Element* encode_dynamic_list(xmlpp::Element* root,ValueNode_DynamicList:: const ActivepointList& timing_info(iter->timing_info); ActivepointList::const_iterator entry_iter; - + for(entry_iter=timing_info.begin();entry_iter!=timing_info.end();++entry_iter) if(entry_iter->state==true) { if(entry_iter->priority) + { + printf("begin priority is %d\n", entry_iter->priority); begin_sequence+=strprintf("p%d ",entry_iter->priority); + } begin_sequence+=entry_iter->time.get_string(fps)+", "; - } + } else { if(entry_iter->priority) + { + printf("end priority is %d\n", entry_iter->priority); end_sequence+=strprintf("p%d ",entry_iter->priority); + } end_sequence+=entry_iter->time.get_string(fps)+", "; } - + // If this is just a plane-jane vanilla entry, // then don't bother with begins and ends if(end_sequence.empty() && begin_sequence=="SOT, ") begin_sequence.clear(); - + if(!begin_sequence.empty()) { // Remove the last ", " stuff begin_sequence=String(begin_sequence.begin(),begin_sequence.end()-2); // Add the attribute - entry_node->set_attribute("on",begin_sequence); - } + entry_node->set_attribute("on",begin_sequence); + } if(!end_sequence.empty()) { // Remove the last ", " stuff end_sequence=String(end_sequence.begin(),end_sequence.end()-2); // Add the attribute - entry_node->set_attribute("off",end_sequence); - } + entry_node->set_attribute("off",end_sequence); + } } } @@ -552,7 +573,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()); @@ -568,26 +589,35 @@ xmlpp::Element* encode_layer(xmlpp::Element* root,Layer::ConstHandle layer) ValueBase value=layer->get_param(iter->get_name()); if(!value.is_valid()) { - error("Layer doesn't know it's own vocabulary -- "+iter->get_name()); + error("Layer doesn't know its own vocabulary -- "+iter->get_name()); 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())); - - if(!value.get(Canvas::Handle())) + // 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; - 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; + + if (!value.get(Canvas::LooseHandle())->is_inline()) + { + Canvas::Handle child(value.get(Canvas::LooseHandle())); + + 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()); encode_value(node->add_child("value"),value,layer->get_canvas().constant()); - } + } } @@ -599,7 +629,7 @@ xmlpp::Element* encode_canvas(xmlpp::Element* root,Canvas::ConstHandle canvas) assert(canvas); const RendDesc &rend_desc=canvas->rend_desc(); root->set_name("canvas"); - + if(canvas->is_root()) root->set_attribute("version","0.1"); @@ -640,7 +670,7 @@ xmlpp::Element* encode_canvas(xmlpp::Element* root,Canvas::ConstHandle canvas) if(!canvas->parent() || canvas->parent()->rend_desc().get_time_end()!=canvas->rend_desc().get_time_end()) root->set_attribute("end-time",rend_desc.get_time_end().get_string(rend_desc.get_frame_rate())); - + if(!canvas->is_inline()) { root->set_attribute("bgcolor",strprintf(VIEW_BOX_FORMAT, @@ -668,7 +698,7 @@ xmlpp::Element* encode_canvas(xmlpp::Element* root,Canvas::ConstHandle canvas) for(KeyframeList::const_iterator iter=canvas->keyframe_list().begin();iter!=canvas->keyframe_list().end();++iter) encode_keyframe(root->add_child("keyframe"),*iter,canvas->rend_desc().get_frame_rate()); } - + // Output the section if(!canvas->is_inline() && !canvas->value_node_list().empty() || !canvas->children().empty()) { @@ -692,12 +722,12 @@ xmlpp::Element* encode_canvas(xmlpp::Element* root,Canvas::ConstHandle canvas) { encode_canvas(node->add_child("canvas"),*iter); } - } + } Canvas::const_reverse_iterator iter; for(iter=canvas->rbegin();iter!=canvas->rend();++iter) - encode_layer(root->add_child("layer"),*iter); + encode_layer(root->add_child("layer"),*iter); return root; } @@ -705,25 +735,27 @@ xmlpp::Element* encode_canvas(xmlpp::Element* root,Canvas::ConstHandle canvas) bool synfig::save_canvas(const String &filename, Canvas::ConstHandle canvas) { + ChangeLocale change_locale(LC_NUMERIC, "C"); + synfig::String tmp_filename(filename+".TMP"); try { assert(canvas); xmlpp::Document document; - + encode_canvas(document.create_root_node("canvas"),canvas); - + document.write_to_file_formatted(tmp_filename); } catch(...) { synfig::error("synfig::save_canvas(): Caught unknown exception"); return false; } - - + + #ifdef _WIN32 // On Win32 platforms, rename() has bad behavior. work around it. char old_file[80]="sif.XXXXXXXX"; mktemp(old_file); - rename(filename.c_str(),old_file); + rename(filename.c_str(),old_file); if(rename(tmp_filename.c_str(),filename.c_str())!=0) { rename(old_file,tmp_filename.c_str()); @@ -745,6 +777,7 @@ synfig::save_canvas(const String &filename, Canvas::ConstHandle canvas) String synfig::canvas_to_string(Canvas::ConstHandle canvas) { + ChangeLocale change_locale(LC_NUMERIC, "C"); assert(canvas); xmlpp::Document document;