Module: synfig
Branch: genete_width_points
Commit: 7538ab712f1af5e9d515fcec1045d75d29038201
URL:    
http://synfig.git.sourceforge.net/git/gitweb.cgi?p=synfig;a=commit;h=7538ab712f1af5e9d515fcec1045d75d29038201

Author: Carlos Lopez <car...@pcnuevo.(none)>
Date:   Sun Aug  2 12:20:35 2009 +0200

Allow load and save Enhanced Outline layers

---

 synfig-core/trunk/src/synfig/loadcanvas.cpp      |  125 +++++++++++++++++++++-
 synfig-core/trunk/src/synfig/loadcanvas.h        |    1 +
 synfig-core/trunk/src/synfig/savecanvas.cpp      |   22 ++++
 synfig-core/trunk/src/synfig/valuenode_wline.cpp |    2 +-
 4 files changed, 146 insertions(+), 4 deletions(-)

diff --git a/synfig-core/trunk/src/synfig/loadcanvas.cpp 
b/synfig-core/trunk/src/synfig/loadcanvas.cpp
index 3da37e9..eb32db7 100644
--- a/synfig-core/trunk/src/synfig/loadcanvas.cpp
+++ b/synfig-core/trunk/src/synfig/loadcanvas.cpp
@@ -57,6 +57,7 @@
 #include "valuenode_segcalctangent.h"
 #include "valuenode_segcalcvertex.h"
 #include "valuenode_bline.h"
+#include "valuenode_wline.h"
 
 #include "layer.h"
 #include "string.h"
@@ -805,6 +806,105 @@ CanvasParser::parse_bline_point(xmlpp::Element *element)
        return ret;
 }
 
+WLinePoint
+CanvasParser::parse_wline_point(xmlpp::Element *element)
+{
+       assert(element->get_name()=="wline_point");
+       if(element->get_children().empty())
+       {
+               error(element, "Undefined value in <wline_point>");
+               return WLinePoint();
+       }
+
+       WLinePoint ret;
+
+       xmlpp::Element::NodeList list = element->get_children();
+       for(xmlpp::Element::NodeList::iterator iter = list.begin(); iter != 
list.end(); ++iter)
+       {
+               xmlpp::Element *child(dynamic_cast<xmlpp::Element*>(*iter));
+               if(!child)
+                       continue;
+               else
+               // position
+               if(child->get_name()=="position")
+               {
+                       xmlpp::Element::NodeList list = child->get_children();
+                       xmlpp::Element::NodeList::iterator iter;
+
+                       // Search for the first non-text XML element
+                       for(iter = list.begin(); iter != list.end(); ++iter)
+                               if(dynamic_cast<xmlpp::Element*>(*iter)) break;
+
+                       if(iter==list.end())
+                       {
+                               error(element, "Undefined value in <position>");
+                               continue;
+                       }
+
+                       if((*iter)->get_name()!="real")
+                       {
+                               
error_unexpected_element((*iter),(*iter)->get_name(),"real");
+                               continue;
+                       }
+
+                       
ret.set_position(parse_real(dynamic_cast<xmlpp::Element*>(*iter)));
+               }
+               else
+               // width
+               if(child->get_name()=="width")
+               {
+                       xmlpp::Element::NodeList list = child->get_children();
+                       xmlpp::Element::NodeList::iterator iter;
+
+                       // Search for the first non-text XML element
+                       for(iter = list.begin(); iter != list.end(); ++iter)
+                               if(dynamic_cast<xmlpp::Element*>(*iter)) break;
+
+                       if(iter==list.end())
+                       {
+                               error(element, "Undefined value in <width>");
+                               continue;
+                       }
+
+                       if((*iter)->get_name()!="real")
+                       {
+                               
error_unexpected_element((*iter),(*iter)->get_name(),"real");
+                               continue;
+                       }
+
+                       
ret.set_width(parse_real(dynamic_cast<xmlpp::Element*>(*iter)));
+               }
+               else
+               // origin
+               if(child->get_name()=="origin")
+               {
+                       xmlpp::Element::NodeList list = child->get_children();
+                       xmlpp::Element::NodeList::iterator iter;
+
+                       // Search for the first non-text XML element
+                       for(iter = list.begin(); iter != list.end(); ++iter)
+                               if(dynamic_cast<xmlpp::Element*>(*iter)) break;
+
+                       if(iter==list.end())
+                       {
+                               error(element, "Undefined value in <origin>");
+                               continue;
+                       }
+
+                       if((*iter)->get_name()!="real")
+                       {
+                               
error_unexpected_element((*iter),(*iter)->get_name(),"real");
+                               continue;
+                       }
+
+                       
ret.set_origin(parse_real(dynamic_cast<xmlpp::Element*>(*iter)));
+               }
+               else
+                       error_unexpected_element(child,child->get_name());
+       }
+       return ret;
+}
+
 Angle
 CanvasParser::parse_angle(xmlpp::Element *element)
 {
@@ -866,6 +966,9 @@ CanvasParser::parse_value(xmlpp::Element 
*element,Canvas::Handle canvas)
        if(element->get_name()=="bline_point")
                return parse_bline_point(element);
        else
+       if(element->get_name()=="wline_point")
+               return parse_wline_point(element);
+       else
        if(element->get_name()=="canvas")
                return ValueBase(parse_canvas(element,canvas,true));
        else
@@ -1349,11 +1452,11 @@ CanvasParser::parse_linkable_value_node(xmlpp::Element 
*element,Canvas::Handle c
        return value_node;
 }
 
-// This will also parse a bline
+// This will also parse a bline and a wline
 handle<ValueNode_DynamicList>
 CanvasParser::parse_dynamic_list(xmlpp::Element *element,Canvas::Handle canvas)
 {
-       assert(element->get_name()=="dynamic_list" || 
element->get_name()=="bline");
+       assert(element->get_name()=="dynamic_list" || 
element->get_name()=="bline" || element->get_name()=="wline");
 
        const float fps(canvas?canvas->rend_desc().get_frame_rate():0);
 
@@ -1373,6 +1476,7 @@ CanvasParser::parse_dynamic_list(xmlpp::Element 
*element,Canvas::Handle canvas)
 
        handle<ValueNode_DynamicList> value_node;
        handle<ValueNode_BLine> bline_value_node;
+       handle<ValueNode_WLine> wline_value_node;
 
        if(element->get_name()=="bline")
        {
@@ -1385,6 +1489,18 @@ CanvasParser::parse_dynamic_list(xmlpp::Element 
*element,Canvas::Handle canvas)
                        else
                                bline_value_node->set_loop(false);
                }
+       }
+       else if(element->get_name()=="wline")
+       {
+               value_node=wline_value_node=ValueNode_WLine::create();
+               if(element->get_attribute("loop"))
+               {
+                       String loop=element->get_attribute("loop")->get_value();
+                       if(loop=="true" || loop=="1" || loop=="TRUE" || 
loop=="True")
+                               wline_value_node->set_loop(true);
+                       else
+                               wline_value_node->set_loop(false);
+               }
 
        }
        else
@@ -1608,6 +1724,9 @@ CanvasParser::parse_value_node(xmlpp::Element 
*element,Canvas::Handle canvas)
        if(element->get_name()=="bline") // This is not a typo. The dynamic 
list parser will parse a bline.
                value_node=parse_dynamic_list(element,canvas);
        else
+       if(element->get_name()=="wline") // This is not a typo. The dynamic 
list parser will parse a wline.
+               value_node=parse_dynamic_list(element,canvas);
+       else
        if(LinkableValueNode::book().count(element->get_name()))
        {
                value_node=parse_linkable_value_node(element,canvas);
@@ -1773,7 +1892,7 @@ 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"))
+                                       if (param_name == "segment_list" && 
(layer->get_name() == "region" || layer->get_name() == "outline" || 
layer->get_name() == "enhancedoutline"))
                                        {
                                                synfig::warning("%s: Updated 
valuenode connection to use the \"bline\" parameter instead of 
\"segment_list\".",
                                                                                
layer->get_name().c_str());
diff --git a/synfig-core/trunk/src/synfig/loadcanvas.h 
b/synfig-core/trunk/src/synfig/loadcanvas.h
index 888e1d7..00321fa 100644
--- a/synfig-core/trunk/src/synfig/loadcanvas.h
+++ b/synfig-core/trunk/src/synfig/loadcanvas.h
@@ -164,6 +164,7 @@ private:
        ValueBase parse_list(xmlpp::Element *node,Canvas::Handle canvas);
        Gradient parse_gradient(xmlpp::Element *node);
        BLinePoint parse_bline_point(xmlpp::Element *node);
+       WLinePoint parse_wline_point(xmlpp::Element *node);
 
        Keyframe parse_keyframe(xmlpp::Element *node,Canvas::Handle canvas);
 
diff --git a/synfig-core/trunk/src/synfig/savecanvas.cpp 
b/synfig-core/trunk/src/synfig/savecanvas.cpp
index a2ae0d9..9aef63d 100644
--- a/synfig-core/trunk/src/synfig/savecanvas.cpp
+++ b/synfig-core/trunk/src/synfig/savecanvas.cpp
@@ -47,6 +47,7 @@
 #include "valuenode_segcalctangent.h"
 #include "valuenode_segcalcvertex.h"
 #include "valuenode_bline.h"
+#include "valuenode_wline.h"
 #include "time.h"
 #include "keyframe.h"
 #include "layer.h"
@@ -183,6 +184,16 @@ xmlpp::Element* encode_bline_point(xmlpp::Element* 
root,BLinePoint bline_point)
        return root;
 }
 
+xmlpp::Element* encode_wline_point(xmlpp::Element* root, WLinePoint 
wline_point)
+{
+       root->set_name(ValueBase::type_name(ValueBase::TYPE_WLINEPOINT));
+
+       
encode_real(root->add_child("position")->add_child("real"),wline_point.get_position());
+       
encode_real(root->add_child("width")->add_child("real"),wline_point.get_width());
+       
encode_real(root->add_child("origin")->add_child("real"),wline_point.get_origin());
+       return root;
+}
+
 xmlpp::Element* encode_gradient(xmlpp::Element* root,Gradient x)
 {
        root->set_name("gradient");
@@ -240,6 +251,8 @@ xmlpp::Element* encode_value(xmlpp::Element* root,const 
ValueBase &data,Canvas::
                return encode_segment(root,data.get(Segment()));
        case ValueBase::TYPE_BLINEPOINT:
                return encode_bline_point(root,data.get(BLinePoint()));
+       case ValueBase::TYPE_WLINEPOINT:
+               return encode_wline_point(root,data.get(WLinePoint()));
        case ValueBase::TYPE_GRADIENT:
                return encode_gradient(root,data.get(Gradient()));
        case ValueBase::TYPE_LIST:
@@ -395,6 +408,7 @@ xmlpp::Element* encode_dynamic_list(xmlpp::Element* 
root,ValueNode_DynamicList::
        vector<ValueNode_DynamicList::ListEntry>::const_iterator iter;
 
        ValueNode_BLine::ConstHandle 
bline_value_node(ValueNode_BLine::ConstHandle::cast_dynamic(value_node));
+       ValueNode_WLine::ConstHandle 
wline_value_node(ValueNode_WLine::ConstHandle::cast_dynamic(value_node));
 
        if(bline_value_node)
        {
@@ -404,6 +418,14 @@ xmlpp::Element* encode_dynamic_list(xmlpp::Element* 
root,ValueNode_DynamicList::
                        root->set_attribute("loop","false");
        }
 
+       if(wline_value_node)
+       {
+               if(wline_value_node->get_loop())
+                       root->set_attribute("loop","true");
+               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");
diff --git a/synfig-core/trunk/src/synfig/valuenode_wline.cpp 
b/synfig-core/trunk/src/synfig/valuenode_wline.cpp
index 3adac1b..bd725c3 100644
--- a/synfig-core/trunk/src/synfig/valuenode_wline.cpp
+++ b/synfig-core/trunk/src/synfig/valuenode_wline.cpp
@@ -420,7 +420,7 @@ ValueNode_WLine::link_local_name(int i)const
 String
 ValueNode_WLine::get_name()const
 {
-       return "WLine";
+       return "wline";
 }
 
 String


------------------------------------------------------------------------------
Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day 
trial. Simplify your report design, integration and deployment - and focus on 
what you do best, core application coding. Discover what's new with 
Crystal Reports now.  http://p.sf.net/sfu/bobj-july
_______________________________________________
Synfig-devl mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/synfig-devl

Reply via email to