[DEV] remove memory leak
This commit is contained in:
parent
c5ae88df8e
commit
aa6e69c7e7
@ -33,14 +33,6 @@ namespace esvg {
|
|||||||
paint_gradientLinear, //!< Painting a linear gradient.
|
paint_gradientLinear, //!< Painting a linear gradient.
|
||||||
paint_gradientRadial //!< Painting a radial 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 {
|
class PaintState {
|
||||||
public:
|
public:
|
||||||
|
@ -57,44 +57,43 @@ bool esvg::Group::parseXML(const std::shared_ptr<exml::Element>& _element, mat2&
|
|||||||
// can be a comment ...
|
// can be a comment ...
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
esvg::Base *elementParser = nullptr;
|
std::shared_ptr<esvg::Base> elementParser;
|
||||||
if (child->getValue() == "g") {
|
if (child->getValue() == "g") {
|
||||||
elementParser = new esvg::Group(m_paint);
|
elementParser = std::make_shared<esvg::Group>(m_paint);
|
||||||
} else if (child->getValue() == "a") {
|
} else if (child->getValue() == "a") {
|
||||||
// TODO ...
|
// TODO ...
|
||||||
} else if (child->getValue() == "path") {
|
} else if (child->getValue() == "path") {
|
||||||
elementParser = new esvg::Path(m_paint);
|
elementParser = std::make_shared<esvg::Path>(m_paint);
|
||||||
} else if (child->getValue() == "rect") {
|
} else if (child->getValue() == "rect") {
|
||||||
elementParser = new esvg::Rectangle(m_paint);
|
elementParser = std::make_shared<esvg::Rectangle>(m_paint);
|
||||||
} else if (child->getValue() == "circle") {
|
} else if (child->getValue() == "circle") {
|
||||||
elementParser = new esvg::Circle(m_paint);
|
elementParser = std::make_shared<esvg::Circle>(m_paint);
|
||||||
} else if (child->getValue() == "ellipse") {
|
} else if (child->getValue() == "ellipse") {
|
||||||
elementParser = new esvg::Ellipse(m_paint);
|
elementParser = std::make_shared<esvg::Ellipse>(m_paint);
|
||||||
} else if (child->getValue() == "line") {
|
} else if (child->getValue() == "line") {
|
||||||
elementParser = new esvg::Line(m_paint);
|
elementParser = std::make_shared<esvg::Line>(m_paint);
|
||||||
} else if (child->getValue() == "polyline") {
|
} else if (child->getValue() == "polyline") {
|
||||||
elementParser = new esvg::Polyline(m_paint);
|
elementParser = std::make_shared<esvg::Polyline>(m_paint);
|
||||||
} else if (child->getValue() == "polygon") {
|
} else if (child->getValue() == "polygon") {
|
||||||
elementParser = new esvg::Polygon(m_paint);
|
elementParser = std::make_shared<esvg::Polygon>(m_paint);
|
||||||
} else if (child->getValue() == "text") {
|
} else if (child->getValue() == "text") {
|
||||||
elementParser = new esvg::Text(m_paint);
|
elementParser = std::make_shared<esvg::Text>(m_paint);
|
||||||
} else {
|
} else {
|
||||||
SVG_ERROR("(l "<<child->getPos()<<") node not suported : \""<<child->getValue()<<"\" must be [g,a,path,rect,circle,ellipse,line,polyline,polygon,text]");
|
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) {
|
if (elementParser == nullptr) {
|
||||||
SVG_ERROR("(l "<<child->getPos()<<") error on node: \""<<child->getValue()<<"\" allocation error or not supported ...");
|
SVG_ERROR("(l "<<child->getPos()<<") error on node: \""<<child->getValue()<<"\" allocation error or not supported ...");
|
||||||
} else {
|
continue;
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
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;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
namespace esvg {
|
namespace esvg {
|
||||||
class Group : public esvg::Base {
|
class Group : public esvg::Base {
|
||||||
private:
|
private:
|
||||||
std::vector<esvg::Base *> m_subElementList; //!< group sub elements ...
|
std::vector<std::shared_ptr<esvg::Base>> m_subElementList; //!< sub elements ...
|
||||||
public:
|
public:
|
||||||
Group(PaintState _parentPaintState);
|
Group(PaintState _parentPaintState);
|
||||||
~Group();
|
~Group();
|
||||||
|
@ -217,33 +217,34 @@ bool esvg::Document::parseXMLData(const std::shared_ptr<exml::Element>& _root) {
|
|||||||
// comment trsh here...
|
// comment trsh here...
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
esvg::Base *elementParser = nullptr;
|
std::shared_ptr<esvg::Base> elementParser;
|
||||||
if (child->getValue() == "g") {
|
if (child->getValue() == "g") {
|
||||||
elementParser = new esvg::Group(m_paint);
|
elementParser = std::make_shared<esvg::Group>(m_paint);
|
||||||
} else if (child->getValue() == "a") {
|
} else if (child->getValue() == "a") {
|
||||||
SVG_INFO("Note : 'a' balise is parsed like a g balise ...");
|
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") {
|
} else if (child->getValue() == "title") {
|
||||||
m_title = "TODO : set the title here ...";
|
m_title = "TODO : set the title here ...";
|
||||||
continue;
|
continue;
|
||||||
} else if (child->getValue() == "path") {
|
} else if (child->getValue() == "path") {
|
||||||
elementParser = new esvg::Path(m_paint);
|
elementParser = std::make_shared<esvg::Path>(m_paint);
|
||||||
} else if (child->getValue() == "rect") {
|
} else if (child->getValue() == "rect") {
|
||||||
elementParser = new esvg::Rectangle(m_paint);
|
elementParser = std::make_shared<esvg::Rectangle>(m_paint);
|
||||||
} else if (child->getValue() == "circle") {
|
} else if (child->getValue() == "circle") {
|
||||||
elementParser = new esvg::Circle(m_paint);
|
elementParser = std::make_shared<esvg::Circle>(m_paint);
|
||||||
} else if (child->getValue() == "ellipse") {
|
} else if (child->getValue() == "ellipse") {
|
||||||
elementParser = new esvg::Ellipse(m_paint);
|
elementParser = std::make_shared<esvg::Ellipse>(m_paint);
|
||||||
} else if (child->getValue() == "line") {
|
} else if (child->getValue() == "line") {
|
||||||
elementParser = new esvg::Line(m_paint);
|
elementParser = std::make_shared<esvg::Line>(m_paint);
|
||||||
} else if (child->getValue() == "polyline") {
|
} else if (child->getValue() == "polyline") {
|
||||||
elementParser = new esvg::Polyline(m_paint);
|
elementParser = std::make_shared<esvg::Polyline>(m_paint);
|
||||||
} else if (child->getValue() == "polygon") {
|
} else if (child->getValue() == "polygon") {
|
||||||
elementParser = new esvg::Polygon(m_paint);
|
elementParser = std::make_shared<esvg::Polygon>(m_paint);
|
||||||
} else if (child->getValue() == "text") {
|
} else if (child->getValue() == "text") {
|
||||||
elementParser = new esvg::Text(m_paint);
|
elementParser = std::make_shared<esvg::Text>(m_paint);
|
||||||
} else if (child->getValue() == "defs") {
|
} 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") {
|
} else if (child->getValue() == "sodipodi:namedview") {
|
||||||
// Node ignore : generaly inkscape data
|
// Node ignore : generaly inkscape data
|
||||||
continue;
|
continue;
|
||||||
@ -259,8 +260,7 @@ bool esvg::Document::parseXMLData(const std::shared_ptr<exml::Element>& _root) {
|
|||||||
}
|
}
|
||||||
if (elementParser->parseXML(child, m_transformMatrix, size) == false) {
|
if (elementParser->parseXML(child, m_transformMatrix, size) == false) {
|
||||||
SVG_ERROR("(l "<<child->getPos()<<") error on node: \""<<child->getValue()<<"\" Sub Parsing ERROR");
|
SVG_ERROR("(l "<<child->getPos()<<") error on node: \""<<child->getValue()<<"\" Sub Parsing ERROR");
|
||||||
delete(elementParser);
|
elementParser.reset();
|
||||||
elementParser = nullptr;
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (maxSize.x()<size.x()) {
|
if (maxSize.x()<size.x()) {
|
||||||
|
@ -23,7 +23,8 @@ namespace esvg {
|
|||||||
bool m_loadOK;
|
bool m_loadOK;
|
||||||
std::string m_version;
|
std::string m_version;
|
||||||
std::string m_title;
|
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;
|
vec2 m_size;
|
||||||
public:
|
public:
|
||||||
Document();
|
Document();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user