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