[DEV] join bevel is now ok (round need to be done)

This commit is contained in:
Edouard DUPIN 2015-11-30 21:16:41 +01:00
parent fe6235a828
commit 9b7a8a6d5a
2 changed files with 55 additions and 28 deletions

View File

@ -217,10 +217,6 @@ void esvg::render::SegmentList::createSegmentListStroke(esvg::render::PointList&
}
break;
case esvg::join_round:
{
// TODO:
}
break;
case esvg::join_bevel:
{
vec2 axePrevious = (it.m_pos-it.m_posPrevious).safeNormalize();
@ -228,23 +224,43 @@ void esvg::render::SegmentList::createSegmentListStroke(esvg::render::PointList&
// TODO : Add cross at the vector2 ...
float cross = axePrevious.x() * axeNext.y() - axeNext.x() * axePrevious.y();
if (cross > 0.0f) {
SVG_ERROR(" Turn Right");
vec2 right = getIntersect(rightPoint, it.m_pos-it.m_posPrevious, it.m_pos, it.m_miterAxe);
vec2 left1 = it.m_pos
+ it.m_orthoAxePrevious*_width*0.5f;
vec2 left2 = it.m_pos
+ it.m_orthoAxeNext*_width*0.5f;
//Draw from previous point:
addSegment(leftPoint, left1);
SVG_VERBOSE(" segment :" << leftPoint << " -> " << left1);
if (_join == esvg::join_bevel) {
addSegment(left1, left2);
SVG_VERBOSE(" segment :" << left1 << " -> " << left2);
}else {
}
addSegment(right, rightPoint);
SVG_VERBOSE(" segment :" << right << " -> " << rightPoint);
leftPoint = left2;
rightPoint = right;
} else {
SVG_ERROR(" Turn Left");
vec2 left = getIntersect(leftPoint, it.m_pos-it.m_posPrevious, it.m_pos, it.m_miterAxe);
vec2 right1 = it.m_pos
- it.m_orthoAxePrevious*_width*0.5f;
vec2 right2 = it.m_pos
- it.m_orthoAxeNext*_width*0.5f;//Draw from previous point:
addSegment(leftPoint, left);
SVG_VERBOSE(" segment :" << leftPoint << " -> " << left);
addSegment(right1, rightPoint);
SVG_VERBOSE(" segment :" << right1 << " -> " << rightPoint);
if (_join == esvg::join_bevel) {
addSegment(right2, right1);
SVG_VERBOSE(" segment :" << right2 << " -> " << right1);
} else {
}
leftPoint = left;
rightPoint = right2;
}
/*
vec2 left = getIntersect(leftPoint, it.m_pos-it.m_posPrevious, it.m_pos, it.m_miterAxe);
vec2 right = getIntersect(rightPoint, it.m_pos-it.m_posPrevious, it.m_pos, it.m_miterAxe);
vec2 left2 = getIntersect(leftPoint, it.m_pos-it.m_posPrevious, it.m_pos, it.m_miterAxe);
vec2 right2 = getIntersect(rightPoint, it.m_pos-it.m_posPrevious, it.m_pos, it.m_miterAxe);
//Draw from previous point:
addSegment(leftPoint, left);
SVG_VERBOSE(" segment :" << leftPoint << " -> " << left);
addSegment(right, rightPoint);
SVG_VERBOSE(" segment :" << right << " -> " << rightPoint);
leftPoint = left;
rightPoint = right;
*/
}
break;
}

View File

@ -24,36 +24,47 @@ TEST(TestJoin, miter) {
doc.generateAnImage(ivec2(100, 100), "TestJoin_miter.bmp", g_visualDebug);
}
TEST(TestJoin, round) {
TEST(TestJoin, roundRight) {
std::string data("<?xml version='1.0' encoding='UTF-8' standalone='no'?>"
"<svg height='100' width='100'>"
" <polyline points='20,20 50,50 20,80' stroke='green' stroke-width='20' fill='none' stroke-linejoin='round'/>"
"</svg>");
esvg::Document doc;
doc.parse(data);
etk::FSNodeWriteAllData("TestJoin_round.svg", data);
doc.generateAnImage(ivec2(100, 100), "TestJoin_round.bmp", g_visualDebug);
etk::FSNodeWriteAllData("TestJoin_roundRight.svg", data);
doc.generateAnImage(ivec2(100, 100), "TestJoin_roundRight.bmp", g_visualDebug);
}
TEST(TestJoin, bevel) {
TEST(TestJoin, roundLeft) {
std::string data("<?xml version='1.0' encoding='UTF-8' standalone='no'?>"
"<svg height='100' width='100'>"
" <polyline points='80,20 50,50 80,80' stroke='green' stroke-width='20' fill='none' stroke-linejoin='round'/>"
"</svg>");
esvg::Document doc;
doc.parse(data);
etk::FSNodeWriteAllData("TestJoin_roundLeft.svg", data);
doc.generateAnImage(ivec2(100, 100), "TestJoin_roundLeft.bmp", g_visualDebug);
}
TEST(TestJoin, bevelRight) {
std::string data("<?xml version='1.0' encoding='UTF-8' standalone='no'?>"
"<svg height='100' width='100'>"
" <polyline points='20,20 50,50 20,80' stroke='green' stroke-width='20' fill='none' stroke-linejoin='bevel'/>"
"</svg>");
esvg::Document doc;
doc.parse(data);
etk::FSNodeWriteAllData("TestJoin_bevel.svg", data);
doc.generateAnImage(ivec2(100, 100), "TestJoin_bevel.bmp", g_visualDebug);
etk::FSNodeWriteAllData("TestJoin_bevelRight.svg", data);
doc.generateAnImage(ivec2(100, 100), "TestJoin_bevelRight.bmp", g_visualDebug);
}
TEST(TestJoin, bevel2) {
TEST(TestJoin, bevelLeft) {
std::string data("<?xml version='1.0' encoding='UTF-8' standalone='no'?>"
"<svg height='100' width='100'>"
" <polyline points='80,20 60,50 80,80' stroke='green' stroke-width='20' fill='none' stroke-linejoin='bevel'/>"
"</svg>");
esvg::Document doc;
doc.parse(data);
etk::FSNodeWriteAllData("TestJoin_bevel2.svg", data);
doc.generateAnImage(ivec2(100, 100), "TestJoin_bevel2.bmp", g_visualDebug);
etk::FSNodeWriteAllData("TestJoin_bevelLeft.svg", data);
doc.generateAnImage(ivec2(100, 100), "TestJoin_bevelLeft.bmp", g_visualDebug);
}