X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=synfig-core%2Ftrunk%2Fsrc%2Fsynfig%2Floadcanvas.cpp;h=199a6096e32593d2e0be5eeb2389faf17c7b181e;hb=63e709f66d50c124cc0ece2325f4773ac4ae7b20;hp=8edd651744d3252a2b621c3eac0bc93c2441f8aa;hpb=77f2a03e39858624bffbc6aa04d512ffc46ea22f;p=synfig.git diff --git a/synfig-core/trunk/src/synfig/loadcanvas.cpp b/synfig-core/trunk/src/synfig/loadcanvas.cpp index 8edd651..199a609 100644 --- a/synfig-core/trunk/src/synfig/loadcanvas.cpp +++ b/synfig-core/trunk/src/synfig/loadcanvas.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 @@ -855,7 +856,6 @@ CanvasParser::parse_value(xmlpp::Element *element,Canvas::Handle canvas) return ValueBase(parse_canvas(element,canvas,true)); else { - DEBUGPOINT(); error_unexpected_element(element,element->get_name()); } @@ -888,7 +888,7 @@ CanvasParser::parse_animated(xmlpp::Element *element,Canvas::Handle canvas) if(!value_node) { - error(element,strprintf(_("Unable to create with type \"%s\""),ValueBase::type_name(type).c_str())); + error(element,strprintf(_("Unable to create with type \"%s\""),ValueBase::type_local_name(type).c_str())); return ValueNode_Animated::Handle(); } @@ -1050,6 +1050,46 @@ CanvasParser::parse_animated(xmlpp::Element *element,Canvas::Handle canvas) else error_unexpected_element(child,child->get_name()); } + + // in canvas version 0.1, angles used to wrap, so to get from -179 + // degrees to 180 degrees meant a 1 degree change + // in canvas version 0.2 they don't, so that's a 359 degree change + + // when loading a version 0.1 canvas, modify constant angle + // waypoints to that they are within 180 degrees of the previous + // waypoint's value + if (type == ValueBase::TYPE_ANGLE) + { + Canvas::Handle parent = canvas; + while (!parent->is_root()) + parent = parent->parent(); + + if (parent->get_version() == "0.1") + { + bool first = true; + Real angle, prev = 0; + WaypointList &wl = value_node->waypoint_list(); + for (WaypointList::iterator iter = wl.begin(); iter != wl.end(); iter++) + { + angle = Angle::deg(iter->get_value(iter->get_time()).get(Angle())).get(); + if (first) + first = false; + else if (iter->get_value_node()->get_name() == "constant") + if (angle - prev > 180) + { + while (angle - prev > 180) angle -= 360; + iter->set_value(Angle::deg(angle)); + } + else if (prev - angle > 180) + { + while (prev - angle > 180) angle += 360; + iter->set_value(Angle::deg(angle)); + } + prev = angle; + } + } + } + value_node->changed(); return value_node; } @@ -1157,8 +1197,8 @@ CanvasParser::parse_linkable_value_node(xmlpp::Element *element,Canvas::Handle c else if(!value_node->set_link(index,link)) { - //error(dynamic_cast(*iter),strprintf("Unable to connect value node ('%s' of type '%s') to link %d",link->get_name().c_str(),ValueBase::type_name(link->get_type()).c_str(),index)); - error(element,strprintf("Unable to connect value node ('%s' of type '%s') to link %d",link->get_name().c_str(),ValueBase::type_name(link->get_type()).c_str(),index)); + //error(dynamic_cast(*iter),strprintf(_("Unable to connect value node ('%s' of type '%s') to link %d"),link->get_name().c_str(),ValueBase::type_local_name(link->get_type()).c_str(),index)); + error(element,strprintf(_("Unable to connect value node ('%s' of type '%s') to link %d"),link->get_name().c_str(),ValueBase::type_local_name(link->get_type()).c_str(),index)); } // \todo do a search for more elements and warn if they are found @@ -1549,7 +1589,7 @@ CanvasParser::parse_value_node(xmlpp::Element *element,Canvas::Handle canvas) return value_node; } - // If ValueBase::ident_type() recognises the name, then we know it's a ValueBase + // If ValueBase::ident_type() recognizes the name, then we know it's a ValueBase if(element->get_name()!="canvas" && ValueBase::ident_type(element->get_name())) { ValueBase data=parse_value(element,canvas); @@ -1589,6 +1629,7 @@ CanvasParser::parse_value_node(xmlpp::Element *element,Canvas::Handle canvas) { error_unexpected_element(element,element->get_name()); error(element, "Expected a ValueNode"); + value_node=PlaceholderValueNode::create(); } @@ -1673,7 +1714,7 @@ CanvasParser::parse_layer(xmlpp::Element *element,Canvas::Handle canvas) { String version(element->get_attribute("version")->get_value()); if(version>layer->get_version()) - warning(element,_("Installed layer version is larger than layer version in file")); + warning(element,_("Installed layer version is smaller than layer version in file")); if(version!=layer->get_version()) layer->set_version(version); } @@ -1755,7 +1796,7 @@ CanvasParser::parse_layer(xmlpp::Element *element,Canvas::Handle canvas) continue; } - // If we recognise the element name as a + // If we recognize the element name as a // ValueBase, then treat is at one if(/*(*iter)->get_name()!="canvas" && */ValueBase::ident_type((*iter)->get_name()) && !dynamic_cast(*iter)->get_attribute("guid")) { @@ -1854,6 +1895,9 @@ CanvasParser::parse_canvas(xmlpp::Element *element,Canvas::Handle parent,bool in canvas->set_guid(guid); } + if(element->get_attribute("version")) + canvas->set_version(element->get_attribute("version")->get_value()); + if(element->get_attribute("width")) canvas->rend_desc().set_w(atoi(element->get_attribute("width")->get_value().c_str())); @@ -1988,7 +2032,7 @@ CanvasParser::parse_canvas(xmlpp::Element *element,Canvas::Handle parent,bool in // If we don't have any name, warn if(list.empty()) - warning(child,_("blank \"name\" entitity")); + warning(child,_("blank \"name\" entity")); string tmp; for(xmlpp::Element::NodeList::iterator iter = list.begin(); iter != list.end(); ++iter) @@ -2003,7 +2047,7 @@ CanvasParser::parse_canvas(xmlpp::Element *element,Canvas::Handle parent,bool in // If we don't have any description, warn if(list.empty()) - warning(child,_("blank \"desc\" entitity")); + warning(child,_("blank \"desc\" entity")); string tmp; for(xmlpp::Element::NodeList::iterator iter = list.begin(); iter != list.end(); ++iter) @@ -2018,7 +2062,7 @@ CanvasParser::parse_canvas(xmlpp::Element *element,Canvas::Handle parent,bool in // If we don't have any description, warn if(list.empty()) - warning(child,_("blank \"author\" entitity")); + warning(child,_("blank \"author\" entity")); string tmp; for(xmlpp::Element::NodeList::iterator iter = list.begin(); iter != list.end(); ++iter) @@ -2043,9 +2087,20 @@ CanvasParser::parse_canvas(xmlpp::Element *element,Canvas::Handle parent,bool in if(canvas->value_node_list().placeholder_count()) { - error(element,strprintf(_("Canvas %s has undefined ValueNodes"),canvas->get_id().c_str())); + String nodes; + for (ValueNodeList::const_iterator iter = canvas->value_node_list().begin(); iter != canvas->value_node_list().end(); iter++) + if(PlaceholderValueNode::Handle::cast_dynamic(*iter)) + { + if (nodes != "") nodes += ", "; + nodes += "'" + (*iter)->get_id() + "'"; + } + error(element,strprintf(_("Canvas '%s' has undefined %s: %s"), + canvas->get_id().c_str(), + canvas->value_node_list().placeholder_count() == 1 ? _("ValueNode") : _("ValueNodes"), + nodes.c_str())); } + canvas->set_version(CURRENT_CANVAS_VERSION); return canvas; } @@ -2058,7 +2113,6 @@ CanvasParser::parse_from_file(const String &file) Canvas::Handle CanvasParser::parse_from_file_as(const String &file_,const String &as_) { - CHECK_EXPIRE_TIME(); try { ChangeLocale change_locale(LC_NUMERIC, "C"); @@ -2119,8 +2173,6 @@ CanvasParser::parse_from_file_as(const String &file_,const String &as_) Canvas::Handle CanvasParser::parse_from_string(const String &data) { - CHECK_EXPIRE_TIME(); - try { ChangeLocale change_locale(LC_NUMERIC, "C");