|
[Synfig-devl] Carlos Lopez : Allow load and save non composite
width points.
From: Genete <genete@us...> - 2011-01-26 22:37
|
Module: synfig/synfig Branch: genete_width_outline Commit: 29c34525462e5bfd55735ea75cfbbb4b91b93093 URL: http://synfig.git.sourceforge.net/git/gitweb.cgi?p=synfig/synfig;a=commit;h=29c34525462e5bfd55735ea75cfbbb4b91b93093 Author: Carlos Lopez <genetita@...> Date: Wed Jan 19 20:26:48 2011 +0100 Allow load and save non composite width points. --- synfig-core/src/synfig/loadcanvas.cpp | 147 +++++++++++++++++++++++++++++++++ synfig-core/src/synfig/loadcanvas.h | 2 + synfig-core/src/synfig/savecanvas.cpp | 13 +++ 3 files changed, 162 insertions(+), 0 deletions(-) diff --git a/synfig-core/src/synfig/loadcanvas.cpp b/synfig-core/src/synfig/loadcanvas.cpp index 7621dcb..cb0eae5 100644 --- a/synfig-core/src/synfig/loadcanvas.cpp +++ b/synfig-core/src/synfig/loadcanvas.cpp @@ -806,6 +806,150 @@ CanvasParser::parse_bline_point(xmlpp::Element *element) return ret; } +WidthPoint +CanvasParser::parse_width_point(xmlpp::Element *element) +{ + assert(element->get_name()=="width_point"); + if(element->get_children().empty()) + { + error(element, "Undefined value in <width_point>"); + return WidthPoint(); + } + + WidthPoint 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 + // Side type before + if(child->get_name()=="side_before") + { + 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 <side_before>"); + continue; + } + + if((*iter)->get_name()!="integer") + { + error_unexpected_element((*iter),(*iter)->get_name(),"integer"); + continue; + } + + ret.set_side_type_before(parse_integer(dynamic_cast<xmlpp::Element*>(*iter))); + } + else + // Side type after + if(child->get_name()=="side_after") + { + 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 <side_after>"); + continue; + } + if((*iter)->get_name()!="integer") + { + error_unexpected_element((*iter),(*iter)->get_name(),"integer"); + continue; + } + ret.set_side_type_after(parse_integer(dynamic_cast<xmlpp::Element*>(*iter))); + } + else + // Hidden vertex + if(child->get_name()=="hidden_vertex") + { + 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 <hidden_vertex>"); + continue; + } + if((*iter)->get_name()!="vector") + { + error_unexpected_element((*iter),(*iter)->get_name(),"vector"); + continue; + } + ret.set_hidden_vertex(parse_vector(dynamic_cast<xmlpp::Element*>(*iter))); + } + else + error_unexpected_element(child,child->get_name()); + } + return ret; +} + + Angle CanvasParser::parse_angle(xmlpp::Element *element) { @@ -932,6 +1076,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()=="width_point") + return parse_width_point(element); + else if(element->get_name()=="canvas") { ValueBase ret; diff --git a/synfig-core/src/synfig/loadcanvas.h b/synfig-core/src/synfig/loadcanvas.h index 8cfc482..e80c435 100644 --- a/synfig-core/src/synfig/loadcanvas.h +++ b/synfig-core/src/synfig/loadcanvas.h @@ -192,6 +192,8 @@ private: Gradient parse_gradient(xmlpp::Element *node); //! Bline Point Value Base Parsing Function BLinePoint parse_bline_point(xmlpp::Element *node); + //! Width Point Value Base Parsing Function + WidthPoint parse_width_point(xmlpp::Element *node); //! Keyframe Parsing Function Keyframe parse_keyframe(xmlpp::Element *node,Canvas::Handle canvas); diff --git a/synfig-core/src/synfig/savecanvas.cpp b/synfig-core/src/synfig/savecanvas.cpp index e841f38..50e8d49 100644 --- a/synfig-core/src/synfig/savecanvas.cpp +++ b/synfig-core/src/synfig/savecanvas.cpp @@ -194,6 +194,17 @@ xmlpp::Element* encode_bline_point(xmlpp::Element* root,BLinePoint bline_point) return root; } +xmlpp::Element* encode_width_point(xmlpp::Element* root,WidthPoint width_point) +{ + root->set_name(ValueBase::type_name(ValueBase::TYPE_WIDTHPOINT)); + encode_real(root->add_child("position")->add_child("real"),width_point.get_position()); + encode_real(root->add_child("width")->add_child("real"),width_point.get_width()); + encode_integer(root->add_child("side_before")->add_child("integer"),width_point.get_side_type_before()); + encode_integer(root->add_child("side_after")->add_child("integer"),width_point.get_side_type_after()); + encode_vector(root->add_child("hidden_vertex")->add_child("vector"),width_point.get_hidden_vertex()); + return root; +} + xmlpp::Element* encode_gradient(xmlpp::Element* root,Gradient x,bool s=false) { root->set_name("gradient"); @@ -248,6 +259,8 @@ xmlpp::Element* encode_value(xmlpp::Element* root,const ValueBase &data,Canvas:: return encode_segment(root,data.get(Segment()), data.get_static()); case ValueBase::TYPE_BLINEPOINT: return encode_bline_point(root,data.get(BLinePoint())); + case ValueBase::TYPE_WIDTHPOINT: + return encode_width_point(root,data.get(WidthPoint())); case ValueBase::TYPE_GRADIENT: return encode_gradient(root,data.get(Gradient()), data.get_static()); case ValueBase::TYPE_LIST: |
| Thread | Author | Date |
|---|---|---|
| [Synfig-devl] Carlos Lopez : Allow load and save non composite width points. | Genete <genete@us...> |