X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=synfig-core%2Ftrunk%2Fsrc%2Fsynfig%2Floadcanvas.cpp;h=199a6096e32593d2e0be5eeb2389faf17c7b181e;hb=63e709f66d50c124cc0ece2325f4773ac4ae7b20;hp=539f838afeca44740b0748bfb230896cc51485c3;hpb=bd8367952ea2be0ab1e94922922409bf5f9a0be8;p=synfig.git diff --git a/synfig-core/trunk/src/synfig/loadcanvas.cpp b/synfig-core/trunk/src/synfig/loadcanvas.cpp index 539f838..199a609 100644 --- a/synfig-core/trunk/src/synfig/loadcanvas.cpp +++ b/synfig-core/trunk/src/synfig/loadcanvas.cpp @@ -856,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()); } @@ -889,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(); } @@ -1051,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; } @@ -1158,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 @@ -1590,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(); } @@ -1674,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); } @@ -1855,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())); @@ -1989,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) @@ -2004,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) @@ -2019,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) @@ -2057,6 +2100,7 @@ CanvasParser::parse_canvas(xmlpp::Element *element,Canvas::Handle parent,bool in nodes.c_str())); } + canvas->set_version(CURRENT_CANVAS_VERSION); return canvas; } @@ -2069,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"); @@ -2130,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");