[DEV] support xlink::href in linear gradient
This commit is contained in:
parent
6b976bb9ea
commit
3bba1c8ba4
@ -10,6 +10,7 @@
|
|||||||
#include <esvg/LinearGradient.h>
|
#include <esvg/LinearGradient.h>
|
||||||
#include <esvg/render/Path.h>
|
#include <esvg/render/Path.h>
|
||||||
#include <esvg/render/Weight.h>
|
#include <esvg/render/Weight.h>
|
||||||
|
#include <esvg/esvg.h>
|
||||||
|
|
||||||
#undef __class__
|
#undef __class__
|
||||||
#define __class__ "LinearGradient"
|
#define __class__ "LinearGradient"
|
||||||
@ -42,11 +43,21 @@ bool esvg::LinearGradient::parseXML(const std::shared_ptr<exml::Element>& _eleme
|
|||||||
|
|
||||||
std::string contentX = _element->getAttribute("x1");
|
std::string contentX = _element->getAttribute("x1");
|
||||||
std::string contentY = _element->getAttribute("y1");
|
std::string contentY = _element->getAttribute("y1");
|
||||||
|
if ( contentX != ""
|
||||||
|
&& contentY != "") {
|
||||||
m_pos1.set(contentX, contentY);
|
m_pos1.set(contentX, contentY);
|
||||||
|
}
|
||||||
contentX = _element->getAttribute("x2");
|
contentX = _element->getAttribute("x2");
|
||||||
contentY = _element->getAttribute("y2");
|
contentY = _element->getAttribute("y2");
|
||||||
|
if ( contentX != ""
|
||||||
|
&& contentY != "") {
|
||||||
m_pos2.set(contentX, contentY);
|
m_pos2.set(contentX, contentY);
|
||||||
|
}
|
||||||
|
// note: xlink:href is incompatible with subNode "stop"
|
||||||
|
m_href = _element->getAttribute("xlink:href");
|
||||||
|
if (m_href.size() != 0) {
|
||||||
|
m_href = std::string(m_href.begin()+1, m_href.end());
|
||||||
|
}
|
||||||
// parse all sub node :
|
// parse all sub node :
|
||||||
for(int32_t iii=0; iii<_element->size() ; iii++) {
|
for(int32_t iii=0; iii<_element->size() ; iii++) {
|
||||||
std::shared_ptr<exml::Element> child = _element->getElement(iii);
|
std::shared_ptr<exml::Element> child = _element->getElement(iii);
|
||||||
@ -83,6 +94,12 @@ bool esvg::LinearGradient::parseXML(const std::shared_ptr<exml::Element>& _eleme
|
|||||||
ESVG_ERROR("(l " << child->getPos() << ") node not suported : \"" << child->getValue() << "\" must be [stop]");
|
ESVG_ERROR("(l " << child->getPos() << ") node not suported : \"" << child->getValue() << "\" must be [stop]");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (m_data.size() != 0) {
|
||||||
|
if (m_href != "") {
|
||||||
|
ESVG_ERROR("(l " << _element->getPos() << ") node can not have an xlink:href element with sub node named: stop ==> removing href");
|
||||||
|
m_href = "";
|
||||||
|
}
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -105,8 +122,25 @@ const esvg::Dimension& esvg::LinearGradient::getPosition2() {
|
|||||||
return m_pos2;
|
return m_pos2;
|
||||||
}
|
}
|
||||||
|
|
||||||
const std::vector<std::pair<float, etk::Color<float,4>>>& esvg::LinearGradient::getColors() {
|
const std::vector<std::pair<float, etk::Color<float,4>>>& esvg::LinearGradient::getColors(esvg::Document* _document) {
|
||||||
|
if (m_href == "") {
|
||||||
return m_data;
|
return m_data;
|
||||||
|
}
|
||||||
|
if (_document == nullptr) {
|
||||||
|
ESVG_ERROR("Get nullptr input for document");
|
||||||
|
return m_data;
|
||||||
|
}
|
||||||
|
std::shared_ptr<esvg::Base> base = _document->getReference(m_href);
|
||||||
|
if (base == nullptr) {
|
||||||
|
ESVG_ERROR("Can not get base : '" << m_href << "'");
|
||||||
|
return m_data;
|
||||||
|
}
|
||||||
|
std::shared_ptr<esvg::LinearGradient> gradient = std::dynamic_pointer_cast<esvg::LinearGradient>(base);
|
||||||
|
if (gradient == nullptr) {
|
||||||
|
ESVG_ERROR("Can not cast in a linear gradient: '" << m_href << "' ==> wrong type");
|
||||||
|
return m_data;
|
||||||
|
}
|
||||||
|
return gradient->getColors(_document);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -12,11 +12,13 @@
|
|||||||
#include <esvg/Base.h>
|
#include <esvg/Base.h>
|
||||||
|
|
||||||
namespace esvg {
|
namespace esvg {
|
||||||
|
class Document;
|
||||||
class LinearGradient : public esvg::Base {
|
class LinearGradient : public esvg::Base {
|
||||||
private:
|
private:
|
||||||
esvg::Dimension m_pos1; //!< gradient position x1 y1
|
esvg::Dimension m_pos1; //!< gradient position x1 y1
|
||||||
esvg::Dimension m_pos2; //!< gradient position x2 y2
|
esvg::Dimension m_pos2; //!< gradient position x2 y2
|
||||||
std::vector<std::pair<float, etk::Color<float,4>>> m_data;
|
std::string m_href; //!< in case of using a single gradient in multiple gradient, the gradient is store in an other element...
|
||||||
|
std::vector<std::pair<float, etk::Color<float,4>>> m_data; //!< incompatible with href
|
||||||
public:
|
public:
|
||||||
LinearGradient(PaintState _parentPaintState);
|
LinearGradient(PaintState _parentPaintState);
|
||||||
~LinearGradient();
|
~LinearGradient();
|
||||||
@ -26,7 +28,7 @@ namespace esvg {
|
|||||||
public:
|
public:
|
||||||
const esvg::Dimension& getPosition1();
|
const esvg::Dimension& getPosition1();
|
||||||
const esvg::Dimension& getPosition2();
|
const esvg::Dimension& getPosition2();
|
||||||
const std::vector<std::pair<float, etk::Color<float,4>>>& getColors();
|
const std::vector<std::pair<float, etk::Color<float,4>>>& getColors(esvg::Document* _document);
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -145,7 +145,7 @@ void esvg::render::DynamicColorLinear::generate(esvg::Document* _document) {
|
|||||||
m_baseSize = vec2((m_pos1 - intersecX).length(),
|
m_baseSize = vec2((m_pos1 - intersecX).length(),
|
||||||
(m_pos1 - intersecY).length());
|
(m_pos1 - intersecY).length());
|
||||||
// get all the colors
|
// get all the colors
|
||||||
m_data = gradient->getColors();
|
m_data = gradient->getColors(_document);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -167,3 +167,23 @@ TEST(TestGradientLinear, diag2scale) {
|
|||||||
etk::FSNodeWriteAllData("TestGradientLinear_diag2scale.svg", data);
|
etk::FSNodeWriteAllData("TestGradientLinear_diag2scale.svg", data);
|
||||||
doc.generateAnImage(ivec2(100, 100), "TestGradientLinear_diag2scale.bmp", g_visualDebug);
|
doc.generateAnImage(ivec2(100, 100), "TestGradientLinear_diag2scale.bmp", g_visualDebug);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(TestGradientLinear, internalHref) {
|
||||||
|
std::string data("<?xml version='1.0' encoding='UTF-8' standalone='no'?>\n"
|
||||||
|
"<svg height='100' width='100'>\n"
|
||||||
|
" <defs>\n"
|
||||||
|
" <linearGradient id='grad2Values'>\n"
|
||||||
|
" <stop offset='0%' style='stop-color:rgb(255,0,0);stop-opacity:1' />\n"
|
||||||
|
" <stop offset='45%' style='stop-color:rgb(0,255,0);stop-opacity:1' />\n"
|
||||||
|
" <stop offset='55%' style='stop-color:rgb(0,0,255);stop-opacity:1' />\n"
|
||||||
|
" <stop offset='100%' style='stop-color:rgb(255,0,255);stop-opacity:1' />\n"
|
||||||
|
" </linearGradient>\n"
|
||||||
|
" <linearGradient id='grad2' x1='0%' y1='100%' x2='100%' y2='0%' xlink:href='#grad2Values' />\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_internalHref.svg", data);
|
||||||
|
doc.generateAnImage(ivec2(100, 100), "TestGradientLinear_internalHref.bmp", g_visualDebug);
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user