diff --git a/esvg/Base.cpp b/esvg/Base.cpp index 7b8073b..55aaaa1 100644 --- a/esvg/Base.cpp +++ b/esvg/Base.cpp @@ -432,7 +432,7 @@ etk::Color esvg::Base::parseColor(const std::string& _inputData) { * @param[in] _element standart XML node * @return true if no problem arrived */ -bool esvg::Base::parse(const std::shared_ptr& _element, mat2& _parentTrans, vec2& _sizeMax) { +bool esvg::Base::parseXML(const std::shared_ptr& _element, mat2& _parentTrans, vec2& _sizeMax) { SVG_ERROR("NOT IMPLEMENTED"); _sizeMax.setValue(0,0); return false; diff --git a/esvg/Base.h b/esvg/Base.h index 76dbc3e..af91f51 100644 --- a/esvg/Base.h +++ b/esvg/Base.h @@ -67,7 +67,7 @@ namespace esvg { Base() {}; Base(PaintState _parentPaintState); virtual ~Base() { }; - virtual bool parse(const std::shared_ptr& _element, mat2& _parentTrans, vec2& _sizeMax); + virtual bool parseXML(const std::shared_ptr& _element, mat2& _parentTrans, vec2& _sizeMax); virtual void draw(esvg::Renderer& _myRenderer, mat2& _basicTrans, int32_t _level=1); diff --git a/esvg/Circle.cpp b/esvg/Circle.cpp index d4a0c0b..40a81a7 100644 --- a/esvg/Circle.cpp +++ b/esvg/Circle.cpp @@ -22,7 +22,7 @@ esvg::Circle::~Circle() { } -bool esvg::Circle::parse(const std::shared_ptr& _element, mat2& _parentTrans, vec2& _sizeMax) { +bool esvg::Circle::parseXML(const std::shared_ptr& _element, mat2& _parentTrans, vec2& _sizeMax) { m_radius = 0.0; m_position.setValue(0,0); if (_element == nullptr) { diff --git a/esvg/Circle.h b/esvg/Circle.h index 182e4d1..48f7963 100644 --- a/esvg/Circle.h +++ b/esvg/Circle.h @@ -19,7 +19,7 @@ namespace esvg { public: Circle(PaintState _parentPaintState); ~Circle(); - virtual bool parse(const std::shared_ptr& _element, mat2& _parentTrans, vec2& _sizeMax); + virtual bool parseXML(const std::shared_ptr& _element, mat2& _parentTrans, vec2& _sizeMax); virtual void display(int32_t _spacing); virtual void draw(esvg::Renderer& _myRenderer, mat2& _basicTrans, int32_t _level); }; diff --git a/esvg/Ellipse.cpp b/esvg/Ellipse.cpp index a9e55a6..c59d693 100644 --- a/esvg/Ellipse.cpp +++ b/esvg/Ellipse.cpp @@ -22,7 +22,7 @@ esvg::Ellipse::~Ellipse() { } -bool esvg::Ellipse::parse(const std::shared_ptr& _element, mat2& _parentTrans, vec2& _sizeMax) { +bool esvg::Ellipse::parseXML(const std::shared_ptr& _element, mat2& _parentTrans, vec2& _sizeMax) { if (_element == nullptr) { return false; } diff --git a/esvg/Ellipse.h b/esvg/Ellipse.h index 1d64632..ba12237 100644 --- a/esvg/Ellipse.h +++ b/esvg/Ellipse.h @@ -19,7 +19,7 @@ namespace esvg { public: Ellipse(PaintState _parentPaintState); ~Ellipse(); - virtual bool parse(const std::shared_ptr& _element, mat2& _parentTrans, vec2& _sizeMax); + virtual bool parseXML(const std::shared_ptr& _element, mat2& _parentTrans, vec2& _sizeMax); virtual void display(int32_t _spacing); virtual void draw(esvg::Renderer& _myRenderer, mat2& _basicTrans, int32_t _level); }; diff --git a/esvg/Group.cpp b/esvg/Group.cpp index a855909..c0d48a6 100644 --- a/esvg/Group.cpp +++ b/esvg/Group.cpp @@ -31,7 +31,7 @@ esvg::Group::~Group() { } -bool esvg::Group::parse(const std::shared_ptr& _element, mat2& _parentTrans, vec2& _sizeMax) { +bool esvg::Group::parseXML(const std::shared_ptr& _element, mat2& _parentTrans, vec2& _sizeMax) { if (_element == nullptr) { return false; } @@ -84,7 +84,7 @@ bool esvg::Group::parse(const std::shared_ptr& _element, mat2& _p if (elementParser == nullptr) { SVG_ERROR("(l "<getPos()<<") error on node: \""<getValue()<<"\" allocation error or not supported ..."); } else { - if (false == elementParser->parse(child, m_transformMatrix, tmpPos)) { + if (false == elementParser->parseXML(child, m_transformMatrix, tmpPos)) { SVG_ERROR("(l "<getPos()<<") error on node: \""<getValue()<<"\" Sub Parsing ERROR"); delete(elementParser); elementParser = nullptr; diff --git a/esvg/Group.h b/esvg/Group.h index 0322771..5c122c3 100644 --- a/esvg/Group.h +++ b/esvg/Group.h @@ -19,7 +19,7 @@ namespace esvg { public: Group(PaintState _parentPaintState); ~Group(); - virtual bool parse(const std::shared_ptr& _element, mat2& _parentTrans, vec2& _sizeMax); + virtual bool parseXML(const std::shared_ptr& _element, mat2& _parentTrans, vec2& _sizeMax); virtual void display(int32_t spacing); virtual void draw(esvg::Renderer& _myRenderer, mat2& _basicTrans, int32_t _level); }; diff --git a/esvg/Line.cpp b/esvg/Line.cpp index f21e8a2..241334f 100644 --- a/esvg/Line.cpp +++ b/esvg/Line.cpp @@ -23,7 +23,7 @@ esvg::Line::~Line() { } -bool esvg::Line::parse(const std::shared_ptr& _element, mat2& _parentTrans, vec2& _sizeMax) { +bool esvg::Line::parseXML(const std::shared_ptr& _element, mat2& _parentTrans, vec2& _sizeMax) { // line must have a minimum size... m_paint.strokeWidth = 1; if (_element == nullptr) { diff --git a/esvg/Line.h b/esvg/Line.h index d1860be..89b5e65 100644 --- a/esvg/Line.h +++ b/esvg/Line.h @@ -19,7 +19,7 @@ namespace esvg { public: Line(PaintState _parentPaintState); ~Line(); - virtual bool parse(const std::shared_ptr& _element, mat2& _parentTrans, vec2& _sizeMax); + virtual bool parseXML(const std::shared_ptr& _element, mat2& _parentTrans, vec2& _sizeMax); virtual void display(int32_t _spacing); virtual void draw(esvg::Renderer& _myRenderer, mat2& _basicTrans, int32_t _level); }; diff --git a/esvg/Path.cpp b/esvg/Path.cpp index 1a3d288..954ff29 100644 --- a/esvg/Path.cpp +++ b/esvg/Path.cpp @@ -62,7 +62,7 @@ const char * extractCmd(const char* _input, char& _cmd, std::vector& _out return outputPointer; } -bool esvg::Path::parse(const std::shared_ptr& _element, mat2& _parentTrans, vec2& _sizeMax) { +bool esvg::Path::parseXML(const std::shared_ptr& _element, mat2& _parentTrans, vec2& _sizeMax) { if (_element == nullptr) { return false; } diff --git a/esvg/Path.h b/esvg/Path.h index 48e9ef8..ae446f6 100644 --- a/esvg/Path.h +++ b/esvg/Path.h @@ -19,7 +19,7 @@ namespace esvg { public: Path(PaintState _parentPaintState); ~Path(); - virtual bool parse(const std::shared_ptr& _element, mat2& _parentTrans, vec2& _sizeMax); + virtual bool parseXML(const std::shared_ptr& _element, mat2& _parentTrans, vec2& _sizeMax); virtual void display(int32_t _spacing); virtual void draw(esvg::Renderer& _myRenderer, mat2& _basicTrans, int32_t _level); }; diff --git a/esvg/Polygon.cpp b/esvg/Polygon.cpp index 59e722e..b78d13a 100644 --- a/esvg/Polygon.cpp +++ b/esvg/Polygon.cpp @@ -22,7 +22,7 @@ esvg::Polygon::~Polygon() { } -bool esvg::Polygon::parse(const std::shared_ptr& _element, mat2& _parentTrans, vec2& _sizeMax) { +bool esvg::Polygon::parseXML(const std::shared_ptr& _element, mat2& _parentTrans, vec2& _sizeMax) { if (_element == nullptr) { return false; } diff --git a/esvg/Polygon.h b/esvg/Polygon.h index 688d6c7..cc5b7be 100644 --- a/esvg/Polygon.h +++ b/esvg/Polygon.h @@ -26,7 +26,7 @@ namespace esvg { public: Polygon(PaintState parentPaintState); ~Polygon(); - virtual bool parse(const std::shared_ptr& _element, mat2& _parentTrans, vec2& _sizeMax); + virtual bool parseXML(const std::shared_ptr& _element, mat2& _parentTrans, vec2& _sizeMax); virtual void display(int32_t _spacing); virtual void draw(esvg::Renderer& _myRenderer, mat2& _basicTrans, int32_t _level); }; diff --git a/esvg/Polyline.cpp b/esvg/Polyline.cpp index 8bdcd14..680894b 100644 --- a/esvg/Polyline.cpp +++ b/esvg/Polyline.cpp @@ -22,7 +22,7 @@ esvg::Polyline::~Polyline() { } -bool esvg::Polyline::parse(const std::shared_ptr& _element, mat2& _parentTrans, vec2& _sizeMax) { +bool esvg::Polyline::parseXML(const std::shared_ptr& _element, mat2& _parentTrans, vec2& _sizeMax) { // line must have a minimum size... m_paint.strokeWidth = 1; if (_element == nullptr) { diff --git a/esvg/Polyline.h b/esvg/Polyline.h index 82332c5..12bd0b0 100644 --- a/esvg/Polyline.h +++ b/esvg/Polyline.h @@ -19,7 +19,7 @@ namespace esvg { public: Polyline(PaintState _parentPaintState); ~Polyline(); - virtual bool parse(const std::shared_ptr& _element, mat2& _parentTrans, vec2& _sizeMax); + virtual bool parseXML(const std::shared_ptr& _element, mat2& _parentTrans, vec2& _sizeMax); virtual void display(int32_t _spacing); virtual void draw(esvg::Renderer& _myRenderer, mat2& _basicTrans, int32_t _level); }; diff --git a/esvg/Rectangle.cpp b/esvg/Rectangle.cpp index d24d00c..e35418c 100644 --- a/esvg/Rectangle.cpp +++ b/esvg/Rectangle.cpp @@ -25,7 +25,7 @@ esvg::Rectangle::~Rectangle() { } -bool esvg::Rectangle::parse(const std::shared_ptr& _element, mat2& _parentTrans, vec2& _sizeMax) { +bool esvg::Rectangle::parseXML(const std::shared_ptr& _element, mat2& _parentTrans, vec2& _sizeMax) { if (_element == nullptr) { return false; } diff --git a/esvg/Rectangle.h b/esvg/Rectangle.h index 6e11597..943906d 100644 --- a/esvg/Rectangle.h +++ b/esvg/Rectangle.h @@ -20,7 +20,7 @@ namespace esvg { public: Rectangle(PaintState _parentPaintState); ~Rectangle(); - virtual bool parse(const std::shared_ptr& _element, mat2& _parentTrans, vec2& _sizeMax); + virtual bool parseXML(const std::shared_ptr& _element, mat2& _parentTrans, vec2& _sizeMax); virtual void display(int32_t _spacing); virtual void draw(esvg::Renderer& _myRenderer, mat2& _basicTrans, int32_t _level); }; diff --git a/esvg/Renderer.cpp b/esvg/Renderer.cpp index 8ae5295..0177801 100644 --- a/esvg/Renderer.cpp +++ b/esvg/Renderer.cpp @@ -389,15 +389,12 @@ const ivec2& esvg::Renderer::getSize() const { return m_size; } - -uint8_t* esvg::Renderer::getDataPointer() { - return nullptr; //&m_buffer[0]; -}; +std::vector> esvg::Renderer::getData() { + return m_buffer; +} + -uint32_t esvg::Renderer::getDataSize() const { - return m_buffer.size(); -}; void esvg::Renderer::setInterpolationRecurtionMax(int32_t _value) { m_interpolationRecurtionMax = std::avg(1, _value, 200); diff --git a/esvg/Renderer.h b/esvg/Renderer.h index 30a1984..09cb6e2 100644 --- a/esvg/Renderer.h +++ b/esvg/Renderer.h @@ -32,8 +32,7 @@ namespace esvg { protected: std::vector> m_buffer; public: - uint8_t* getDataPointer(); - uint32_t getDataSize() const; + std::vector> getData(); protected: int32_t m_interpolationRecurtionMax; public: diff --git a/esvg/esvg.cpp b/esvg/esvg.cpp index 9575b4c..cf2c7e5 100644 --- a/esvg/esvg.cpp +++ b/esvg/esvg.cpp @@ -23,8 +23,7 @@ #define __class__ "Document" -esvg::Document::Document() : - m_renderedElement(nullptr) { +esvg::Document::Document() { m_fileName = ""; m_version = "0.0"; m_loadOK = false; @@ -32,8 +31,7 @@ esvg::Document::Document() : } esvg::Document::~Document() { - delete(m_renderedElement); - m_renderedElement = nullptr; + } @@ -48,8 +46,7 @@ void esvg::Document::displayDebug() { } -void esvg::Document::draw(esvg::Renderer& _myRenderer, mat2& _basicTrans) -{ +void esvg::Document::draw(esvg::Renderer& _myRenderer, mat2& _basicTrans, int32_t _level) { for (int32_t iii=0; iiidraw(_myRenderer, _basicTrans); @@ -57,105 +54,83 @@ void esvg::Document::draw(esvg::Renderer& _myRenderer, mat2& _basicTrans) } } - -void esvg::Document::generateTestFile() -{ - int32_t sizeX = m_size.x(); - if (sizeX == 0) { - sizeX = 64; - } - int32_t sizeY = m_size.y(); - if (sizeY == 0) { - sizeY = 64; - } - delete(m_renderedElement); - m_renderedElement = nullptr; - m_renderedElement = new esvg::Renderer(ivec2(sizeX, sizeY)); - // create the first element matrix modification ... - mat2 basicTrans; - //basicTrans *= etk::mat2Translate(vec2(-g_base_dx, -g_base_dy)); - //basicTrans *= etk::mat2Scale(vec2(2, 2)); - //basicTrans *= etk::mat2Rotate(vec2(g_angle)); - //basicTrans *= etk::mat2Skew(vec2(2.0, 5.0)); - //basicTrans *= etk::mat2Translate(vec2(width*0.3, height/2)); - //basicTrans *= etk::mat2Translate(vec2(width/3, height/3)); - - - draw(*m_renderedElement, basicTrans); - std::string tmpFileOut = "yyy_out_"; - tmpFileOut += m_fileName; - tmpFileOut += ".ppm"; - m_renderedElement->writePPM(tmpFileOut); - -} - - // FOR TEST only ... void esvg::Document::generateAnImage(const ivec2& _size, const std::string& _fileName, bool _visualDebug) { - int32_t sizeX = _size.x(); - if (sizeX == 0) { - SVG_ERROR("SizeX == 0 ==> set 64"); - sizeX = 64; + ivec2 sizeRender = _size; + if (sizeRender.x() <= 0) { + sizeRender.setX(m_size.x()); } - int32_t sizeY = _size.y(); - if (sizeY == 0) { - SVG_ERROR("SizeY == 0 ==> set 64"); - sizeY = 64; + if (sizeRender.y() <= 0) { + sizeRender.setY(m_size.y()); } - SVG_DEBUG("Generate size (" << sizeX << "," << sizeY << ")"); - delete(m_renderedElement); - m_renderedElement = nullptr; + SVG_DEBUG("Generate size " << sizeRender); - m_renderedElement = new esvg::Renderer(ivec2(sizeX, sizeY), _visualDebug); + std::shared_ptr renderedElement = std::make_shared(sizeRender, _visualDebug); // create the first element matrix modification ... mat2 basicTrans; - //basicTrans *= etk::mat2Translate(vec2(-g_base_dx, -g_base_dy)); - basicTrans *= etk::mat2Scale(vec2(sizeX/m_size.x(), sizeY/m_size.y())); - //basicTrans *= etk::mat2Rotate(g_angle);// + agg::pi); - //basicTrans *= etk::mat2Skew(vec2(2.0, 5.0)); - //basicTrans *= etk::mat2Translate(vec2(width*0.3, height/2)); - //basicTrans *= etk::mat2Translate(vec2(width/3, height/3)); + basicTrans *= etk::mat2Scale(vec2(sizeRender.x()/m_size.x(), sizeRender.y()/m_size.y())); + + draw(*renderedElement, basicTrans); - draw(*m_renderedElement, basicTrans); if (etk::end_with(_fileName, ".ppm") == true) { - m_renderedElement->writePPM(_fileName); + renderedElement->writePPM(_fileName); } else if (etk::end_with(_fileName, ".bmp") == true) { - m_renderedElement->writeBMP(_fileName); + renderedElement->writeBMP(_fileName); } else { SVG_ERROR("Can not store with this extention : " << _fileName << " not in .bmp/.ppm"); } } -/* -void esvg::Document::generateAnImage(draw::Image& _output) { - generateAnImage(ivec2(m_size.x(),m_size.y()), _output); + + +std::vector> esvg::Document::renderImageFloatRGBA(ivec2& _size) { + if (_size.x() <= 0) { + _size.setX(m_size.x()); + } + if (_size.y() <= 0) { + _size.setY(m_size.y()); + } + SVG_DEBUG("Generate size " << _size); + std::shared_ptr renderedElement = std::make_shared(_size); + // create the first element matrix modification ... + mat2 basicTrans; + basicTrans *= etk::mat2Scale(vec2(_size.x()/m_size.x(), _size.y()/m_size.y())); + draw(*renderedElement, basicTrans); + + // direct return the generated data ... + return renderedElement->getData(); } -void esvg::Document::generateAnImage(ivec2 _size, draw::Image& _output) { - generateAnImage(_size.x(), _size.y()); - _output.resize(_size); - draw::Color tmpp(0,0,0,0); - _output.setFillColor(tmpp); - _output.clear(); - if(NULL != m_renderedElement) { - uint8_t* pointerOnData = m_renderedElement->getDataPointer(); - int32_t sizeData = m_renderedElement->getDataSize(); - uint8_t* tmpOut = (uint8_t*)_output.getTextureDataPointer(); - memcpy(tmpOut, pointerOnData, sizeData); +std::vector> esvg::Document::renderImageFloatRGB(ivec2& _size) { + std::vector> data = renderImageFloatRGBA(_size); + // Reduce scope: + std::vector> out; + out.resize(data.size()); + for (size_t iii=0; iiigetDataPointer(); + return out; } -uint32_t esvg::Document::getSizeOnData() { - if(m_renderedElement == nullptr) { - return 0; +std::vector> esvg::Document::renderImageU8RGBA(ivec2& _size) { + std::vector> data = renderImageFloatRGBA(_size); + // Reduce scope: + std::vector> out; + out.resize(data.size()); + for (size_t iii=0; iiigetDataSize(); + return out; +} + +std::vector> esvg::Document::renderImageU8RGB(ivec2& _size) { + std::vector> data = renderImageFloatRGBA(_size); + // Reduce scope: + std::vector> out; + out.resize(data.size()); + for (size_t iii=0; iii root = doc.getNamed("svg" ); + std::shared_ptr root = doc.getNamed("svg"); if (root == nullptr) { SVG_ERROR("(l ?) main node not find: \"svg\" in \"" << m_fileName << "\""); m_loadOK = false; @@ -283,7 +258,7 @@ bool esvg::Document::parseXMLData(const std::shared_ptr& _root) { SVG_ERROR("(l "<getPos()<<") error on node: \""<getValue()<<"\" allocation error or not supported ..."); continue; } - if (elementParser->parse(child, m_transformMatrix, size) == false) { + if (elementParser->parseXML(child, m_transformMatrix, size) == false) { SVG_ERROR("(l "<getPos()<<") error on node: \""<getValue()<<"\" Sub Parsing ERROR"); delete(elementParser); elementParser = nullptr; diff --git a/esvg/esvg.h b/esvg/esvg.h index 5278bb2..f441936 100644 --- a/esvg/esvg.h +++ b/esvg/esvg.h @@ -26,10 +26,8 @@ namespace esvg { std::string m_title; std::vector m_subElementList; vec2 m_size; - esvg::Renderer* m_renderedElement; public: Document(); - Document(const std::string& _fileName); ~Document(); void clear(); /** @@ -67,13 +65,16 @@ namespace esvg { return m_loadOK; }; void displayDebug(); - void generateTestFile(); void generateAnImage(const ivec2& _size, const std::string& _fileName, bool _visualDebug=false); //void generateAnImage(ivec2 _size, draw::Image& _output); //void generateAnImage(draw::Image& _output); - virtual void draw(esvg::Renderer& _myRenderer, mat2& _basicTrans); - uint8_t* getPointerOnData(); - uint32_t getSizeOnData(); + std::vector> renderImageFloatRGBA(ivec2& _size); + std::vector> renderImageFloatRGB(ivec2& _size); + std::vector> renderImageU8RGBA(ivec2& _size); + std::vector> renderImageU8RGB(ivec2& _size); + protected: + virtual void draw(esvg::Renderer& _myRenderer, mat2& _basicTrans, int32_t _level=0); + public: vec2 getDefinedSize() { return m_size; };