[DEV] Render gradient really slowly
This commit is contained in:
parent
5f6c4bab85
commit
85a35ae71b
@ -102,14 +102,15 @@ void esvg::Circle::draw(esvg::Renderer& _myRenderer, mat2& _basicTrans, int32_t
|
|||||||
esvg::render::SegmentList listSegmentStroke;
|
esvg::render::SegmentList listSegmentStroke;
|
||||||
esvg::render::Weight tmpFill;
|
esvg::render::Weight tmpFill;
|
||||||
esvg::render::Weight tmpStroke;
|
esvg::render::Weight tmpStroke;
|
||||||
std::shared_ptr<esvg::render::DynamicColor> colorFill = esvg::render::createColor(m_paint.fill, mtx, m_paint.viewPort);
|
std::shared_ptr<esvg::render::DynamicColor> colorFill = esvg::render::createColor(m_paint.fill, mtx);
|
||||||
std::shared_ptr<esvg::render::DynamicColor> colorStroke;
|
std::shared_ptr<esvg::render::DynamicColor> colorStroke;
|
||||||
if (m_paint.strokeWidth > 0.0f) {
|
if (m_paint.strokeWidth > 0.0f) {
|
||||||
colorStroke = esvg::render::createColor(m_paint.stroke, mtx, m_paint.viewPort);
|
colorStroke = esvg::render::createColor(m_paint.stroke, mtx);
|
||||||
}
|
}
|
||||||
// Check if we need to display background
|
// Check if we need to display background
|
||||||
if (colorFill != nullptr) {
|
if (colorFill != nullptr) {
|
||||||
listSegmentFill.createSegmentList(listPoints);
|
listSegmentFill.createSegmentList(listPoints);
|
||||||
|
colorFill->setViewPort(listSegmentFill.getViewPort());
|
||||||
listSegmentFill.applyMatrix(mtx);
|
listSegmentFill.applyMatrix(mtx);
|
||||||
// now, traverse the scanlines and find the intersections on each scanline, use non-zero rule
|
// now, traverse the scanlines and find the intersections on each scanline, use non-zero rule
|
||||||
tmpFill.generate(_myRenderer.getSize(),
|
tmpFill.generate(_myRenderer.getSize(),
|
||||||
@ -123,6 +124,7 @@ void esvg::Circle::draw(esvg::Renderer& _myRenderer, mat2& _basicTrans, int32_t
|
|||||||
m_paint.lineCap,
|
m_paint.lineCap,
|
||||||
m_paint.lineJoin,
|
m_paint.lineJoin,
|
||||||
m_paint.miterLimit);
|
m_paint.miterLimit);
|
||||||
|
colorStroke->setViewPort(listSegmentStroke.getViewPort());
|
||||||
listSegmentStroke.applyMatrix(mtx);
|
listSegmentStroke.applyMatrix(mtx);
|
||||||
// now, traverse the scanlines and find the intersections on each scanline, use non-zero rule
|
// now, traverse the scanlines and find the intersections on each scanline, use non-zero rule
|
||||||
tmpStroke.generate(_myRenderer.getSize(),
|
tmpStroke.generate(_myRenderer.getSize(),
|
||||||
|
@ -107,14 +107,15 @@ void esvg::Ellipse::draw(esvg::Renderer& _myRenderer, mat2& _basicTrans, int32_t
|
|||||||
esvg::render::SegmentList listSegmentStroke;
|
esvg::render::SegmentList listSegmentStroke;
|
||||||
esvg::render::Weight tmpFill;
|
esvg::render::Weight tmpFill;
|
||||||
esvg::render::Weight tmpStroke;
|
esvg::render::Weight tmpStroke;
|
||||||
std::shared_ptr<esvg::render::DynamicColor> colorFill = esvg::render::createColor(m_paint.fill, mtx, m_paint.viewPort);
|
std::shared_ptr<esvg::render::DynamicColor> colorFill = esvg::render::createColor(m_paint.fill, mtx);
|
||||||
std::shared_ptr<esvg::render::DynamicColor> colorStroke;
|
std::shared_ptr<esvg::render::DynamicColor> colorStroke;
|
||||||
if (m_paint.strokeWidth > 0.0f) {
|
if (m_paint.strokeWidth > 0.0f) {
|
||||||
colorStroke = esvg::render::createColor(m_paint.stroke, mtx, m_paint.viewPort);
|
colorStroke = esvg::render::createColor(m_paint.stroke, mtx);
|
||||||
}
|
}
|
||||||
// Check if we need to display background
|
// Check if we need to display background
|
||||||
if (colorFill != nullptr) {
|
if (colorFill != nullptr) {
|
||||||
listSegmentFill.createSegmentList(listPoints);
|
listSegmentFill.createSegmentList(listPoints);
|
||||||
|
colorFill->setViewPort(listSegmentFill.getViewPort());
|
||||||
listSegmentFill.applyMatrix(mtx);
|
listSegmentFill.applyMatrix(mtx);
|
||||||
// now, traverse the scanlines and find the intersections on each scanline, use non-zero rule
|
// now, traverse the scanlines and find the intersections on each scanline, use non-zero rule
|
||||||
tmpFill.generate(_myRenderer.getSize(),
|
tmpFill.generate(_myRenderer.getSize(),
|
||||||
@ -128,6 +129,7 @@ void esvg::Ellipse::draw(esvg::Renderer& _myRenderer, mat2& _basicTrans, int32_t
|
|||||||
m_paint.lineCap,
|
m_paint.lineCap,
|
||||||
m_paint.lineJoin,
|
m_paint.lineJoin,
|
||||||
m_paint.miterLimit);
|
m_paint.miterLimit);
|
||||||
|
colorStroke->setViewPort(listSegmentStroke.getViewPort());
|
||||||
listSegmentStroke.applyMatrix(mtx);
|
listSegmentStroke.applyMatrix(mtx);
|
||||||
// now, traverse the scanlines and find the intersections on each scanline, use non-zero rule
|
// now, traverse the scanlines and find the intersections on each scanline, use non-zero rule
|
||||||
tmpStroke.generate(_myRenderer.getSize(),
|
tmpStroke.generate(_myRenderer.getSize(),
|
||||||
|
@ -81,10 +81,10 @@ void esvg::Line::draw(esvg::Renderer& _myRenderer, mat2& _basicTrans, int32_t _l
|
|||||||
esvg::render::SegmentList listSegmentStroke;
|
esvg::render::SegmentList listSegmentStroke;
|
||||||
esvg::render::Weight tmpFill;
|
esvg::render::Weight tmpFill;
|
||||||
esvg::render::Weight tmpStroke;
|
esvg::render::Weight tmpStroke;
|
||||||
std::shared_ptr<esvg::render::DynamicColor> colorFill = esvg::render::createColor(m_paint.fill, mtx, m_paint.viewPort);
|
std::shared_ptr<esvg::render::DynamicColor> colorFill = esvg::render::createColor(m_paint.fill, mtx);
|
||||||
std::shared_ptr<esvg::render::DynamicColor> colorStroke;
|
std::shared_ptr<esvg::render::DynamicColor> colorStroke;
|
||||||
if (m_paint.strokeWidth > 0.0f) {
|
if (m_paint.strokeWidth > 0.0f) {
|
||||||
colorStroke = esvg::render::createColor(m_paint.stroke, mtx, m_paint.viewPort);
|
colorStroke = esvg::render::createColor(m_paint.stroke, mtx);
|
||||||
}
|
}
|
||||||
// Check if we need to display background
|
// Check if we need to display background
|
||||||
// No background ...
|
// No background ...
|
||||||
@ -95,6 +95,7 @@ void esvg::Line::draw(esvg::Renderer& _myRenderer, mat2& _basicTrans, int32_t _l
|
|||||||
m_paint.lineCap,
|
m_paint.lineCap,
|
||||||
m_paint.lineJoin,
|
m_paint.lineJoin,
|
||||||
m_paint.miterLimit);
|
m_paint.miterLimit);
|
||||||
|
colorStroke->setViewPort(listSegmentStroke.getViewPort());
|
||||||
listSegmentStroke.applyMatrix(mtx);
|
listSegmentStroke.applyMatrix(mtx);
|
||||||
// now, traverse the scanlines and find the intersections on each scanline, use non-zero rule
|
// now, traverse the scanlines and find the intersections on each scanline, use non-zero rule
|
||||||
tmpStroke.generate(_myRenderer.getSize(),
|
tmpStroke.generate(_myRenderer.getSize(),
|
||||||
|
@ -271,14 +271,15 @@ void esvg::Path::draw(esvg::Renderer& _myRenderer, mat2& _basicTrans, int32_t _l
|
|||||||
esvg::render::SegmentList listSegmentStroke;
|
esvg::render::SegmentList listSegmentStroke;
|
||||||
esvg::render::Weight tmpFill;
|
esvg::render::Weight tmpFill;
|
||||||
esvg::render::Weight tmpStroke;
|
esvg::render::Weight tmpStroke;
|
||||||
std::shared_ptr<esvg::render::DynamicColor> colorFill = esvg::render::createColor(m_paint.fill, mtx, m_paint.viewPort);
|
std::shared_ptr<esvg::render::DynamicColor> colorFill = esvg::render::createColor(m_paint.fill, mtx);
|
||||||
std::shared_ptr<esvg::render::DynamicColor> colorStroke;
|
std::shared_ptr<esvg::render::DynamicColor> colorStroke;
|
||||||
if (m_paint.strokeWidth > 0.0f) {
|
if (m_paint.strokeWidth > 0.0f) {
|
||||||
colorStroke = esvg::render::createColor(m_paint.stroke, mtx, m_paint.viewPort);
|
colorStroke = esvg::render::createColor(m_paint.stroke, mtx);
|
||||||
}
|
}
|
||||||
// Check if we need to display background
|
// Check if we need to display background
|
||||||
if (colorFill != nullptr) {
|
if (colorFill != nullptr) {
|
||||||
listSegmentFill.createSegmentList(listPoints);
|
listSegmentFill.createSegmentList(listPoints);
|
||||||
|
colorFill->setViewPort(listSegmentFill.getViewPort());
|
||||||
listSegmentFill.applyMatrix(mtx);
|
listSegmentFill.applyMatrix(mtx);
|
||||||
// now, traverse the scanlines and find the intersections on each scanline, use non-zero rule
|
// now, traverse the scanlines and find the intersections on each scanline, use non-zero rule
|
||||||
tmpFill.generate(_myRenderer.getSize(), _myRenderer.getNumberSubScanLine(), listSegmentFill);
|
tmpFill.generate(_myRenderer.getSize(), _myRenderer.getNumberSubScanLine(), listSegmentFill);
|
||||||
@ -290,6 +291,7 @@ void esvg::Path::draw(esvg::Renderer& _myRenderer, mat2& _basicTrans, int32_t _l
|
|||||||
m_paint.lineCap,
|
m_paint.lineCap,
|
||||||
m_paint.lineJoin,
|
m_paint.lineJoin,
|
||||||
m_paint.miterLimit);
|
m_paint.miterLimit);
|
||||||
|
colorStroke->setViewPort(listSegmentStroke.getViewPort());
|
||||||
listSegmentStroke.applyMatrix(mtx);
|
listSegmentStroke.applyMatrix(mtx);
|
||||||
// now, traverse the scanlines and find the intersections on each scanline, use non-zero rule
|
// now, traverse the scanlines and find the intersections on each scanline, use non-zero rule
|
||||||
tmpStroke.generate(_myRenderer.getSize(), _myRenderer.getNumberSubScanLine(), listSegmentStroke);
|
tmpStroke.generate(_myRenderer.getSize(), _myRenderer.getNumberSubScanLine(), listSegmentStroke);
|
||||||
|
@ -88,14 +88,15 @@ void esvg::Polygon::draw(esvg::Renderer& _myRenderer, mat2& _basicTrans, int32_t
|
|||||||
esvg::render::SegmentList listSegmentStroke;
|
esvg::render::SegmentList listSegmentStroke;
|
||||||
esvg::render::Weight tmpFill;
|
esvg::render::Weight tmpFill;
|
||||||
esvg::render::Weight tmpStroke;
|
esvg::render::Weight tmpStroke;
|
||||||
std::shared_ptr<esvg::render::DynamicColor> colorFill = esvg::render::createColor(m_paint.fill, mtx, m_paint.viewPort);
|
std::shared_ptr<esvg::render::DynamicColor> colorFill = esvg::render::createColor(m_paint.fill, mtx);
|
||||||
std::shared_ptr<esvg::render::DynamicColor> colorStroke;
|
std::shared_ptr<esvg::render::DynamicColor> colorStroke;
|
||||||
if (m_paint.strokeWidth > 0.0f) {
|
if (m_paint.strokeWidth > 0.0f) {
|
||||||
colorStroke = esvg::render::createColor(m_paint.stroke, mtx, m_paint.viewPort);
|
colorStroke = esvg::render::createColor(m_paint.stroke, mtx);
|
||||||
}
|
}
|
||||||
// Check if we need to display background
|
// Check if we need to display background
|
||||||
if (colorFill != nullptr) {
|
if (colorFill != nullptr) {
|
||||||
listSegmentFill.createSegmentList(listPoints);
|
listSegmentFill.createSegmentList(listPoints);
|
||||||
|
colorFill->setViewPort(listSegmentFill.getViewPort());
|
||||||
listSegmentFill.applyMatrix(mtx);
|
listSegmentFill.applyMatrix(mtx);
|
||||||
// now, traverse the scanlines and find the intersections on each scanline, use non-zero rule
|
// now, traverse the scanlines and find the intersections on each scanline, use non-zero rule
|
||||||
tmpFill.generate(_myRenderer.getSize(),
|
tmpFill.generate(_myRenderer.getSize(),
|
||||||
@ -109,6 +110,7 @@ void esvg::Polygon::draw(esvg::Renderer& _myRenderer, mat2& _basicTrans, int32_t
|
|||||||
m_paint.lineCap,
|
m_paint.lineCap,
|
||||||
m_paint.lineJoin,
|
m_paint.lineJoin,
|
||||||
m_paint.miterLimit);
|
m_paint.miterLimit);
|
||||||
|
colorStroke->setViewPort(listSegmentStroke.getViewPort());
|
||||||
listSegmentStroke.applyMatrix(mtx);
|
listSegmentStroke.applyMatrix(mtx);
|
||||||
// now, traverse the scanlines and find the intersections on each scanline, use non-zero rule
|
// now, traverse the scanlines and find the intersections on each scanline, use non-zero rule
|
||||||
tmpStroke.generate(_myRenderer.getSize(),
|
tmpStroke.generate(_myRenderer.getSize(),
|
||||||
|
@ -85,14 +85,15 @@ void esvg::Polyline::draw(esvg::Renderer& _myRenderer, mat2& _basicTrans, int32_
|
|||||||
esvg::render::SegmentList listSegmentStroke;
|
esvg::render::SegmentList listSegmentStroke;
|
||||||
esvg::render::Weight tmpFill;
|
esvg::render::Weight tmpFill;
|
||||||
esvg::render::Weight tmpStroke;
|
esvg::render::Weight tmpStroke;
|
||||||
std::shared_ptr<esvg::render::DynamicColor> colorFill = esvg::render::createColor(m_paint.fill, mtx, m_paint.viewPort);
|
std::shared_ptr<esvg::render::DynamicColor> colorFill = esvg::render::createColor(m_paint.fill, mtx);
|
||||||
std::shared_ptr<esvg::render::DynamicColor> colorStroke;
|
std::shared_ptr<esvg::render::DynamicColor> colorStroke;
|
||||||
if (m_paint.strokeWidth > 0.0f) {
|
if (m_paint.strokeWidth > 0.0f) {
|
||||||
colorStroke = esvg::render::createColor(m_paint.stroke, mtx, m_paint.viewPort);
|
colorStroke = esvg::render::createColor(m_paint.stroke, mtx);
|
||||||
}
|
}
|
||||||
// Check if we need to display background
|
// Check if we need to display background
|
||||||
if (colorFill != nullptr) {
|
if (colorFill != nullptr) {
|
||||||
listSegmentFill.createSegmentList(listPoints);
|
listSegmentFill.createSegmentList(listPoints);
|
||||||
|
colorFill->setViewPort(listSegmentFill.getViewPort());
|
||||||
listSegmentFill.applyMatrix(mtx);
|
listSegmentFill.applyMatrix(mtx);
|
||||||
// now, traverse the scanlines and find the intersections on each scanline, use non-zero rule
|
// now, traverse the scanlines and find the intersections on each scanline, use non-zero rule
|
||||||
tmpFill.generate(_myRenderer.getSize(),
|
tmpFill.generate(_myRenderer.getSize(),
|
||||||
@ -106,6 +107,7 @@ void esvg::Polyline::draw(esvg::Renderer& _myRenderer, mat2& _basicTrans, int32_
|
|||||||
m_paint.lineCap,
|
m_paint.lineCap,
|
||||||
m_paint.lineJoin,
|
m_paint.lineJoin,
|
||||||
m_paint.miterLimit);
|
m_paint.miterLimit);
|
||||||
|
colorStroke->setViewPort(listSegmentStroke.getViewPort());
|
||||||
listSegmentStroke.applyMatrix(mtx);
|
listSegmentStroke.applyMatrix(mtx);
|
||||||
// now, traverse the scanlines and find the intersections on each scanline, use non-zero rule
|
// now, traverse the scanlines and find the intersections on each scanline, use non-zero rule
|
||||||
tmpStroke.generate(_myRenderer.getSize(),
|
tmpStroke.generate(_myRenderer.getSize(),
|
||||||
|
@ -103,14 +103,15 @@ void esvg::Rectangle::draw(esvg::Renderer& _myRenderer, mat2& _basicTrans, int32
|
|||||||
esvg::render::SegmentList listSegmentStroke;
|
esvg::render::SegmentList listSegmentStroke;
|
||||||
esvg::render::Weight tmpFill;
|
esvg::render::Weight tmpFill;
|
||||||
esvg::render::Weight tmpStroke;
|
esvg::render::Weight tmpStroke;
|
||||||
std::shared_ptr<esvg::render::DynamicColor> colorFill = esvg::render::createColor(m_paint.fill, mtx, m_paint.viewPort);
|
std::shared_ptr<esvg::render::DynamicColor> colorFill = esvg::render::createColor(m_paint.fill, mtx);
|
||||||
std::shared_ptr<esvg::render::DynamicColor> colorStroke;
|
std::shared_ptr<esvg::render::DynamicColor> colorStroke;
|
||||||
if (m_paint.strokeWidth > 0.0f) {
|
if (m_paint.strokeWidth > 0.0f) {
|
||||||
colorStroke = esvg::render::createColor(m_paint.stroke, mtx, m_paint.viewPort);
|
colorStroke = esvg::render::createColor(m_paint.stroke, mtx);
|
||||||
}
|
}
|
||||||
// Check if we need to display background
|
// Check if we need to display background
|
||||||
if (colorFill != nullptr) {
|
if (colorFill != nullptr) {
|
||||||
listSegmentFill.createSegmentList(listPoints);
|
listSegmentFill.createSegmentList(listPoints);
|
||||||
|
colorFill->setViewPort(listSegmentFill.getViewPort());
|
||||||
listSegmentFill.applyMatrix(mtx);
|
listSegmentFill.applyMatrix(mtx);
|
||||||
// now, traverse the scanlines and find the intersections on each scanline, use non-zero rule
|
// now, traverse the scanlines and find the intersections on each scanline, use non-zero rule
|
||||||
tmpFill.generate(_myRenderer.getSize(),
|
tmpFill.generate(_myRenderer.getSize(),
|
||||||
@ -124,6 +125,7 @@ void esvg::Rectangle::draw(esvg::Renderer& _myRenderer, mat2& _basicTrans, int32
|
|||||||
m_paint.lineCap,
|
m_paint.lineCap,
|
||||||
m_paint.lineJoin,
|
m_paint.lineJoin,
|
||||||
m_paint.miterLimit);
|
m_paint.miterLimit);
|
||||||
|
colorStroke->setViewPort(listSegmentStroke.getViewPort());
|
||||||
listSegmentStroke.applyMatrix(mtx);
|
listSegmentStroke.applyMatrix(mtx);
|
||||||
// now, traverse the scanlines and find the intersections on each scanline, use non-zero rule
|
// now, traverse the scanlines and find the intersections on each scanline, use non-zero rule
|
||||||
tmpStroke.generate(_myRenderer.getSize(),
|
tmpStroke.generate(_myRenderer.getSize(),
|
||||||
|
@ -11,16 +11,64 @@
|
|||||||
#include <esvg/LinearGradient.h>
|
#include <esvg/LinearGradient.h>
|
||||||
#include <esvg/esvg.h>
|
#include <esvg/esvg.h>
|
||||||
|
|
||||||
esvg::render::DynamicColorLinear::DynamicColorLinear(const std::string& _link, const mat2& _mtx, const vec2 _size) :
|
esvg::render::DynamicColorLinear::DynamicColorLinear(const std::string& _link, const mat2& _mtx) :
|
||||||
m_colorName(_link),
|
m_colorName(_link),
|
||||||
m_matrix(_mtx),
|
m_matrix(_mtx),
|
||||||
m_size(_size) {
|
m_viewPort(vec2(9999999999.0,9999999999.0),vec2(-9999999999.0,-9999999999.0)) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void esvg::render::DynamicColorLinear::setViewPort(const std::pair<vec2, vec2>& _viewPort) {
|
||||||
|
m_viewPort = _viewPort;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static vec2 getIntersect(const vec2& _point1,
|
||||||
|
const vec2& _vect1,
|
||||||
|
const vec2& _point2,
|
||||||
|
const vec2& _vect2) {
|
||||||
|
float diviseur = _vect1.x() * _vect2.y() - _vect1.y() * _vect2.x();
|
||||||
|
if(diviseur != 0.0f) {
|
||||||
|
float mmm = ( _vect1.x() * _point1.y()
|
||||||
|
- _vect1.x() * _point2.y()
|
||||||
|
- _vect1.y() * _point1.x()
|
||||||
|
+ _vect1.y() * _point2.x()
|
||||||
|
) / diviseur;
|
||||||
|
return vec2(_point2 + _vect2 * mmm);
|
||||||
|
}
|
||||||
|
ESVG_ERROR("Get divider / 0.0f");
|
||||||
|
return _point2;
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO : This can optimize ... really slow ...
|
||||||
etk::Color<float,4> esvg::render::DynamicColorLinear::getColor(const ivec2& _pos) {
|
etk::Color<float,4> esvg::render::DynamicColorLinear::getColor(const ivec2& _pos) {
|
||||||
return etk::color::purple;
|
if (m_data.size() < 2) {
|
||||||
|
return etk::color::purple;
|
||||||
|
}
|
||||||
|
vec2 vectorBase = m_pos2 - m_pos1;
|
||||||
|
vec2 vectorOrtho(vectorBase.y(), -vectorBase.x());
|
||||||
|
vec2 intersec = getIntersect(m_pos1, vectorBase,
|
||||||
|
vec2(_pos.x(), _pos.y()), vectorOrtho);
|
||||||
|
float baseSize = vectorBase.length();
|
||||||
|
float baseDraw = (m_pos1 - intersec).length();
|
||||||
|
float ratio = baseDraw / baseSize;
|
||||||
|
if (ratio <= m_data[0].first*0.01f) {
|
||||||
|
return m_data[0].second;
|
||||||
|
}
|
||||||
|
if (ratio >= m_data.back().first*0.01f) {
|
||||||
|
return m_data.back().second;
|
||||||
|
}
|
||||||
|
for (size_t iii=1; iii<m_data.size(); ++iii) {
|
||||||
|
if (ratio <= m_data[iii].first*0.01f) {
|
||||||
|
float localRatio = ratio - m_data[iii-1].first*0.01f;
|
||||||
|
localRatio = localRatio / ((m_data[iii].first - m_data[iii-1].first) * 0.01f);
|
||||||
|
return etk::Color<float,4>(m_data[iii-1].second.r() * (1.0-localRatio) + m_data[iii].second.r() * localRatio,
|
||||||
|
m_data[iii-1].second.g() * (1.0-localRatio) + m_data[iii].second.g() * localRatio,
|
||||||
|
m_data[iii-1].second.b() * (1.0-localRatio) + m_data[iii].second.b() * localRatio,
|
||||||
|
m_data[iii-1].second.a() * (1.0-localRatio) + m_data[iii].second.a() * localRatio);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return etk::color::green;
|
||||||
}
|
}
|
||||||
|
|
||||||
void esvg::render::DynamicColorLinear::generate(esvg::Document* _document) {
|
void esvg::render::DynamicColorLinear::generate(esvg::Document* _document) {
|
||||||
@ -40,23 +88,34 @@ void esvg::render::DynamicColorLinear::generate(esvg::Document* _document) {
|
|||||||
}
|
}
|
||||||
ESVG_INFO("get for color linear:");
|
ESVG_INFO("get for color linear:");
|
||||||
gradient->display(2);
|
gradient->display(2);
|
||||||
|
ESVG_INFO(" viewport = {" << m_viewPort.first << "," << m_viewPort.second << "}");
|
||||||
|
vec2 size = m_viewPort.second - m_viewPort.first;
|
||||||
|
|
||||||
esvg::Dimension pos1 = gradient->getPosition1();
|
esvg::Dimension dimPos1 = gradient->getPosition1();
|
||||||
esvg::Dimension pos2 = gradient->getPosition2();
|
m_pos1 = dimPos1.getPixel(size);
|
||||||
std::vector<std::pair<float, etk::Color<float,4>>> data = gradient->getColors();
|
if (dimPos1.getType() == esvg::distance_pourcent) {
|
||||||
// ROTATE and many things ...
|
m_pos1 += m_viewPort.first;
|
||||||
|
}
|
||||||
|
esvg::Dimension dimPos2 = gradient->getPosition2();
|
||||||
|
m_pos2 = dimPos2.getPixel(size);
|
||||||
|
if (dimPos2.getType() == esvg::distance_pourcent) {
|
||||||
|
m_pos2 += m_viewPort.first;
|
||||||
|
}
|
||||||
|
// Move the positions ...
|
||||||
|
m_pos1 = m_matrix * m_pos1;
|
||||||
|
m_pos2 = m_matrix * m_pos2;
|
||||||
|
m_data = gradient->getColors();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
std::shared_ptr<esvg::render::DynamicColor> esvg::render::createColor(std::pair<etk::Color<float,4>, std::string> _color, const mat2& _mtx, const vec2 _size) {
|
std::shared_ptr<esvg::render::DynamicColor> esvg::render::createColor(std::pair<etk::Color<float,4>, std::string> _color, const mat2& _mtx) {
|
||||||
// Check if need to create a color:
|
// Check if need to create a color:
|
||||||
if ( _color.first.a() == 0x00
|
if ( _color.first.a() == 0x00
|
||||||
&& _color.second == "") {
|
&& _color.second == "") {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
if (_color.second != "") {
|
if (_color.second != "") {
|
||||||
return std::make_shared<esvg::render::DynamicColorLinear>(_color.second, _mtx, _size);
|
return std::make_shared<esvg::render::DynamicColorLinear>(_color.second, _mtx);
|
||||||
}
|
}
|
||||||
return std::make_shared<esvg::render::DynamicColorUni>(_color.first);
|
return std::make_shared<esvg::render::DynamicColorUni>(_color.first);
|
||||||
}
|
}
|
||||||
|
@ -26,6 +26,7 @@ namespace esvg {
|
|||||||
virtual ~DynamicColor() {};
|
virtual ~DynamicColor() {};
|
||||||
virtual etk::Color<float,4> getColor(const ivec2& _pos) = 0;
|
virtual etk::Color<float,4> getColor(const ivec2& _pos) = 0;
|
||||||
virtual void generate(esvg::Document* _document) = 0;
|
virtual void generate(esvg::Document* _document) = 0;
|
||||||
|
virtual void setViewPort(const std::pair<vec2, vec2>& _viewPort) = 0;
|
||||||
};
|
};
|
||||||
class DynamicColorUni : public esvg::render::DynamicColor {
|
class DynamicColorUni : public esvg::render::DynamicColor {
|
||||||
public:
|
public:
|
||||||
@ -41,19 +42,26 @@ namespace esvg {
|
|||||||
virtual void generate(esvg::Document* _document) {
|
virtual void generate(esvg::Document* _document) {
|
||||||
// nothing to do ...
|
// nothing to do ...
|
||||||
}
|
}
|
||||||
|
virtual void setViewPort(const std::pair<vec2, vec2>& _viewPort) {
|
||||||
|
// nothing to do ...
|
||||||
|
};
|
||||||
};
|
};
|
||||||
class DynamicColorLinear : public esvg::render::DynamicColor {
|
class DynamicColorLinear : public esvg::render::DynamicColor {
|
||||||
public:
|
public:
|
||||||
std::string m_colorName;
|
std::string m_colorName;
|
||||||
mat2 m_matrix;
|
mat2 m_matrix;
|
||||||
vec2 m_size;
|
std::pair<vec2, vec2> m_viewPort;
|
||||||
|
vec2 m_pos1;
|
||||||
|
vec2 m_pos2;
|
||||||
|
std::vector<std::pair<float, etk::Color<float,4>>> m_data;
|
||||||
public:
|
public:
|
||||||
DynamicColorLinear(const std::string& _link, const mat2& _mtx, const vec2 _size);
|
DynamicColorLinear(const std::string& _link, const mat2& _mtx);
|
||||||
virtual etk::Color<float,4> getColor(const ivec2& _pos);
|
virtual etk::Color<float,4> getColor(const ivec2& _pos);
|
||||||
virtual void generate(esvg::Document* _document);
|
virtual void generate(esvg::Document* _document);
|
||||||
|
virtual void setViewPort(const std::pair<vec2, vec2>& _viewPort);
|
||||||
};
|
};
|
||||||
|
|
||||||
std::shared_ptr<DynamicColor> createColor(std::pair<etk::Color<float,4>, std::string> _color, const mat2& _mtx, const vec2 _size);
|
std::shared_ptr<DynamicColor> createColor(std::pair<etk::Color<float,4>, std::string> _color, const mat2& _mtx);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -26,6 +26,16 @@ void esvg::render::PointList::applyMatrix(const mat2& _transformationMatrix) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::pair<vec2, vec2> esvg::render::PointList::getViewPort() {
|
||||||
|
std::pair<vec2, vec2> out(vec2(9999999999.0,9999999999.0),vec2(-9999999999.0,-9999999999.0));
|
||||||
|
for (auto &it : m_data) {
|
||||||
|
for (auto &it2 : it) {
|
||||||
|
out.first.setMin(it2.m_pos);
|
||||||
|
out.second.setMax(it2.m_pos);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
void esvg::render::PointList::display() {
|
void esvg::render::PointList::display() {
|
||||||
ESVG_VERBOSE(" Display list of points : size=" << m_data.size());
|
ESVG_VERBOSE(" Display list of points : size=" << m_data.size());
|
||||||
|
@ -25,6 +25,7 @@ namespace esvg {
|
|||||||
void addList(std::vector<esvg::render::Point>& _list);
|
void addList(std::vector<esvg::render::Point>& _list);
|
||||||
void display();
|
void display();
|
||||||
void applyMatrix(const mat2& _transformationMatrix);
|
void applyMatrix(const mat2& _transformationMatrix);
|
||||||
|
std::pair<vec2, vec2> getViewPort();
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -28,6 +28,16 @@ void esvg::render::SegmentList::addSegment(const esvg::render::Point& _pos0, con
|
|||||||
m_data.push_back(Segment(_pos0.m_pos, _pos1.m_pos));
|
m_data.push_back(Segment(_pos0.m_pos, _pos1.m_pos));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::pair<vec2, vec2> esvg::render::SegmentList::getViewPort() {
|
||||||
|
std::pair<vec2, vec2> out(vec2(9999999999.0,9999999999.0),vec2(-9999999999.0,-9999999999.0));
|
||||||
|
for (auto &it : m_data) {
|
||||||
|
out.first.setMin(it.p0);
|
||||||
|
out.second.setMax(it.p0);
|
||||||
|
out.first.setMin(it.p1);
|
||||||
|
out.second.setMax(it.p1);
|
||||||
|
}
|
||||||
|
return out;
|
||||||
|
}
|
||||||
void esvg::render::SegmentList::createSegmentList(const esvg::render::PointList& _listPoint) {
|
void esvg::render::SegmentList::createSegmentList(const esvg::render::PointList& _listPoint) {
|
||||||
for (auto &it : _listPoint.m_data) {
|
for (auto &it : _listPoint.m_data) {
|
||||||
// Build Segments
|
// Build Segments
|
||||||
|
@ -43,6 +43,7 @@ namespace esvg {
|
|||||||
float _width,
|
float _width,
|
||||||
bool _isStart);
|
bool _isStart);
|
||||||
public:
|
public:
|
||||||
|
std::pair<vec2, vec2> getViewPort();
|
||||||
void applyMatrix(const mat2& _transformationMatrix);
|
void applyMatrix(const mat2& _transformationMatrix);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -47,3 +47,39 @@ TEST(TestGradientLinear, vertical) {
|
|||||||
etk::FSNodeWriteAllData("TestGradientLinear_vertical.svg", data);
|
etk::FSNodeWriteAllData("TestGradientLinear_vertical.svg", data);
|
||||||
doc.generateAnImage(ivec2(100, 100), "TestGradientLinear_vertical.bmp", g_visualDebug);
|
doc.generateAnImage(ivec2(100, 100), "TestGradientLinear_vertical.bmp", g_visualDebug);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(TestGradientLinear, diag1) {
|
||||||
|
std::string data("<?xml version='1.0' encoding='UTF-8' standalone='no'?>\n"
|
||||||
|
"<svg height='100' width='100'>\n"
|
||||||
|
" <defs>\n"
|
||||||
|
" <linearGradient id='grad2' x1='0%' y1='0%' x2='100%' y2='100%'>\n"
|
||||||
|
" <stop offset='0%' style='stop-color:rgb(255,255,0);stop-opacity:1' />\n"
|
||||||
|
" <stop offset='100%' style='stop-color:rgb(255,0,0);stop-opacity:1' />\n"
|
||||||
|
" </linearGradient>\n"
|
||||||
|
" </defs>\n"
|
||||||
|
" <ellipse cx='50' cy='50' rx='50' ry='20' fill='url(#grad2)' />\n"
|
||||||
|
"</svg>\n");
|
||||||
|
esvg::Document doc;
|
||||||
|
doc.parse(data);
|
||||||
|
etk::FSNodeWriteAllData("TestGradientLinear_diag1.svg", data);
|
||||||
|
doc.generateAnImage(ivec2(100, 100), "TestGradientLinear_diag1.bmp", g_visualDebug);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(TestGradientLinear, diag2) {
|
||||||
|
std::string data("<?xml version='1.0' encoding='UTF-8' standalone='no'?>\n"
|
||||||
|
"<svg height='100' width='100'>\n"
|
||||||
|
" <defs>\n"
|
||||||
|
" <linearGradient id='grad2' x1='0%' y1='100%' x2='100%' y2='0%'>\n"
|
||||||
|
" <stop offset='0%' style='stop-color:rgb(255,255,0);stop-opacity:1' />\n"
|
||||||
|
" <stop offset='100%' style='stop-color:rgb(255,0,0);stop-opacity:1' />\n"
|
||||||
|
" </linearGradient>\n"
|
||||||
|
" </defs>\n"
|
||||||
|
" <ellipse cx='50' cy='50' rx='50' ry='20' fill='url(#grad2)' />\n"
|
||||||
|
"</svg>\n");
|
||||||
|
esvg::Document doc;
|
||||||
|
doc.parse(data);
|
||||||
|
etk::FSNodeWriteAllData("TestGradientLinear_diag2.svg", data);
|
||||||
|
doc.generateAnImage(ivec2(100, 100), "TestGradientLinear_diag2.bmp", g_visualDebug);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user