X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=synfig-core%2Ftrunk%2Fsrc%2Fsynfig%2Fsavecanvas.cpp;h=3fbed5f0655b031471e5440f1594e3231f0a31d2;hb=bf9a7016492069205a1e17b641f886c659f6b594;hp=32c820352446e84b39ad29e91522dabf4c395076;hpb=e3acc0b267b14fda5db3c7bbb2f218b993ef84b3;p=synfig.git diff --git a/synfig-core/trunk/src/synfig/savecanvas.cpp b/synfig-core/trunk/src/synfig/savecanvas.cpp index 32c8203..3fbed5f 100644 --- a/synfig-core/trunk/src/synfig/savecanvas.cpp +++ b/synfig-core/trunk/src/synfig/savecanvas.cpp @@ -1,20 +1,21 @@ -/* === S I N F G =========================================================== */ +/* === S Y N F I G ========================================================= */ /*! \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 @@ -57,7 +63,7 @@ using namespace std; using namespace etl; -using namespace sinfg; +using namespace synfig; /* === M A C R O S ========================================================= */ @@ -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); @@ -233,11 +239,11 @@ xmlpp::Element* encode_value(xmlpp::Element* root,const ValueBase &data,Canvas:: case ValueBase::TYPE_CANVAS: return encode_canvas(root,data.get(Canvas::Handle()).get()); case ValueBase::TYPE_NIL: - sinfg::error("Encountered NIL ValueBase"); + synfig::error("Encountered NIL ValueBase"); root->set_name("nil"); return root; default: - sinfg::error(strprintf("Unknown value(%s), cannot create XML representation!",ValueBase::type_name(data.get_type()).c_str())); + synfig::error(strprintf("Unknown value(%s), cannot create XML representation!",ValueBase::type_name(data.get_type()).c_str())); root->set_name("nil"); return root; } @@ -264,7 +270,7 @@ xmlpp::Element* encode_animated(xmlpp::Element* root,ValueNode_Animated::ConstHa 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); - + switch(iter->get_before()) { case INTERPOLATION_HALT: @@ -383,9 +389,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 +398,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 +406,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"); @@ -413,48 +418,48 @@ xmlpp::Element* encode_dynamic_list(xmlpp::Element* root,ValueNode_DynamicList:: // process waypoints { - typedef sinfg::ValueNode_DynamicList::ListEntry::Activepoint Activepoint; - typedef sinfg::ValueNode_DynamicList::ListEntry::ActivepointList ActivepointList; + typedef synfig::ValueNode_DynamicList::ListEntry::Activepoint Activepoint; + typedef synfig::ValueNode_DynamicList::ListEntry::ActivepointList ActivepointList; String begin_sequence; String end_sequence; 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) begin_sequence+=strprintf("p%d ",entry_iter->priority); begin_sequence+=entry_iter->time.get_string(fps)+", "; - } + } else { if(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); + } } } @@ -575,7 +580,7 @@ xmlpp::Element* encode_layer(xmlpp::Element* root,Layer::ConstHandle layer) if(value.get_type()==ValueBase::TYPE_CANVAS && !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"); @@ -587,7 +592,7 @@ xmlpp::Element* encode_layer(xmlpp::Element* root,Layer::ConstHandle layer) node->set_attribute("name",iter->get_name()); encode_value(node->add_child("value"),value,layer->get_canvas().constant()); - } + } } @@ -599,7 +604,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 +645,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 +673,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,49 +697,51 @@ 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; } bool -sinfg::save_canvas(const String &filename, Canvas::ConstHandle canvas) +synfig::save_canvas(const String &filename, Canvas::ConstHandle canvas) { - sinfg::String tmp_filename(filename+".TMP"); + 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(...) { sinfg::error("sinfg::save_canvas(): Caught unknown exception"); return false; } - - + 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()); - sinfg::error("sinfg::save_canvas(): Unable to rename file to correct filename, errno=%d",errno); + synfig::error("synfig::save_canvas(): Unable to rename file to correct filename, errno=%d",errno); return false; } remove(old_file); #else if(rename(tmp_filename.c_str(),filename.c_str())!=0) { - sinfg::error("sinfg::save_canvas(): Unable to rename file to correct filename, errno=%d",errno); + synfig::error("synfig::save_canvas(): Unable to rename file to correct filename, errno=%d",errno); return false; } #endif @@ -743,8 +750,9 @@ sinfg::save_canvas(const String &filename, Canvas::ConstHandle canvas) } String -sinfg::canvas_to_string(Canvas::ConstHandle canvas) +synfig::canvas_to_string(Canvas::ConstHandle canvas) { + ChangeLocale change_locale(LC_NUMERIC, "C"); assert(canvas); xmlpp::Document document;