X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;ds=sidebyside;f=synfig-core%2Ftrunk%2Fsrc%2Fsynfig%2Floadcanvas.cpp;h=93dbd44cd7f4464217147eb17ce31921e37a4ccf;hb=9b60c394e7f36df4c48ca84d87c7796ea15dcdb8;hp=8db2a5d43bb79cc8f8383548b45509494543bf89;hpb=89f1924afb8411fd051c15916f56ddef9d839a5b;p=synfig.git diff --git a/synfig-core/trunk/src/synfig/loadcanvas.cpp b/synfig-core/trunk/src/synfig/loadcanvas.cpp index 8db2a5d..93dbd44 100644 --- a/synfig-core/trunk/src/synfig/loadcanvas.cpp +++ b/synfig-core/trunk/src/synfig/loadcanvas.cpp @@ -88,6 +88,8 @@ test_class test_class_instance; /* === M A C R O S ========================================================= */ +#define VALUENODE_COMPATIBILITY_URL "http://synfig.org/Convert#Compatibility" + inline bool is_whitespace(char x) { return ((x)=='\n' || (x)=='\t' || (x)==' '); } /* === P R O C E D U R E S ================================================= */ @@ -856,7 +858,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 +890,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 +1052,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; } @@ -1082,7 +1123,10 @@ CanvasParser::parse_linkable_value_node(xmlpp::Element *element,Canvas::Handle c if(!value_node) { - error(element,"Unknown ValueNode type "+element->get_name()); + error(element, strprintf(_("Error creating ValueNode <%s> with type '%s'. Refer to '%s'"), + element->get_name().c_str(), + ValueBase::type_local_name(type).c_str(), + VALUENODE_COMPATIBILITY_URL)); return 0; } @@ -1095,31 +1139,39 @@ CanvasParser::parse_linkable_value_node(xmlpp::Element *element,Canvas::Handle c value_node->set_root_canvas(canvas->get_root()); int i; - for(i=0;ilink_count();i++) + String id, name; + xmlpp::Element::AttributeList attrib_list(element->get_attributes()); + for(xmlpp::Element::AttributeList::iterator iter = attrib_list.begin(); iter != attrib_list.end(); iter++) { - if(element->get_attribute(value_node->link_name(i))) + name = (*iter)->get_name(); + id = (*iter)->get_value(); + + if (name == "guid" || name == "id" || name == "type") + continue; + try { - String id(element->get_attribute(value_node->link_name(i))->get_value()); - - if(!value_node->set_link(i, - canvas->surefind_value_node( - id - ) - ) - ) error(element,strprintf(_("Unable to set link \"%s\" to ValueNode \"%s\" (link #%d in \"%s\")"),value_node->link_name(i).c_str(),id.c_str(),i,value_node->get_name().c_str())); + i = value_node->get_link_index_from_name(name); + + if(!value_node->set_link(i, canvas->surefind_value_node(id))) + error(element,strprintf(_("Unable to set link \"%s\" to ValueNode \"%s\" (link #%d in \"%s\")"),value_node->link_name(i).c_str(),id.c_str(),i,value_node->get_name().c_str())); + else + printf(" composite: set '%s'\n", name.c_str()); + } + catch (Exception::BadLinkName) + { + error(element,"Bad link name " + name); } catch(Exception::IDNotFound) { - error(element,"Unable to resolve "+element->get_attribute(value_node->link_name(i))->get_value()); + error(element,"Unable to resolve " + id); } catch(Exception::FileNotFound) { - error(element,"Unable to open file referenced in "+element->get_attribute(value_node->link_name(i))->get_value()); + error(element,"Unable to open file referenced in " + id); } catch(...) { - error(element,strprintf(_("Unknown Exception thrown when referencing ValueNode \"%s\""), - element->get_attribute(value_node->link_name(i))->get_value().c_str())); + error(element,strprintf(_("Unknown Exception thrown when referencing ValueNode \"%s\""), id.c_str())); throw; } } @@ -1158,8 +1210,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 @@ -1211,7 +1263,7 @@ CanvasParser::parse_composite(xmlpp::Element *element,Canvas::Handle canvas) for(i=0;ilink_count();i++) { - string name=strprintf("c%d",i+1); + string name=value_node->link_name(i); if(c[i]) { error(element,name+" was already defined in "); @@ -1238,15 +1290,22 @@ CanvasParser::parse_composite(xmlpp::Element *element,Canvas::Handle canvas) xmlpp::Element *child(dynamic_cast(*iter)); if(!child) continue; - else + + string child_name = child->get_name(); for(i=0;ilink_count();i++) { - string name=strprintf("c%d",i+1); - if(child->get_name()==name) + string name=value_node->link_name(i); + int old_index = -1; + + if (child_name.size() == 2 && child_name[0] == 'c') + old_index = child_name[1] - '1'; + + if ((old_index != -1 && old_index == i) || + (old_index == -1 && value_node->get_link_index_from_name(child_name) == i)) { if(c[i]) { - error(child,name+" was already defined in "); + error(child,child_name+" was already defined in "); break; } @@ -1259,7 +1318,7 @@ CanvasParser::parse_composite(xmlpp::Element *element,Canvas::Handle canvas) if(iter==list.end()) { - error(child,strprintf(_("<%s> is missing its contents"),name.c_str())); + error(child,strprintf(_("<%s> is missing its contents"),child_name.c_str())); break; } @@ -1267,13 +1326,13 @@ CanvasParser::parse_composite(xmlpp::Element *element,Canvas::Handle canvas) if(!c[i]) { - error((*iter),"Parse of "+name+" ValueNode failed"); + error((*iter),"Parse of "+child_name+" ValueNode failed"); break; } if(!value_node->set_link(i,c[i])) { - error(child,strprintf(_("<%s> has a bad value"),name.c_str())); + error(child,strprintf(_("<%s> has a bad value"),child_name.c_str())); break; } @@ -1282,7 +1341,7 @@ CanvasParser::parse_composite(xmlpp::Element *element,Canvas::Handle canvas) } } // somewhat of a hack, but it works - if(i==value_node->link_count()) error_unexpected_element(child,child->get_name()); + if(i==value_node->link_count()) error_unexpected_element(child,child_name); } switch(value_node->link_count()) @@ -1582,20 +1641,23 @@ CanvasParser::parse_value_node(xmlpp::Element *element,Canvas::Handle canvas) value_node=parse_dynamic_list(element,canvas); else if(LinkableValueNode::book().count(element->get_name())) + { value_node=parse_linkable_value_node(element,canvas); + if (!value_node) value_node = PlaceholderValueNode::create(); + } else if(element->get_name()=="canvas") value_node=ValueNode_Const::create(parse_canvas(element,canvas,true)); else { error_unexpected_element(element,element->get_name()); - error(element, "Expected a ValueNode"); + error(element, strprintf(_("Expected a ValueNode. Refer to '%s'"), + VALUENODE_COMPATIBILITY_URL)); + value_node=PlaceholderValueNode::create(); } - value_node->set_root_canvas(canvas->get_root()); - // If we were successful, and our element has // an ID attribute, go ahead and add it to the // value_node list @@ -1674,7 +1736,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 +1917,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())); @@ -2057,6 +2122,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 +2135,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 +2195,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");