[DEV] try to implement curve path models ... (not work at all) and add test assiciated
This commit is contained in:
parent
3ddc118c4c
commit
4ccad4aaed
@ -203,7 +203,9 @@ bool esvg::Path::parse(const std::shared_ptr<exml::Element>& _element, mat2& _pa
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
for(int32_t iii=0; iii<listDot.size(); iii+=4) {
|
for(int32_t iii=0; iii<listDot.size(); iii+=4) {
|
||||||
m_listElement.smoothCurveTo(relative, vec2(listDot[iii],listDot[iii+1]), vec2(listDot[iii+2],listDot[iii+3]));
|
m_listElement.smoothCurveTo(relative,
|
||||||
|
vec2(listDot[iii],listDot[iii+1]),
|
||||||
|
vec2(listDot[iii+2],listDot[iii+3]));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -102,7 +102,7 @@ void esvg::Document::generateAnImage(const ivec2& _size, const std::string& _fil
|
|||||||
SVG_ERROR("SizeY == 0 ==> set 64");
|
SVG_ERROR("SizeY == 0 ==> set 64");
|
||||||
sizeY = 64;
|
sizeY = 64;
|
||||||
}
|
}
|
||||||
SVG_INFO("Generate size (" << sizeX << "," << sizeY << ")");
|
SVG_DEBUG("Generate size (" << sizeX << "," << sizeY << ")");
|
||||||
delete(m_renderedElement);
|
delete(m_renderedElement);
|
||||||
m_renderedElement = nullptr;
|
m_renderedElement = nullptr;
|
||||||
|
|
||||||
|
@ -232,29 +232,83 @@ esvg::render::PointList esvg::render::Path::generateListPoints(int32_t _level, i
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case esvg::render::path_smoothCurveTo:
|
case esvg::render::path_smoothCurveTo:
|
||||||
/*
|
// If no previous point, we need to create the last point has start ...
|
||||||
path.curve4SmoothTo(it->getRelative(),
|
if (tmpListPoint.size() == 0) {
|
||||||
vec2(it->m_element[0],
|
tmpListPoint.push_back(esvg::render::Point(lastPosition, esvg::render::Point::type_join));
|
||||||
it->m_element[1]),
|
}
|
||||||
vec2(it->m_element[2],
|
{
|
||||||
it->m_element[3]) );
|
vec2 lastPosStore(lastPosition);
|
||||||
*/
|
if (it->getRelative() == false) {
|
||||||
|
lastPosition = vec2(0.0f, 0.0f);
|
||||||
|
}
|
||||||
|
vec2 pos2 = lastPosition + it->getPos2();
|
||||||
|
vec2 pos = lastPosition + it->getPos();
|
||||||
|
// generate Pos 1
|
||||||
|
vec2 pos1 = pos*2.0f - pos2;
|
||||||
|
interpolateCubicBezier(tmpListPoint,
|
||||||
|
_recurtionMax,
|
||||||
|
_threshold,
|
||||||
|
lastPosStore,
|
||||||
|
pos1,
|
||||||
|
pos2,
|
||||||
|
pos,
|
||||||
|
0,
|
||||||
|
esvg::render::Point::type_join);
|
||||||
|
lastPosition = pos;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case esvg::render::path_bezierCurveTo:
|
case esvg::render::path_bezierCurveTo:
|
||||||
/*
|
// If no previous point, we need to create the last point has start ...
|
||||||
path.curve3To(it->getRelative(),
|
if (tmpListPoint.size() == 0) {
|
||||||
vec2(it->m_element[0],
|
tmpListPoint.push_back(esvg::render::Point(lastPosition, esvg::render::Point::type_join));
|
||||||
it->m_element[1]),
|
}
|
||||||
vec2(it->m_element[2],
|
{
|
||||||
it->m_element[3]) );
|
vec2 lastPosStore(lastPosition);
|
||||||
*/
|
if (it->getRelative() == false) {
|
||||||
|
lastPosition = vec2(0.0f, 0.0f);
|
||||||
|
}
|
||||||
|
vec2 pos = lastPosition + it->getPos();
|
||||||
|
// generate pos1 and pos2
|
||||||
|
vec2 pos1 = lastPosStore + (it->getPos1() - lastPosStore)*0.666666666f;
|
||||||
|
vec2 pos2 = pos + (it->getPos1() - pos)*0.666666666f;
|
||||||
|
interpolateCubicBezier(tmpListPoint,
|
||||||
|
_recurtionMax,
|
||||||
|
_threshold,
|
||||||
|
lastPosStore,
|
||||||
|
pos1,
|
||||||
|
pos2,
|
||||||
|
pos,
|
||||||
|
0,
|
||||||
|
esvg::render::Point::type_join);
|
||||||
|
lastPosition = pos;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case esvg::render::path_bezierSmoothCurveTo:
|
case esvg::render::path_bezierSmoothCurveTo:
|
||||||
/*
|
// If no previous point, we need to create the last point has start ...
|
||||||
path.curve3SmoothTo(it->getRelative(),
|
if (tmpListPoint.size() == 0) {
|
||||||
vec2(it->m_element[0],
|
tmpListPoint.push_back(esvg::render::Point(lastPosition, esvg::render::Point::type_join));
|
||||||
it->m_element[1]) );
|
}
|
||||||
*/
|
{
|
||||||
|
vec2 lastPosStore(lastPosition);
|
||||||
|
if (it->getRelative() == false) {
|
||||||
|
lastPosition = vec2(0.0f, 0.0f);
|
||||||
|
}
|
||||||
|
vec2 pos = lastPosition + it->getPos();
|
||||||
|
vec2 delta = lastPosStore*2.0f - pos;
|
||||||
|
// generate pos1 and pos2
|
||||||
|
vec2 pos1 = lastPosStore + (delta - lastPosStore)*0.666666666f;
|
||||||
|
vec2 pos2 = pos + (delta - pos)*0.66666666f;
|
||||||
|
interpolateCubicBezier(tmpListPoint,
|
||||||
|
_recurtionMax,
|
||||||
|
_threshold,
|
||||||
|
lastPosStore,
|
||||||
|
pos1,
|
||||||
|
pos2,
|
||||||
|
pos,
|
||||||
|
0,
|
||||||
|
esvg::render::Point::type_join);
|
||||||
|
lastPosition = pos;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case esvg::render::path_elliptic:
|
case esvg::render::path_elliptic:
|
||||||
/*
|
/*
|
||||||
|
@ -48,3 +48,62 @@ TEST(TestPath, fill_and_stroke) {
|
|||||||
etk::FSNodeWriteAllData("TestPath_fill_and_stroke.svg", data);
|
etk::FSNodeWriteAllData("TestPath_fill_and_stroke.svg", data);
|
||||||
doc.generateAnImage(ivec2(100, 100), "TestPath_fill_and_stroke.bmp", g_visualDebug);
|
doc.generateAnImage(ivec2(100, 100), "TestPath_fill_and_stroke.bmp", g_visualDebug);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(TestPath, curveTo) {
|
||||||
|
std::string data("<?xml version='1.0' encoding='UTF-8' standalone='no'?>"
|
||||||
|
"<svg height='100' width='100'>"
|
||||||
|
" <path d='m 50,50 c -30,0 -30,1 -20,20 z'"
|
||||||
|
" fill='red' />"
|
||||||
|
"</svg>");
|
||||||
|
esvg::Document doc;
|
||||||
|
doc.parse(data);
|
||||||
|
etk::FSNodeWriteAllData("TestPath_curveTo.svg", data);
|
||||||
|
doc.generateAnImage(ivec2(100, 100), "TestPath_curveTo.bmp", g_visualDebug);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
TEST(TestPath, smoothCurveTo) {
|
||||||
|
std::string data("<?xml version='1.0' encoding='UTF-8' standalone='no'?>"
|
||||||
|
"<svg height='100' width='100'>"
|
||||||
|
" <path d='m 50,50 s -30,0 -20,20 z'"
|
||||||
|
" fill='red' />"
|
||||||
|
"</svg>");
|
||||||
|
esvg::Document doc;
|
||||||
|
doc.parse(data);
|
||||||
|
etk::FSNodeWriteAllData("TestPath_smoothCurveTo.svg", data);
|
||||||
|
doc.generateAnImage(ivec2(100, 100), "TestPath_smoothCurveTo.bmp", g_visualDebug);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
TEST(TestPath, bezierCurveTo) {
|
||||||
|
std::string data("<?xml version='1.0' encoding='UTF-8' standalone='no'?>"
|
||||||
|
"<svg height='100' width='100'>"
|
||||||
|
" <path d='m 50,50 q -30,1 -20,20 z'"
|
||||||
|
" fill='red' />"
|
||||||
|
"</svg>");
|
||||||
|
esvg::Document doc;
|
||||||
|
doc.parse(data);
|
||||||
|
etk::FSNodeWriteAllData("TestPath_bezierCurveTo.svg", data);
|
||||||
|
doc.generateAnImage(ivec2(100, 100), "TestPath_bezierCurveTo.bmp", g_visualDebug);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
TEST(TestPath, bezierSmoothCurveTo) {
|
||||||
|
std::string data("<?xml version='1.0' encoding='UTF-8' standalone='no'?>"
|
||||||
|
"<svg height='100' width='100'>"
|
||||||
|
" <path d='m 50,50 t -20,20 z'"
|
||||||
|
" fill='red' />"
|
||||||
|
"</svg>");
|
||||||
|
esvg::Document doc;
|
||||||
|
doc.parse(data);
|
||||||
|
etk::FSNodeWriteAllData("TestPath_bezierSmoothCurveTo.svg", data);
|
||||||
|
doc.generateAnImage(ivec2(100, 100), "TestPath_bezierSmoothCurveTo.bmp", g_visualDebug);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(TestPath, arc) {
|
||||||
|
// TODO : ...
|
||||||
|
EXPECT_EQ(1, 2);
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user