From aa6e69c7e767e3b1e1912cecc24b918f395e3278 Mon Sep 17 00:00:00 2001 From: Edouard DUPIN Date: Fri, 4 Dec 2015 22:03:16 +0100 Subject: [PATCH] [DEV] remove memory leak --- esvg/Base.h | 8 -------- esvg/Group.cpp | 41 ++++++++++++++++++++--------------------- esvg/Group.h | 2 +- esvg/esvg.cpp | 28 ++++++++++++++-------------- esvg/esvg.h | 3 ++- 5 files changed, 37 insertions(+), 45 deletions(-) diff --git a/esvg/Base.h b/esvg/Base.h index 1a03af5..7e87c73 100644 --- a/esvg/Base.h +++ b/esvg/Base.h @@ -33,14 +33,6 @@ namespace esvg { paint_gradientLinear, //!< Painting a linear gradient. paint_gradientRadial //!< Painting a radial gradient. }; - /** - * @brief Indicates what happens if the gradient starts or ends inside the bounds of the target rectangle. - */ - enum spread { - spread_pad, //!< 'pad' spread. - spread_reflect, //!< 'reflect' spread. - spread_repead, //!< 'repead' spread. - }; class PaintState { public: diff --git a/esvg/Group.cpp b/esvg/Group.cpp index 1cf726f..ec987a4 100644 --- a/esvg/Group.cpp +++ b/esvg/Group.cpp @@ -57,44 +57,43 @@ bool esvg::Group::parseXML(const std::shared_ptr& _element, mat2& // can be a comment ... continue; } - esvg::Base *elementParser = nullptr; + std::shared_ptr elementParser; if (child->getValue() == "g") { - elementParser = new esvg::Group(m_paint); + elementParser = std::make_shared(m_paint); } else if (child->getValue() == "a") { // TODO ... } else if (child->getValue() == "path") { - elementParser = new esvg::Path(m_paint); + elementParser = std::make_shared(m_paint); } else if (child->getValue() == "rect") { - elementParser = new esvg::Rectangle(m_paint); + elementParser = std::make_shared(m_paint); } else if (child->getValue() == "circle") { - elementParser = new esvg::Circle(m_paint); + elementParser = std::make_shared(m_paint); } else if (child->getValue() == "ellipse") { - elementParser = new esvg::Ellipse(m_paint); + elementParser = std::make_shared(m_paint); } else if (child->getValue() == "line") { - elementParser = new esvg::Line(m_paint); + elementParser = std::make_shared(m_paint); } else if (child->getValue() == "polyline") { - elementParser = new esvg::Polyline(m_paint); + elementParser = std::make_shared(m_paint); } else if (child->getValue() == "polygon") { - elementParser = new esvg::Polygon(m_paint); + elementParser = std::make_shared(m_paint); } else if (child->getValue() == "text") { - elementParser = new esvg::Text(m_paint); + elementParser = std::make_shared(m_paint); } else { SVG_ERROR("(l "<getPos()<<") node not suported : \""<getValue()<<"\" must be [g,a,path,rect,circle,ellipse,line,polyline,polygon,text]"); } if (elementParser == nullptr) { SVG_ERROR("(l "<getPos()<<") error on node: \""<getValue()<<"\" allocation error or not supported ..."); - } else { - if (false == elementParser->parseXML(child, m_transformMatrix, tmpPos)) { - SVG_ERROR("(l "<getPos()<<") error on node: \""<getValue()<<"\" Sub Parsing ERROR"); - delete(elementParser); - elementParser = nullptr; - } else { - _sizeMax.setValue(std::max(_sizeMax.x(), tmpPos.x()), - std::max(_sizeMax.y(), tmpPos.y())); - // add element in the system - m_subElementList.push_back(elementParser); - } + continue; } + if (elementParser->parseXML(child, m_transformMatrix, tmpPos) == false) { + SVG_ERROR("(l "<getPos()<<") error on node: \""<getValue()<<"\" Sub Parsing ERROR"); + elementParser.reset(); + continue; + } + _sizeMax.setValue(std::max(_sizeMax.x(), tmpPos.x()), + std::max(_sizeMax.y(), tmpPos.y())); + // add element in the system + m_subElementList.push_back(elementParser); } return true; } diff --git a/esvg/Group.h b/esvg/Group.h index 5c122c3..74f5ff5 100644 --- a/esvg/Group.h +++ b/esvg/Group.h @@ -15,7 +15,7 @@ namespace esvg { class Group : public esvg::Base { private: - std::vector m_subElementList; //!< group sub elements ... + std::vector> m_subElementList; //!< sub elements ... public: Group(PaintState _parentPaintState); ~Group(); diff --git a/esvg/esvg.cpp b/esvg/esvg.cpp index db5e859..e381968 100644 --- a/esvg/esvg.cpp +++ b/esvg/esvg.cpp @@ -217,33 +217,34 @@ bool esvg::Document::parseXMLData(const std::shared_ptr& _root) { // comment trsh here... continue; } - esvg::Base *elementParser = nullptr; + std::shared_ptr elementParser; if (child->getValue() == "g") { - elementParser = new esvg::Group(m_paint); + elementParser = std::make_shared(m_paint); } else if (child->getValue() == "a") { SVG_INFO("Note : 'a' balise is parsed like a g balise ..."); - elementParser = new esvg::Group(m_paint); + elementParser = std::make_shared(m_paint); } else if (child->getValue() == "title") { m_title = "TODO : set the title here ..."; continue; } else if (child->getValue() == "path") { - elementParser = new esvg::Path(m_paint); + elementParser = std::make_shared(m_paint); } else if (child->getValue() == "rect") { - elementParser = new esvg::Rectangle(m_paint); + elementParser = std::make_shared(m_paint); } else if (child->getValue() == "circle") { - elementParser = new esvg::Circle(m_paint); + elementParser = std::make_shared(m_paint); } else if (child->getValue() == "ellipse") { - elementParser = new esvg::Ellipse(m_paint); + elementParser = std::make_shared(m_paint); } else if (child->getValue() == "line") { - elementParser = new esvg::Line(m_paint); + elementParser = std::make_shared(m_paint); } else if (child->getValue() == "polyline") { - elementParser = new esvg::Polyline(m_paint); + elementParser = std::make_shared(m_paint); } else if (child->getValue() == "polygon") { - elementParser = new esvg::Polygon(m_paint); + elementParser = std::make_shared(m_paint); } else if (child->getValue() == "text") { - elementParser = new esvg::Text(m_paint); + elementParser = std::make_shared(m_paint); } else if (child->getValue() == "defs") { - SVG_TODO("Need to parse Reference ==> big modification ..."); + SVG_ERROR("'defs' node must not be defined in a group"); + continue; } else if (child->getValue() == "sodipodi:namedview") { // Node ignore : generaly inkscape data continue; @@ -259,8 +260,7 @@ bool esvg::Document::parseXMLData(const std::shared_ptr& _root) { } if (elementParser->parseXML(child, m_transformMatrix, size) == false) { SVG_ERROR("(l "<getPos()<<") error on node: \""<getValue()<<"\" Sub Parsing ERROR"); - delete(elementParser); - elementParser = nullptr; + elementParser.reset(); continue; } if (maxSize.x() m_subElementList; // TODO: LEAK ... + std::vector> m_subElementList; //!< sub-element list + std::vector> m_refList; //!< reference elements ... vec2 m_size; public: Document();