[DEV] remove memory leak

This commit is contained in:
Edouard DUPIN 2015-12-04 22:03:16 +01:00
parent c5ae88df8e
commit aa6e69c7e7
5 changed files with 37 additions and 45 deletions

View File

@ -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:

View File

@ -57,44 +57,43 @@ bool esvg::Group::parseXML(const std::shared_ptr<exml::Element>& _element, mat2&
// can be a comment ...
continue;
}
esvg::Base *elementParser = nullptr;
std::shared_ptr<esvg::Base> elementParser;
if (child->getValue() == "g") {
elementParser = new esvg::Group(m_paint);
elementParser = std::make_shared<esvg::Group>(m_paint);
} else if (child->getValue() == "a") {
// TODO ...
} else if (child->getValue() == "path") {
elementParser = new esvg::Path(m_paint);
elementParser = std::make_shared<esvg::Path>(m_paint);
} else if (child->getValue() == "rect") {
elementParser = new esvg::Rectangle(m_paint);
elementParser = std::make_shared<esvg::Rectangle>(m_paint);
} else if (child->getValue() == "circle") {
elementParser = new esvg::Circle(m_paint);
elementParser = std::make_shared<esvg::Circle>(m_paint);
} else if (child->getValue() == "ellipse") {
elementParser = new esvg::Ellipse(m_paint);
elementParser = std::make_shared<esvg::Ellipse>(m_paint);
} else if (child->getValue() == "line") {
elementParser = new esvg::Line(m_paint);
elementParser = std::make_shared<esvg::Line>(m_paint);
} else if (child->getValue() == "polyline") {
elementParser = new esvg::Polyline(m_paint);
elementParser = std::make_shared<esvg::Polyline>(m_paint);
} else if (child->getValue() == "polygon") {
elementParser = new esvg::Polygon(m_paint);
elementParser = std::make_shared<esvg::Polygon>(m_paint);
} else if (child->getValue() == "text") {
elementParser = new esvg::Text(m_paint);
elementParser = std::make_shared<esvg::Text>(m_paint);
} else {
SVG_ERROR("(l "<<child->getPos()<<") node not suported : \""<<child->getValue()<<"\" must be [g,a,path,rect,circle,ellipse,line,polyline,polygon,text]");
}
if (elementParser == nullptr) {
SVG_ERROR("(l "<<child->getPos()<<") error on node: \""<<child->getValue()<<"\" allocation error or not supported ...");
} else {
if (false == elementParser->parseXML(child, m_transformMatrix, tmpPos)) {
SVG_ERROR("(l "<<child->getPos()<<") error on node: \""<<child->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 "<<child->getPos()<<") error on node: \""<<child->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;
}

View File

@ -15,7 +15,7 @@
namespace esvg {
class Group : public esvg::Base {
private:
std::vector<esvg::Base *> m_subElementList; //!< group sub elements ...
std::vector<std::shared_ptr<esvg::Base>> m_subElementList; //!< sub elements ...
public:
Group(PaintState _parentPaintState);
~Group();

View File

@ -217,33 +217,34 @@ bool esvg::Document::parseXMLData(const std::shared_ptr<exml::Element>& _root) {
// comment trsh here...
continue;
}
esvg::Base *elementParser = nullptr;
std::shared_ptr<esvg::Base> elementParser;
if (child->getValue() == "g") {
elementParser = new esvg::Group(m_paint);
elementParser = std::make_shared<esvg::Group>(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<esvg::Group>(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<esvg::Path>(m_paint);
} else if (child->getValue() == "rect") {
elementParser = new esvg::Rectangle(m_paint);
elementParser = std::make_shared<esvg::Rectangle>(m_paint);
} else if (child->getValue() == "circle") {
elementParser = new esvg::Circle(m_paint);
elementParser = std::make_shared<esvg::Circle>(m_paint);
} else if (child->getValue() == "ellipse") {
elementParser = new esvg::Ellipse(m_paint);
elementParser = std::make_shared<esvg::Ellipse>(m_paint);
} else if (child->getValue() == "line") {
elementParser = new esvg::Line(m_paint);
elementParser = std::make_shared<esvg::Line>(m_paint);
} else if (child->getValue() == "polyline") {
elementParser = new esvg::Polyline(m_paint);
elementParser = std::make_shared<esvg::Polyline>(m_paint);
} else if (child->getValue() == "polygon") {
elementParser = new esvg::Polygon(m_paint);
elementParser = std::make_shared<esvg::Polygon>(m_paint);
} else if (child->getValue() == "text") {
elementParser = new esvg::Text(m_paint);
elementParser = std::make_shared<esvg::Text>(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<exml::Element>& _root) {
}
if (elementParser->parseXML(child, m_transformMatrix, size) == false) {
SVG_ERROR("(l "<<child->getPos()<<") error on node: \""<<child->getValue()<<"\" Sub Parsing ERROR");
delete(elementParser);
elementParser = nullptr;
elementParser.reset();
continue;
}
if (maxSize.x()<size.x()) {

View File

@ -23,7 +23,8 @@ namespace esvg {
bool m_loadOK;
std::string m_version;
std::string m_title;
std::vector<esvg::Base*> m_subElementList; // TODO: LEAK ...
std::vector<std::shared_ptr<esvg::Base>> m_subElementList; //!< sub-element list
std::vector<std::shared_ptr<esvg::Base>> m_refList; //!< reference elements ...
vec2 m_size;
public:
Document();