X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;ds=sidebyside;f=synfig-core%2Ftrunk%2Fsrc%2Fsynfig%2Fsavecanvas.cpp;h=690277cf630f1af91daeac96aab832d038cf19f8;hb=c3ad95144d148602f672e95ddda1f18fc35502f8;hp=263814712515e5270c8be912d9d3833e6d54f236;hpb=e8a065f2385c219c511b57dac52786120bfa097d;p=synfig.git diff --git a/synfig-core/trunk/src/synfig/savecanvas.cpp b/synfig-core/trunk/src/synfig/savecanvas.cpp index 2638147..690277c 100644 --- a/synfig-core/trunk/src/synfig/savecanvas.cpp +++ b/synfig-core/trunk/src/synfig/savecanvas.cpp @@ -2,7 +2,7 @@ /*! \file savecanvas.cpp ** \brief Writeme ** -** $Id: savecanvas.cpp,v 1.2 2005/01/07 03:29:12 darco Exp $ +** $Id$ ** ** \legal ** Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley @@ -55,6 +55,7 @@ #include #include #include "gradient.h" +#include #endif @@ -95,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)); @@ -168,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; @@ -177,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++) @@ -194,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); @@ -267,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: @@ -388,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())); @@ -398,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()) @@ -406,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"); @@ -425,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); + } } } @@ -557,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()); @@ -573,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()); - } + } } @@ -604,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"); @@ -645,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, @@ -673,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()) { @@ -697,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; } @@ -710,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()); @@ -750,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;