Fix a bug introduced in SVN r2014. The 'origin' parameter of regions and outlines...
[synfig.git] / synfig-core / trunk / src / synfig / loadcanvas.cpp
index b657776..d93dc09 100644 (file)
@@ -6,7 +6,7 @@
 **
 **     \legal
 **     Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
-**     Copyright (c) 2007 Chris Moore
+**     Copyright (c) 2007, 2008 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
@@ -995,7 +995,7 @@ CanvasParser::parse_animated(xmlpp::Element *element,Canvas::Handle canvas)
                        if(child->get_attribute("temporal-tension"))
                        {
                                synfig::String str(child->get_attribute("temporal-tension")->get_value());
-                               waypoint->set_time_tension(atof(str.c_str()));
+                               waypoint->set_temporal_tension(atof(str.c_str()));
                        }
                        if(child->get_attribute("continuity"))
                        {
@@ -1073,6 +1073,7 @@ CanvasParser::parse_animated(xmlpp::Element *element,Canvas::Handle canvas)
                                if (first)
                                        first = false;
                                else if (iter->get_value_node()->get_name() == "constant")
+                               {
                                        if (angle - prev > 180)
                                        {
                                                while (angle - prev > 180) angle -= 360;
@@ -1083,6 +1084,7 @@ CanvasParser::parse_animated(xmlpp::Element *element,Canvas::Handle canvas)
                                                while (prev - angle > 180) angle += 360;
                                                iter->set_value(Angle::deg(angle));
                                        }
+                               }
                                prev = angle;
                        }
                }
@@ -1273,12 +1275,35 @@ CanvasParser::parse_linkable_value_node(xmlpp::Element *element,Canvas::Handle c
                }
        }
 
+       String version(canvas->get_version());
        for (int i = 0; i < value_node->link_count(); i++)
        {
-               if (!c[i] &&
-                       // the 'width' parameter of <stripes> wasn't always present, so it won't be in old .sif files
-                       !(element->get_name() == "stripes" && value_node->link_name(i) == "width"))
+               if (!c[i])
                {
+                       // the 'width' parameter of <stripes> wasn't always present in version 0.1 canvases
+                       if (version == "0.1" && element->get_name() == "stripes" && value_node->link_name(i) == "width")
+                               continue;
+
+                       // these 3 blinecalctangent parameters didn't appear until canvas version 0.5
+                       if ((version == "0.1" || version == "0.2" || version == "0.3" || version == "0.4") &&
+                               element->get_name() == "blinecalctangent" &&
+                               (value_node->link_name(i) == "offset" ||
+                                value_node->link_name(i) == "scale" ||
+                                value_node->link_name(i) == "fixed_length"))
+                               continue;
+
+                       // 'scale' was added while canvas version 0.5 was in use
+                       if ((version == "0.3" || version == "0.4" || version == "0.5") &&
+                               element->get_name() == "blinecalcwidth" &&
+                               value_node->link_name(i) == "scale")
+                               continue;
+
+                       // 'loop' was added while canvas version 0.5 was in use, as was the 'gradientcolor' node type
+                       if (version == "0.5" &&
+                               element->get_name() == "gradientcolor" &&
+                               value_node->link_name(i) == "loop")
+                               continue;
+
                        error(element, strprintf(_("<%s> is missing link %d (%s)"),
                                                                         element->get_name().c_str(),
                                                                         i,
@@ -1287,6 +1312,18 @@ CanvasParser::parse_linkable_value_node(xmlpp::Element *element,Canvas::Handle c
                }
        }
 
+       // pre 0.4 canvases had *calctangent outputs scaled down by 0.5 for some reason
+       if (element->get_name() == "blinecalctangent" || element->get_name() == "segcalctangent")
+       {
+               if (version == "0.1" || version == "0.2" || version == "0.3")
+               {
+                       handle<LinkableValueNode> scale_value_node=LinkableValueNode::create("scale",type);
+                       scale_value_node->set_link(scale_value_node->get_link_index_from_name("link"), value_node);
+                       scale_value_node->set_link(scale_value_node->get_link_index_from_name("scalar"), ValueNode_Const::create(Real(0.5)));
+                       value_node = scale_value_node;
+               }
+       }
+
        return value_node;
 }
 
@@ -1682,6 +1719,11 @@ CanvasParser::parse_layer(xmlpp::Element *element,Canvas::Handle canvas)
 
                        String param_name=child->get_attribute("name")->get_value();
 
+                       // SVN r2013 and r2014 renamed all 'pos' and 'offset' parameters to 'origin'
+                       // 'pos' and 'offset' will appear in old .sif files; handle them correctly
+                       if (param_name == "pos" || param_name == "offset")
+                               param_name = "origin";
+
                        if(child->get_attribute("use"))
                        {
                                // If the "use" attribute is used, then the
@@ -1692,7 +1734,9 @@ CanvasParser::parse_layer(xmlpp::Element *element,Canvas::Handle canvas)
 
                                String str=     child->get_attribute("use")->get_value();
 
-                               if(layer->get_param(param_name).get_type()==ValueBase::TYPE_CANVAS)
+                               if (str.empty())
+                                       error(child,_("Empty use=\"\" value in <param>"));
+                               else if(layer->get_param(param_name).get_type()==ValueBase::TYPE_CANVAS)
                                {
                                        if(!layer->set_param(param_name,canvas->surefind_canvas(str)))
                                                error((*iter),_("Layer rejected canvas link"));
@@ -1703,6 +1747,12 @@ CanvasParser::parse_layer(xmlpp::Element *element,Canvas::Handle canvas)
                                        handle<ValueNode> value_node=canvas->surefind_value_node(str);
 
                                        // Assign the value_node to the dynamic parameter list
+                                       if (param_name == "segment_list" && (layer->get_name() == "region" || layer->get_name() == "outline"))
+                                       {
+                                               synfig::warning("%s: Updated valuenode connection to use the \"bline\" parameter instead of \"segment_list\".",
+                                                                               layer->get_name().c_str());
+                                               param_name = "bline";
+                                       }
                                        layer->connect_dynamic_param(param_name,value_node);
                        }
                                catch(Exception::IDNotFound)
@@ -1743,7 +1793,9 @@ CanvasParser::parse_layer(xmlpp::Element *element,Canvas::Handle canvas)
                                // the layer liked it
                                if(!layer->set_param(param_name,data))
                                {
-                                       warning((*iter),_("Layer rejected value for <param>"));
+                                       warning((*iter),strprintf(_("Layer '%s' rejected value for parameter '%s'"),
+                                                                                         element->get_attribute("type")->get_value().c_str(),
+                                                                                         param_name.c_str()));
                                        continue;
                                }
                        }