From ea1aa31d49a77a24c5b8037de92baaf046fbb025 Mon Sep 17 00:00:00 2001 From: Edouard DUPIN Date: Wed, 18 Nov 2015 21:07:51 +0100 Subject: [PATCH] [DEV] create a real class to store path ... --- esvg/Base.cpp | 2 +- esvg/Base.h | 2 +- esvg/Circle.cpp | 2 +- esvg/Circle.h | 2 +- esvg/Ellipse.cpp | 2 +- esvg/Ellipse.h | 2 +- esvg/Group.cpp | 4 +- esvg/Group.h | 2 +- esvg/Line.cpp | 2 +- esvg/Line.h | 2 +- esvg/Path.cpp | 303 ++++++++------------- esvg/Path.h | 31 +-- esvg/Polygon.cpp | 2 +- esvg/Polygon.h | 2 +- esvg/Polyline.cpp | 2 +- esvg/Polyline.h | 2 +- esvg/Rectangle.cpp | 2 +- esvg/Rectangle.h | 2 +- esvg/RenderPath.cpp | 103 ------- esvg/RenderPath.h | 45 --- esvg/esvg.cpp | 8 +- esvg/esvg.h | 2 +- esvg/render/Element.cpp | 12 + esvg/render/Element.h | 95 +++++++ esvg/render/ElementBezierCurveTo.cpp | 12 + esvg/render/ElementBezierCurveTo.h | 30 ++ esvg/render/ElementBezierSmoothCurveTo.cpp | 12 + esvg/render/ElementBezierSmoothCurveTo.h | 29 ++ esvg/render/ElementCurveTo.cpp | 12 + esvg/render/ElementCurveTo.h | 31 +++ esvg/render/ElementElliptic.cpp | 12 + esvg/render/ElementElliptic.h | 29 ++ esvg/render/ElementLineTo.cpp | 12 + esvg/render/ElementLineTo.h | 29 ++ esvg/render/ElementLineToH.cpp | 12 + esvg/render/ElementLineToH.h | 29 ++ esvg/render/ElementLineToV.cpp | 12 + esvg/render/ElementLineToV.h | 29 ++ esvg/render/ElementMoveTo.cpp | 12 + esvg/render/ElementMoveTo.h | 29 ++ esvg/render/ElementSmoothCurveTo.cpp | 12 + esvg/render/ElementSmoothCurveTo.h | 30 ++ esvg/render/ElementStop.cpp | 12 + esvg/render/ElementStop.h | 29 ++ esvg/render/Path.cpp | 105 +++++++ esvg/render/Path.h | 45 +++ lutin_esvg.py | 29 +- 47 files changed, 831 insertions(+), 395 deletions(-) delete mode 100644 esvg/RenderPath.cpp delete mode 100644 esvg/RenderPath.h create mode 100644 esvg/render/Element.cpp create mode 100644 esvg/render/Element.h create mode 100644 esvg/render/ElementBezierCurveTo.cpp create mode 100644 esvg/render/ElementBezierCurveTo.h create mode 100644 esvg/render/ElementBezierSmoothCurveTo.cpp create mode 100644 esvg/render/ElementBezierSmoothCurveTo.h create mode 100644 esvg/render/ElementCurveTo.cpp create mode 100644 esvg/render/ElementCurveTo.h create mode 100644 esvg/render/ElementElliptic.cpp create mode 100644 esvg/render/ElementElliptic.h create mode 100644 esvg/render/ElementLineTo.cpp create mode 100644 esvg/render/ElementLineTo.h create mode 100644 esvg/render/ElementLineToH.cpp create mode 100644 esvg/render/ElementLineToH.h create mode 100644 esvg/render/ElementLineToV.cpp create mode 100644 esvg/render/ElementLineToV.h create mode 100644 esvg/render/ElementMoveTo.cpp create mode 100644 esvg/render/ElementMoveTo.h create mode 100644 esvg/render/ElementSmoothCurveTo.cpp create mode 100644 esvg/render/ElementSmoothCurveTo.h create mode 100644 esvg/render/ElementStop.cpp create mode 100644 esvg/render/ElementStop.h create mode 100644 esvg/render/Path.cpp create mode 100644 esvg/render/Path.h diff --git a/esvg/Base.cpp b/esvg/Base.cpp index 8c89608..b109ab3 100644 --- a/esvg/Base.cpp +++ b/esvg/Base.cpp @@ -404,6 +404,6 @@ const char * esvg::Base::spacingDist(int32_t _spacing) { return tmpValue + 20*4 - _spacing*4; } -void esvg::Base::aggDraw(esvg::Renderer& _myRenderer, mat2& _basicTrans, int32_t _level) { +void esvg::Base::draw(esvg::Renderer& _myRenderer, mat2& _basicTrans, int32_t _level) { SVG_WARNING(spacingDist(_level) << "DRAW esvg::Base ... ==> No drawing availlable"); } \ No newline at end of file diff --git a/esvg/Base.h b/esvg/Base.h index f1839bd..377c679 100644 --- a/esvg/Base.h +++ b/esvg/Base.h @@ -71,7 +71,7 @@ namespace esvg { virtual ~Base() { }; virtual bool parse(const std::shared_ptr& _element, mat2& _parentTrans, vec2& _sizeMax); //specific drawing for AAG librairy ... - virtual void aggDraw(esvg::Renderer& _myRenderer, mat2& _basicTrans, int32_t _level=1); + virtual void draw(esvg::Renderer& _myRenderer, mat2& _basicTrans, int32_t _level=1); virtual void display(int32_t _spacing) { }; void parseTransform(const std::shared_ptr& _element); diff --git a/esvg/Circle.cpp b/esvg/Circle.cpp index d3805b8..8d8c751 100644 --- a/esvg/Circle.cpp +++ b/esvg/Circle.cpp @@ -61,7 +61,7 @@ void esvg::Circle::display(int32_t _spacing) { } -void esvg::Circle::aggDraw(esvg::Renderer& _myRenderer, mat2& _basicTrans, int32_t _level) { +void esvg::Circle::draw(esvg::Renderer& _myRenderer, mat2& _basicTrans, int32_t _level) { SVG_VERBOSE(spacingDist(_level) << "DRAW esvg::Circle"); /* _myRenderer.m_renderArea->color(agg::rgba8(m_paint.fill.r, m_paint.fill.g, m_paint.fill.b, m_paint.fill.a)); diff --git a/esvg/Circle.h b/esvg/Circle.h index 7b9e390..182e4d1 100644 --- a/esvg/Circle.h +++ b/esvg/Circle.h @@ -21,7 +21,7 @@ namespace esvg { ~Circle(); virtual bool parse(const std::shared_ptr& _element, mat2& _parentTrans, vec2& _sizeMax); virtual void display(int32_t _spacing); - virtual void aggDraw(esvg::Renderer& _myRenderer, mat2& _basicTrans, int32_t _level); + virtual void draw(esvg::Renderer& _myRenderer, mat2& _basicTrans, int32_t _level); }; }; diff --git a/esvg/Ellipse.cpp b/esvg/Ellipse.cpp index 5d1e5bb..6255114 100644 --- a/esvg/Ellipse.cpp +++ b/esvg/Ellipse.cpp @@ -65,7 +65,7 @@ void esvg::Ellipse::display(int32_t _spacing) { } -void esvg::Ellipse::aggDraw(esvg::Renderer& _myRenderer, mat2& _basicTrans, int32_t _level) { +void esvg::Ellipse::draw(esvg::Renderer& _myRenderer, mat2& _basicTrans, int32_t _level) { SVG_VERBOSE(spacingDist(_level) << "DRAW esvg::Ellipse"); /* _myRenderer.m_renderArea->color(agg::rgba8(m_paint.fill.r, m_paint.fill.g, m_paint.fill.b, m_paint.fill.a)); diff --git a/esvg/Ellipse.h b/esvg/Ellipse.h index ee8be16..1d64632 100644 --- a/esvg/Ellipse.h +++ b/esvg/Ellipse.h @@ -21,7 +21,7 @@ namespace esvg { ~Ellipse(); virtual bool parse(const std::shared_ptr& _element, mat2& _parentTrans, vec2& _sizeMax); virtual void display(int32_t _spacing); - virtual void aggDraw(esvg::Renderer& _myRenderer, mat2& _basicTrans, int32_t _level); + virtual void draw(esvg::Renderer& _myRenderer, mat2& _basicTrans, int32_t _level); }; }; diff --git a/esvg/Group.cpp b/esvg/Group.cpp index eab6db9..a855909 100644 --- a/esvg/Group.cpp +++ b/esvg/Group.cpp @@ -109,11 +109,11 @@ void esvg::Group::display(int32_t _spacing) { SVG_DEBUG(spacingDist(_spacing) << "Group (STOP)"); } -void esvg::Group::aggDraw(esvg::Renderer& _myRenderer, mat2& _basicTrans, int32_t _level) { +void esvg::Group::draw(esvg::Renderer& _myRenderer, mat2& _basicTrans, int32_t _level) { SVG_VERBOSE(spacingDist(_level) << "DRAW esvg::group"); for (int32_t iii=0; iiiaggDraw(_myRenderer, _basicTrans, _level+1); + m_subElementList[iii]->draw(_myRenderer, _basicTrans, _level+1); } } } diff --git a/esvg/Group.h b/esvg/Group.h index 5ad9a76..0322771 100644 --- a/esvg/Group.h +++ b/esvg/Group.h @@ -21,7 +21,7 @@ namespace esvg { ~Group(); virtual bool parse(const std::shared_ptr& _element, mat2& _parentTrans, vec2& _sizeMax); virtual void display(int32_t spacing); - virtual void aggDraw(esvg::Renderer& _myRenderer, mat2& _basicTrans, int32_t _level); + virtual void draw(esvg::Renderer& _myRenderer, mat2& _basicTrans, int32_t _level); }; }; diff --git a/esvg/Line.cpp b/esvg/Line.cpp index 95b6328..9c675b1 100644 --- a/esvg/Line.cpp +++ b/esvg/Line.cpp @@ -58,7 +58,7 @@ void esvg::Line::display(int32_t _spacing) { SVG_DEBUG(spacingDist(_spacing) << "Line " << m_startPos << " to " << m_stopPos); } -void esvg::Line::aggDraw(esvg::Renderer& _myRenderer, mat2& _basicTrans, int32_t _level) { +void esvg::Line::draw(esvg::Renderer& _myRenderer, mat2& _basicTrans, int32_t _level) { SVG_VERBOSE(spacingDist(_level) << "DRAW esvg::Line"); # if 0 esvg::RenderPath path; diff --git a/esvg/Line.h b/esvg/Line.h index c85b732..d1860be 100644 --- a/esvg/Line.h +++ b/esvg/Line.h @@ -21,7 +21,7 @@ namespace esvg { ~Line(); virtual bool parse(const std::shared_ptr& _element, mat2& _parentTrans, vec2& _sizeMax); virtual void display(int32_t _spacing); - virtual void aggDraw(esvg::Renderer& _myRenderer, mat2& _basicTrans, int32_t _level); + virtual void draw(esvg::Renderer& _myRenderer, mat2& _basicTrans, int32_t _level); }; }; diff --git a/esvg/Path.cpp b/esvg/Path.cpp index dce89c5..e0b5a0d 100644 --- a/esvg/Path.cpp +++ b/esvg/Path.cpp @@ -86,185 +86,153 @@ bool esvg::Path::parse(const std::shared_ptr& _element, mat2& _pa for( const char *sss=extractCmd(elementXML, command, listDot); sss != nullptr; sss=extractCmd(sss, command, listDot) ) { - PathBasic pathElement; + bool relative = false; switch(command) { - case 'M': // Move to (absolute) - case 'L': // Line to (absolute) - case 'V': // Vertical Line to (absolute) - case 'H': // Horizantal Line to (absolute) - case 'Q': // Quadratic Bezier curve (absolute) - case 'T': // smooth quadratic Bezier curve to (absolute) - case 'C': // curve to (absolute) - case 'S': // smooth curve to (absolute) - case 'A': // elliptical Arc (absolute) - case 'Z': // closepath (absolute) - pathElement.m_relative = false; - break; - default : // else (relative) - pathElement.m_relative = true; - break; - } - switch(command) { - case 'M': // Move to (absolute) case 'm': // Move to (relative) + relative = true; + case 'M': // Move to (absolute) // 2 Elements ... if(listDot.size()%2 != 0) { SVG_WARNING("the PATH command "<< command << " has not the good number of element = " << listDot.size() ); break; } - pathElement.m_cmd = esvg::path_moveTo; if (listDot.size() >= 2) { - pathElement.m_element[0] = listDot[0]; - pathElement.m_element[1] = listDot[1]; - m_listElement.push_back(pathElement); + m_listElement.moveTo(relative, + vec2(listDot[0], listDot[1])); } - pathElement.m_cmd = esvg::path_lineTo; for(int32_t iii=2; iii& _element, mat2& _pa } void esvg::Path::display(int32_t _spacing) { - SVG_DEBUG(spacingDist(_spacing) << "Path"); - for(int32_t iii=0; iii listPoints; @@ -834,10 +747,10 @@ void esvg::Path::aggDraw(esvg::Renderer& _myRenderer, mat2& _basicTrans, int32_t int32_t recurtionMax = 10; float threshold = 0.25f; // Foreach element, we move in the path: - for(int32_t iii=0; iii -#include +#include namespace esvg { - enum pathProperty{ - path_stop, - path_moveTo, - path_lineTo, - path_lineToH, - path_lineToV, - path_curveTo, - path_smothCurveTo, - path_bezierCurveTo, - path_bezierSmothCurveTo, - path_elliptic - }; - class PathBasic { - public: - PathBasic() : m_cmd(esvg::path_stop), m_relative(false) { - for(int32_t iii=0; iii<7; ++iii) { - m_element[iii] = 0; - } - } - enum pathProperty m_cmd; - bool m_relative; - float m_element[7]; - }; class Path : public esvg::Base { - private: - std::vector m_listElement; + public: + esvg::render::Path m_listElement; public: Path(PaintState _parentPaintState); ~Path(); virtual bool parse(const std::shared_ptr& _element, mat2& _parentTrans, vec2& _sizeMax); virtual void display(int32_t _spacing); - virtual void aggDraw(esvg::Renderer& _myRenderer, mat2& _basicTrans, int32_t _level); + virtual void draw(esvg::Renderer& _myRenderer, mat2& _basicTrans, int32_t _level); }; }; diff --git a/esvg/Polygon.cpp b/esvg/Polygon.cpp index a459636..c5a6739 100644 --- a/esvg/Polygon.cpp +++ b/esvg/Polygon.cpp @@ -64,7 +64,7 @@ void esvg::Polygon::display(int32_t _spacing) { SVG_DEBUG(spacingDist(_spacing) << "Polygon nbPoint=" << m_listPoint.size()); } -void esvg::Polygon::aggDraw(esvg::Renderer& _myRenderer, mat2& _basicTrans, int32_t _level) { +void esvg::Polygon::draw(esvg::Renderer& _myRenderer, mat2& _basicTrans, int32_t _level) { SVG_VERBOSE(spacingDist(_level) << "DRAW esvg::Polygon"); #if 0 diff --git a/esvg/Polygon.h b/esvg/Polygon.h index 31ddf54..688d6c7 100644 --- a/esvg/Polygon.h +++ b/esvg/Polygon.h @@ -28,7 +28,7 @@ namespace esvg { ~Polygon(); virtual bool parse(const std::shared_ptr& _element, mat2& _parentTrans, vec2& _sizeMax); virtual void display(int32_t _spacing); - virtual void aggDraw(esvg::Renderer& _myRenderer, mat2& _basicTrans, int32_t _level); + virtual void draw(esvg::Renderer& _myRenderer, mat2& _basicTrans, int32_t _level); }; }; diff --git a/esvg/Polyline.cpp b/esvg/Polyline.cpp index b371ad4..5a708fc 100644 --- a/esvg/Polyline.cpp +++ b/esvg/Polyline.cpp @@ -57,7 +57,7 @@ void esvg::Polyline::display(int32_t _spacing) { } -void esvg::Polyline::aggDraw(esvg::Renderer& _myRenderer, mat2& _basicTrans, int32_t _level) { +void esvg::Polyline::draw(esvg::Renderer& _myRenderer, mat2& _basicTrans, int32_t _level) { SVG_VERBOSE(spacingDist(_level) << "DRAW esvg::Polyline"); diff --git a/esvg/Polyline.h b/esvg/Polyline.h index fc12921..82332c5 100644 --- a/esvg/Polyline.h +++ b/esvg/Polyline.h @@ -21,7 +21,7 @@ namespace esvg { ~Polyline(); virtual bool parse(const std::shared_ptr& _element, mat2& _parentTrans, vec2& _sizeMax); virtual void display(int32_t _spacing); - virtual void aggDraw(esvg::Renderer& _myRenderer, mat2& _basicTrans, int32_t _level); + virtual void draw(esvg::Renderer& _myRenderer, mat2& _basicTrans, int32_t _level); }; }; diff --git a/esvg/Rectangle.cpp b/esvg/Rectangle.cpp index 34cac4a..f914bf2 100644 --- a/esvg/Rectangle.cpp +++ b/esvg/Rectangle.cpp @@ -56,7 +56,7 @@ void esvg::Rectangle::display(int32_t _spacing) { SVG_DEBUG(spacingDist(_spacing) << "Rectangle : pos=" << m_position << " size=" << m_size << " corner=" << m_roundedCorner); } -void esvg::Rectangle::aggDraw(esvg::Renderer& _myRenderer, mat2& _basicTrans, int32_t _level) { +void esvg::Rectangle::draw(esvg::Renderer& _myRenderer, mat2& _basicTrans, int32_t _level) { SVG_VERBOSE(spacingDist(_level) << "DRAW esvg::Rectangle"); #if 0 diff --git a/esvg/Rectangle.h b/esvg/Rectangle.h index 04b315b..6e11597 100644 --- a/esvg/Rectangle.h +++ b/esvg/Rectangle.h @@ -22,7 +22,7 @@ namespace esvg { ~Rectangle(); virtual bool parse(const std::shared_ptr& _element, mat2& _parentTrans, vec2& _sizeMax); virtual void display(int32_t _spacing); - virtual void aggDraw(esvg::Renderer& _myRenderer, mat2& _basicTrans, int32_t _level); + virtual void draw(esvg::Renderer& _myRenderer, mat2& _basicTrans, int32_t _level); }; }; diff --git a/esvg/RenderPath.cpp b/esvg/RenderPath.cpp deleted file mode 100644 index d0f4feb..0000000 --- a/esvg/RenderPath.cpp +++ /dev/null @@ -1,103 +0,0 @@ -/** - * @author Edouard DUPIN - * - * @copyright 2011, Edouard DUPIN, all right reserved - * - * @license APACHE v2.0 (see license file) - */ -#include -#include - -void esvg::RenderPath::clear() { - m_points.clear(); -} - -void esvg::RenderPath::stop() { - SVG_TODO("Must be implemented"); -} - -void esvg::RenderPath::addPoint(const vec2& _pos) { - m_points.push_back(_pos); -} - -void esvg::RenderPath::moveTo(bool _relative, vec2 _pos) { - if(_relative == true) { - _pos = relativeToAbsolute(_pos); - } - if (m_points.size() > 0) { - m_points.back() = _pos; - } else { - addPoint(_pos); - } -} - -vec2 esvg::RenderPath::relativeToAbsolute(const vec2& _value) { - vec2 out(_value); - if (m_points.size() > 0) { - out += m_points.back(); - } - return out; -} - -void esvg::RenderPath::lineTo(bool _relative, vec2 _pos) { - if(_relative == true) { - _pos = relativeToAbsolute(_pos); - } - vec2 pos; - vec2 delta; - if (m_points.size() > 0) { - vec2 oldPos = m_points.back(); - vec2 delta = _pos - oldPos; - // create a basic bezier curve ... - addPoint(oldPos + delta*0.3333f); - addPoint(oldPos - delta*0.3333f); - addPoint(_pos); - } else { - SVG_ERROR("try to lineTo whith no previous point ..."); - } -} - -void esvg::RenderPath::curve3SmoothTo(bool _relative, vec2 _pos) { - if(_relative == true) { - _pos = relativeToAbsolute(_pos); - } - SVG_TODO("later ..."); -} - -void esvg::RenderPath::curve3To(bool _relative, vec2 _pos1, vec2 _pos) { - if(_relative == true) { - _pos1 = relativeToAbsolute(_pos1); - _pos = relativeToAbsolute(_pos); - } - SVG_TODO("later ..."); -} - -void esvg::RenderPath::curve4SmoothTo(bool _relative, vec2 _pos2, vec2 _pos) { - if(_relative == true) { - _pos2 = relativeToAbsolute(_pos2); - _pos = relativeToAbsolute(_pos); - } - SVG_TODO("later ..."); -} - -void esvg::RenderPath::curve4To(bool _relative, vec2 _pos1, vec2 _pos2, vec2 _pos) { - if(_relative == true) { - _pos1 = relativeToAbsolute(_pos1); - _pos2 = relativeToAbsolute(_pos2); - _pos = relativeToAbsolute(_pos); - } - addPoint(_pos1); - addPoint(_pos2); - addPoint(_pos); -} - -void esvg::RenderPath::display() { - SVG_VERBOSE("PATH : "); - for (uint32_t iii=0; iii -#include - - -namespace esvg { - class RenderPath { - public: - std::vector m_points; - public: - RenderPath() { - - } - - ~RenderPath() { - - } - void clear(); - void stop(); - void addPoint(const vec2& _pos); - - void moveTo(bool _relative, vec2 _pos); - void lineTo(bool _relative, vec2 _pos); - void curve4To(bool _relative, vec2 _pos1, vec2 _pos2, vec2 _pos); - void curve4SmoothTo(bool _relative, vec2 _pos2, vec2 _pos); - void curve3To(bool _relative, vec2 _pos1, vec2 _pos); - void curve3SmoothTo(bool _relative, vec2 _pos); - //void ellipticTo(bool _relative, 7 values ...); - - vec2 relativeToAbsolute(const vec2& _value); - void display(); - }; -}; - -#endif diff --git a/esvg/esvg.cpp b/esvg/esvg.cpp index 2e8f950..9384329 100644 --- a/esvg/esvg.cpp +++ b/esvg/esvg.cpp @@ -56,11 +56,11 @@ void esvg::Document::displayDebug() { } -void esvg::Document::aggDraw(esvg::Renderer& _myRenderer, mat2& _basicTrans) +void esvg::Document::draw(esvg::Renderer& _myRenderer, mat2& _basicTrans) { for (int32_t iii=0; iiiaggDraw(_myRenderer, _basicTrans); + m_subElementList[iii]->draw(_myRenderer, _basicTrans); } } } @@ -89,7 +89,7 @@ void esvg::Document::generateTestFile() //basicTrans *= etk::mat2Translate(vec2(width/3, height/3)); - aggDraw(*m_renderedElement, basicTrans); + draw(*m_renderedElement, basicTrans); std::string tmpFileOut = "yyy_out_"; tmpFileOut += m_fileName; tmpFileOut += ".ppm"; @@ -124,7 +124,7 @@ void esvg::Document::generateAnImage(int32_t _sizeX, int32_t _sizeY) { //basicTrans *= etk::mat2Translate(vec2(width*0.3, height/2)); //basicTrans *= etk::mat2Translate(vec2(width/3, height/3)); - aggDraw(*m_renderedElement, basicTrans); + draw(*m_renderedElement, basicTrans); std::string tmpFileOut = "zzz_out_test.ppm"; m_renderedElement->writePpm(tmpFileOut); } diff --git a/esvg/esvg.h b/esvg/esvg.h index c5731c3..09fadfe 100644 --- a/esvg/esvg.h +++ b/esvg/esvg.h @@ -71,7 +71,7 @@ namespace esvg { void generateAnImage(int32_t _sizeX, int32_t _sizeY); //void generateAnImage(ivec2 _size, draw::Image& _output); //void generateAnImage(draw::Image& _output); - virtual void aggDraw(esvg::Renderer& _myRenderer, mat2& _basicTrans); + virtual void draw(esvg::Renderer& _myRenderer, mat2& _basicTrans); uint8_t* getPointerOnData(); uint32_t getSizeOnData(); vec2 getDefinedSize() { diff --git a/esvg/render/Element.cpp b/esvg/render/Element.cpp new file mode 100644 index 0000000..3317bcf --- /dev/null +++ b/esvg/render/Element.cpp @@ -0,0 +1,12 @@ +/** + * @author Edouard DUPIN + * + * @copyright 2011, Edouard DUPIN, all right reserved + * + * @license APACHE v2.0 (see license file) + */ + +#include +#include + + diff --git a/esvg/render/Element.h b/esvg/render/Element.h new file mode 100644 index 0000000..eb51fe5 --- /dev/null +++ b/esvg/render/Element.h @@ -0,0 +1,95 @@ +/** + * @author Edouard DUPIN + * + * @copyright 2011, Edouard DUPIN, all right reserved + * + * @license APACHE v2.0 (see license file) + */ + +#ifndef __ESVG_RENDER_ELEMENT_H__ +#define __ESVG_RENDER_ELEMENT_H__ + +#include +#include + +namespace esvg { + namespace render { + enum path { + path_stop, + path_moveTo, + path_lineTo, + path_lineToH, + path_lineToV, + path_curveTo, + path_smoothCurveTo, + path_bezierCurveTo, + path_bezierSmoothCurveTo, + path_elliptic + }; + class Element { + public: + Element(enum path _type, bool _relative=false) : + m_cmd(_type), + m_relative(_relative) { + + } + virtual ~Element() { } + private: + enum path m_cmd; + public: + enum path getType() const { + return m_cmd; + } + protected: + bool m_relative; + public: + bool getRelative() const { + return m_relative; + } + void setRelative(bool _relative) { + m_relative = _relative; + } + protected: + vec2 m_pos; + public: + const vec2& getPos() const { + return m_pos; + } + void setPos(const vec2& _val) { + m_pos = _val; + } + protected: + vec2 m_pos1; + public: + const vec2& getPos1() const { + return m_pos1; + } + void setPos1(const vec2& _val) { + m_pos1 = _val; + } + protected: + vec2 m_pos2; + public: + const vec2& getPos2() const { + return m_pos2; + } + void setPos2(const vec2& _val) { + m_pos2 = _val; + } + }; + } +} + +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + diff --git a/esvg/render/ElementBezierCurveTo.cpp b/esvg/render/ElementBezierCurveTo.cpp new file mode 100644 index 0000000..3317bcf --- /dev/null +++ b/esvg/render/ElementBezierCurveTo.cpp @@ -0,0 +1,12 @@ +/** + * @author Edouard DUPIN + * + * @copyright 2011, Edouard DUPIN, all right reserved + * + * @license APACHE v2.0 (see license file) + */ + +#include +#include + + diff --git a/esvg/render/ElementBezierCurveTo.h b/esvg/render/ElementBezierCurveTo.h new file mode 100644 index 0000000..2b0eacf --- /dev/null +++ b/esvg/render/ElementBezierCurveTo.h @@ -0,0 +1,30 @@ +/** + * @author Edouard DUPIN + * + * @copyright 2011, Edouard DUPIN, all right reserved + * + * @license APACHE v2.0 (see license file) + */ + +#ifndef __ESVG_RENDER_ELEMENT_BEZIER_CURVE_TO_H__ +#define __ESVG_RENDER_ELEMENT_BEZIER_CURVE_TO_H__ + +#include +#include +#include + +namespace esvg { + namespace render { + class ElementBezierCurveTo : public Element { + public: + ElementBezierCurveTo(bool _relative, const vec2& _pos1, const vec2& _pos): + Element(esvg::render::path_bezierCurveTo, _relative) { + m_pos = _pos; + m_pos1 = _pos1; + } + }; + } +} + +#endif + diff --git a/esvg/render/ElementBezierSmoothCurveTo.cpp b/esvg/render/ElementBezierSmoothCurveTo.cpp new file mode 100644 index 0000000..3317bcf --- /dev/null +++ b/esvg/render/ElementBezierSmoothCurveTo.cpp @@ -0,0 +1,12 @@ +/** + * @author Edouard DUPIN + * + * @copyright 2011, Edouard DUPIN, all right reserved + * + * @license APACHE v2.0 (see license file) + */ + +#include +#include + + diff --git a/esvg/render/ElementBezierSmoothCurveTo.h b/esvg/render/ElementBezierSmoothCurveTo.h new file mode 100644 index 0000000..a3960af --- /dev/null +++ b/esvg/render/ElementBezierSmoothCurveTo.h @@ -0,0 +1,29 @@ +/** + * @author Edouard DUPIN + * + * @copyright 2011, Edouard DUPIN, all right reserved + * + * @license APACHE v2.0 (see license file) + */ + +#ifndef __ESVG_RENDER_ELEMENT_BEZIER_SMOOTH_CURVE_TO_H__ +#define __ESVG_RENDER_ELEMENT_BEZIER_SMOOTH_CURVE_TO_H__ + +#include +#include +#include + +namespace esvg { + namespace render { + class ElementBezierSmoothCurveTo : public Element { + public: + ElementBezierSmoothCurveTo(bool _relative, const vec2& _pos): + Element(esvg::render::path_bezierSmoothCurveTo, _relative) { + m_pos = _pos; + } + }; + } +} + +#endif + diff --git a/esvg/render/ElementCurveTo.cpp b/esvg/render/ElementCurveTo.cpp new file mode 100644 index 0000000..3317bcf --- /dev/null +++ b/esvg/render/ElementCurveTo.cpp @@ -0,0 +1,12 @@ +/** + * @author Edouard DUPIN + * + * @copyright 2011, Edouard DUPIN, all right reserved + * + * @license APACHE v2.0 (see license file) + */ + +#include +#include + + diff --git a/esvg/render/ElementCurveTo.h b/esvg/render/ElementCurveTo.h new file mode 100644 index 0000000..221ce17 --- /dev/null +++ b/esvg/render/ElementCurveTo.h @@ -0,0 +1,31 @@ +/** + * @author Edouard DUPIN + * + * @copyright 2011, Edouard DUPIN, all right reserved + * + * @license APACHE v2.0 (see license file) + */ + +#ifndef __ESVG_RENDER_ELEMENT_CURVE_TO_H__ +#define __ESVG_RENDER_ELEMENT_CURVE_TO_H__ + +#include +#include +#include + +namespace esvg { + namespace render { + class ElementCurveTo : public Element { + public: + ElementCurveTo(bool _relative, const vec2& _pos1, const vec2& _pos2, const vec2& _pos): + Element(esvg::render::path_curveTo, _relative) { + m_pos = _pos; + m_pos1 = _pos1; + m_pos2 = _pos2; + } + }; + } +} + +#endif + diff --git a/esvg/render/ElementElliptic.cpp b/esvg/render/ElementElliptic.cpp new file mode 100644 index 0000000..3317bcf --- /dev/null +++ b/esvg/render/ElementElliptic.cpp @@ -0,0 +1,12 @@ +/** + * @author Edouard DUPIN + * + * @copyright 2011, Edouard DUPIN, all right reserved + * + * @license APACHE v2.0 (see license file) + */ + +#include +#include + + diff --git a/esvg/render/ElementElliptic.h b/esvg/render/ElementElliptic.h new file mode 100644 index 0000000..b09ffd1 --- /dev/null +++ b/esvg/render/ElementElliptic.h @@ -0,0 +1,29 @@ +/** + * @author Edouard DUPIN + * + * @copyright 2011, Edouard DUPIN, all right reserved + * + * @license APACHE v2.0 (see license file) + */ + +#ifndef __ESVG_RENDER_ELEMENT_ELLIPTIC_H__ +#define __ESVG_RENDER_ELEMENT_ELLIPTIC_H__ + +#include +#include +#include + +namespace esvg { + namespace render { + class ElementElliptic : public Element { + public: + ElementElliptic(bool _relative, float _val0, float _val1, float _val2, float _val3, float _val4, float _val5, float _val6): + Element(esvg::render::path_elliptic, _relative) { + // TODO ... later ... + } + }; + } +} + +#endif + diff --git a/esvg/render/ElementLineTo.cpp b/esvg/render/ElementLineTo.cpp new file mode 100644 index 0000000..3317bcf --- /dev/null +++ b/esvg/render/ElementLineTo.cpp @@ -0,0 +1,12 @@ +/** + * @author Edouard DUPIN + * + * @copyright 2011, Edouard DUPIN, all right reserved + * + * @license APACHE v2.0 (see license file) + */ + +#include +#include + + diff --git a/esvg/render/ElementLineTo.h b/esvg/render/ElementLineTo.h new file mode 100644 index 0000000..5940550 --- /dev/null +++ b/esvg/render/ElementLineTo.h @@ -0,0 +1,29 @@ +/** + * @author Edouard DUPIN + * + * @copyright 2011, Edouard DUPIN, all right reserved + * + * @license APACHE v2.0 (see license file) + */ + +#ifndef __ESVG_RENDER_ELEMENT_LINE_TO_H__ +#define __ESVG_RENDER_ELEMENT_LINE_TO_H__ + +#include +#include +#include + +namespace esvg { + namespace render { + class ElementLineTo : public Element { + public: + ElementLineTo(bool _relative, const vec2& _pos): + Element(esvg::render::path_lineTo, _relative) { + m_pos = _pos; + } + }; + } +} + +#endif + diff --git a/esvg/render/ElementLineToH.cpp b/esvg/render/ElementLineToH.cpp new file mode 100644 index 0000000..3317bcf --- /dev/null +++ b/esvg/render/ElementLineToH.cpp @@ -0,0 +1,12 @@ +/** + * @author Edouard DUPIN + * + * @copyright 2011, Edouard DUPIN, all right reserved + * + * @license APACHE v2.0 (see license file) + */ + +#include +#include + + diff --git a/esvg/render/ElementLineToH.h b/esvg/render/ElementLineToH.h new file mode 100644 index 0000000..0fe5b40 --- /dev/null +++ b/esvg/render/ElementLineToH.h @@ -0,0 +1,29 @@ +/** + * @author Edouard DUPIN + * + * @copyright 2011, Edouard DUPIN, all right reserved + * + * @license APACHE v2.0 (see license file) + */ + +#ifndef __ESVG_RENDER_ELEMENT_LINE_TO_H_H__ +#define __ESVG_RENDER_ELEMENT_LINE_TO_H_H__ + +#include +#include +#include + +namespace esvg { + namespace render { + class ElementLineToH : public Element { + public: + ElementLineToH(bool _relative, float _posX): + Element(esvg::render::path_lineToH, _relative) { + m_pos = vec2(_posX, 0.0f); + } + }; + } +} + +#endif + diff --git a/esvg/render/ElementLineToV.cpp b/esvg/render/ElementLineToV.cpp new file mode 100644 index 0000000..3317bcf --- /dev/null +++ b/esvg/render/ElementLineToV.cpp @@ -0,0 +1,12 @@ +/** + * @author Edouard DUPIN + * + * @copyright 2011, Edouard DUPIN, all right reserved + * + * @license APACHE v2.0 (see license file) + */ + +#include +#include + + diff --git a/esvg/render/ElementLineToV.h b/esvg/render/ElementLineToV.h new file mode 100644 index 0000000..2de7a85 --- /dev/null +++ b/esvg/render/ElementLineToV.h @@ -0,0 +1,29 @@ +/** + * @author Edouard DUPIN + * + * @copyright 2011, Edouard DUPIN, all right reserved + * + * @license APACHE v2.0 (see license file) + */ + +#ifndef __ESVG_RENDER_ELEMENT_LINE_TO_V_H__ +#define __ESVG_RENDER_ELEMENT_LINE_TO_V_H__ + +#include +#include +#include + +namespace esvg { + namespace render { + class ElementLineToV : public Element { + public: + ElementLineToV(bool _relative, float _posY): + Element(esvg::render::path_lineToV, _relative) { + m_pos = vec2(0.0f, _posY); + } + }; + } +} + +#endif + diff --git a/esvg/render/ElementMoveTo.cpp b/esvg/render/ElementMoveTo.cpp new file mode 100644 index 0000000..3317bcf --- /dev/null +++ b/esvg/render/ElementMoveTo.cpp @@ -0,0 +1,12 @@ +/** + * @author Edouard DUPIN + * + * @copyright 2011, Edouard DUPIN, all right reserved + * + * @license APACHE v2.0 (see license file) + */ + +#include +#include + + diff --git a/esvg/render/ElementMoveTo.h b/esvg/render/ElementMoveTo.h new file mode 100644 index 0000000..8d67fae --- /dev/null +++ b/esvg/render/ElementMoveTo.h @@ -0,0 +1,29 @@ +/** + * @author Edouard DUPIN + * + * @copyright 2011, Edouard DUPIN, all right reserved + * + * @license APACHE v2.0 (see license file) + */ + +#ifndef __ESVG_RENDER_ELEMENT_MOVE_TO_H__ +#define __ESVG_RENDER_ELEMENT_MOVE_TO_H__ + +#include +#include +#include + +namespace esvg { + namespace render { + class ElementMoveTo : public Element { + public: + ElementMoveTo(bool _relative, const vec2& _pos): + Element(esvg::render::path_moveTo, _relative) { + m_pos = _pos; + } + }; + } +} + +#endif + diff --git a/esvg/render/ElementSmoothCurveTo.cpp b/esvg/render/ElementSmoothCurveTo.cpp new file mode 100644 index 0000000..3317bcf --- /dev/null +++ b/esvg/render/ElementSmoothCurveTo.cpp @@ -0,0 +1,12 @@ +/** + * @author Edouard DUPIN + * + * @copyright 2011, Edouard DUPIN, all right reserved + * + * @license APACHE v2.0 (see license file) + */ + +#include +#include + + diff --git a/esvg/render/ElementSmoothCurveTo.h b/esvg/render/ElementSmoothCurveTo.h new file mode 100644 index 0000000..bd89846 --- /dev/null +++ b/esvg/render/ElementSmoothCurveTo.h @@ -0,0 +1,30 @@ +/** + * @author Edouard DUPIN + * + * @copyright 2011, Edouard DUPIN, all right reserved + * + * @license APACHE v2.0 (see license file) + */ + +#ifndef __ESVG_RENDER_ELEMENT_SMOOTH_CURVE_TO_H__ +#define __ESVG_RENDER_ELEMENT_SMOOTH_CURVE_TO_H__ + +#include +#include +#include + +namespace esvg { + namespace render { + class ElementSmoothCurveTo : public Element { + public: + ElementSmoothCurveTo(bool _relative, const vec2& _pos2, const vec2& _pos): + Element(esvg::render::path_smoothCurveTo, _relative) { + m_pos = _pos; + m_pos2 = _pos2; + } + }; + } +} + +#endif + diff --git a/esvg/render/ElementStop.cpp b/esvg/render/ElementStop.cpp new file mode 100644 index 0000000..3317bcf --- /dev/null +++ b/esvg/render/ElementStop.cpp @@ -0,0 +1,12 @@ +/** + * @author Edouard DUPIN + * + * @copyright 2011, Edouard DUPIN, all right reserved + * + * @license APACHE v2.0 (see license file) + */ + +#include +#include + + diff --git a/esvg/render/ElementStop.h b/esvg/render/ElementStop.h new file mode 100644 index 0000000..23a6425 --- /dev/null +++ b/esvg/render/ElementStop.h @@ -0,0 +1,29 @@ +/** + * @author Edouard DUPIN + * + * @copyright 2011, Edouard DUPIN, all right reserved + * + * @license APACHE v2.0 (see license file) + */ + +#ifndef __ESVG_RENDER_ELEMENT_STOP_H__ +#define __ESVG_RENDER_ELEMENT_STOP_H__ + +#include +#include +#include + +namespace esvg { + namespace render { + class ElementStop : public Element { + public: + ElementStop(bool _relative=false): + Element(esvg::render::path_stop, _relative) { + + } + }; + } +} + +#endif + diff --git a/esvg/render/Path.cpp b/esvg/render/Path.cpp new file mode 100644 index 0000000..7ebc1dd --- /dev/null +++ b/esvg/render/Path.cpp @@ -0,0 +1,105 @@ +/** + * @author Edouard DUPIN + * + * @copyright 2011, Edouard DUPIN, all right reserved + * + * @license APACHE v2.0 (see license file) + */ +#include +#include +#include + +void esvg::render::Path::clear() { + m_listElement.clear(); +} + +void esvg::render::Path::stop(bool _relative) { + m_listElement.push_back(esvg::render::ElementStop(_relative)); +} + +void esvg::render::Path::moveTo(bool _relative, const vec2& _pos) { + m_listElement.push_back(esvg::render::ElementMoveTo(_relative, _pos)); +} + +void esvg::render::Path::lineTo(bool _relative, const vec2& _pos) { + m_listElement.push_back(esvg::render::ElementLineTo(_relative, _pos)); +} + +void esvg::render::Path::lineToH(bool _relative, float _posX) { + m_listElement.push_back(esvg::render::ElementLineToH(_relative, _posX)); +} + +void esvg::render::Path::lineToV(bool _relative, float _posY) { + m_listElement.push_back(esvg::render::ElementLineToV(_relative, _posY)); +} + +void esvg::render::Path::curveTo(bool _relative, const vec2& _pos1, const vec2& _pos2, const vec2& _pos) { + m_listElement.push_back(esvg::render::ElementCurveTo(_relative, _pos1, _pos2, _pos)); +} + +void esvg::render::Path::smoothCurveTo(bool _relative, const vec2& _pos2, const vec2& _pos) { + m_listElement.push_back(esvg::render::ElementSmoothCurveTo(_relative, _pos2, _pos)); +} + +void esvg::render::Path::bezierCurveTo(bool _relative, const vec2& _pos1, const vec2& _pos) { + m_listElement.push_back(esvg::render::ElementBezierCurveTo(_relative, _pos1, _pos)); +} + +void esvg::render::Path::bezierSmoothCurveTo(bool _relative, const vec2& _pos) { + m_listElement.push_back(esvg::render::ElementBezierSmoothCurveTo(_relative, _pos)); +} + +void esvg::render::Path::ellipticTo(bool _relative, float _val0, float _val1, float _val2, float _val3, float _val4, float _val5, float _val6) { + m_listElement.push_back(esvg::render::ElementElliptic(_relative, _val0, _val1, _val2, _val3, _val4, _val5, _val6)); +} + +static const char* spacingDist(int32_t _spacing) { + static const char *tmpValue = " "; + if (_spacing>20) { + _spacing = 20; + } + return tmpValue + 20*4 - _spacing*4; +} + +void esvg::render::Path::display(int32_t _spacing) { + SVG_DEBUG(spacingDist(_spacing) << "Path"); + for(auto &it : m_listElement) { + switch (it.getType()) { + case esvg::render::path_stop: + SVG_DEBUG(spacingDist(_spacing+4) << "STOP"); + break; + case esvg::render::path_moveTo: + SVG_DEBUG(spacingDist(_spacing+4) << "MOVETO " << it.getPos() ); + break; + case esvg::render::path_lineTo: + SVG_DEBUG(spacingDist(_spacing+4) << "LINETO " << it.getPos() ); + break; + case esvg::render::path_lineToH: + SVG_DEBUG(spacingDist(_spacing+4) << "LINETO_H " << it.getPos().x()); + break; + case esvg::render::path_lineToV: + SVG_DEBUG(spacingDist(_spacing+4) << "LINETO_V " << it.getPos().y() ); + break; + case esvg::render::path_curveTo: + SVG_DEBUG(spacingDist(_spacing+4) << "CURVETO " << it.getPos2() << " " << it.getPos1() << " " << it.getPos() ); + break; + case esvg::render::path_smoothCurveTo: + SVG_DEBUG(spacingDist(_spacing+4) << "SMOOTH_CURVETO " << it.getPos2() << " " << it.getPos() ); + break; + case esvg::render::path_bezierCurveTo: + SVG_DEBUG(spacingDist(_spacing+4) << "BEZIER_CURVETO " << it.getPos1() << " " << it.getPos() ); + break; + case esvg::render::path_bezierSmoothCurveTo: + SVG_DEBUG(spacingDist(_spacing+4) << "BEZIER_SMOOTH_CURVETO " << it.getPos() ); + break; + case esvg::render::path_elliptic: + SVG_DEBUG(spacingDist(_spacing+4) << "ELLIPTIC ???"); + // show explanation at : http://www.w3.org/TR/SVG/paths.html#PathDataEllipticalArcCommands + break; + default: + SVG_DEBUG(spacingDist(_spacing+4) << "????" ); + break; + } + } +} + diff --git a/esvg/render/Path.h b/esvg/render/Path.h new file mode 100644 index 0000000..bd1b799 --- /dev/null +++ b/esvg/render/Path.h @@ -0,0 +1,45 @@ +/** + * @author Edouard DUPIN + * + * @copyright 2011, Edouard DUPIN, all right reserved + * + * @license APACHE v2.0 (see license file) + */ + +#ifndef __ESVG_RENDER_PATH_H__ +#define __ESVG_RENDER_PATH_H__ + +#include +#include +#include + +namespace esvg { + namespace render { + class Path { + public: + std::vector m_listElement; + public: + Path() { + + } + + ~Path() { + + } + void clear(); + void stop(bool _relative); + void moveTo(bool _relative, const vec2& _pos); + void lineTo(bool _relative, const vec2& _pos); + void lineToH(bool _relative, float _posX); + void lineToV(bool _relative, float _posY); + void curveTo(bool _relative, const vec2& _pos1, const vec2& _pos2, const vec2& _pos); + void smoothCurveTo(bool _relative, const vec2& _pos2, const vec2& _pos); + void bezierCurveTo(bool _relative, const vec2& _pos1, const vec2& _pos); + void bezierSmoothCurveTo(bool _relative, const vec2& _pos); + void ellipticTo(bool _relative, float _val0, float _val1, float _val2, float _val3, float _val4, float _val5, float _val6); + void display(int32_t _spacing); + }; + } +} + +#endif diff --git a/lutin_esvg.py b/lutin_esvg.py index 9eaacd0..b972837 100644 --- a/lutin_esvg.py +++ b/lutin_esvg.py @@ -40,9 +40,20 @@ def create(target, module_name): 'esvg/Polyline.cpp', 'esvg/Rectangle.cpp', 'esvg/Renderer.cpp', - 'esvg/RenderPath.cpp', 'esvg/Stroking.cpp', - 'esvg/Text.cpp' + 'esvg/Text.cpp', + 'esvg/render/Path.cpp', + 'esvg/render/Element.cpp', + 'esvg/render/ElementStop.cpp', + 'esvg/render/ElementMoveTo.cpp', + 'esvg/render/ElementLineTo.cpp', + 'esvg/render/ElementLineToH.cpp', + 'esvg/render/ElementLineToV.cpp', + 'esvg/render/ElementCurveTo.cpp', + 'esvg/render/ElementSmoothCurveTo.cpp', + 'esvg/render/ElementBezierCurveTo.cpp', + 'esvg/render/ElementBezierSmoothCurveTo.cpp', + 'esvg/render/ElementElliptic.cpp' ]) my_module.add_header_file([ @@ -58,7 +69,19 @@ def create(target, module_name): 'esvg/Rectangle.h', 'esvg/Renderer.h', 'esvg/Stroking.h', - 'esvg/Text.h' + 'esvg/Text.h', + 'esvg/render/Path.h', + 'esvg/render/Element.h', + 'esvg/render/ElementStop.h', + 'esvg/render/ElementMoveTo.h', + 'esvg/render/ElementLineTo.h', + 'esvg/render/ElementLineToH.h', + 'esvg/render/ElementLineToV.h', + 'esvg/render/ElementCurveTo.h', + 'esvg/render/ElementSmoothCurveTo.h', + 'esvg/render/ElementBezierCurveTo.h', + 'esvg/render/ElementBezierSmoothCurveTo.h', + 'esvg/render/ElementElliptic.h' ]) my_module.add_path(tools.get_current_path(__file__))