From 4ccad4aaed99d6e5bd8e306afa22e5096ee8c1e7 Mon Sep 17 00:00:00 2001 From: Edouard DUPIN Date: Tue, 24 Nov 2015 22:20:12 +0100 Subject: [PATCH] [DEV] try to implement curve path models ... (not work at all) and add test assiciated --- esvg/Path.cpp | 4 +- esvg/esvg.cpp | 2 +- esvg/render/Path.cpp | 92 +++++++++++++++++++++++++++++++++++--------- test/testPath.cpp | 59 ++++++++++++++++++++++++++++ 4 files changed, 136 insertions(+), 21 deletions(-) diff --git a/esvg/Path.cpp b/esvg/Path.cpp index 364a7eb..af29588 100644 --- a/esvg/Path.cpp +++ b/esvg/Path.cpp @@ -203,7 +203,9 @@ bool esvg::Path::parse(const std::shared_ptr& _element, mat2& _pa break; } for(int32_t iii=0; iii set 64"); sizeY = 64; } - SVG_INFO("Generate size (" << sizeX << "," << sizeY << ")"); + SVG_DEBUG("Generate size (" << sizeX << "," << sizeY << ")"); delete(m_renderedElement); m_renderedElement = nullptr; diff --git a/esvg/render/Path.cpp b/esvg/render/Path.cpp index f228c5f..d9255de 100644 --- a/esvg/render/Path.cpp +++ b/esvg/render/Path.cpp @@ -232,29 +232,83 @@ esvg::render::PointList esvg::render::Path::generateListPoints(int32_t _level, i } break; case esvg::render::path_smoothCurveTo: - /* - path.curve4SmoothTo(it->getRelative(), - vec2(it->m_element[0], - it->m_element[1]), - vec2(it->m_element[2], - it->m_element[3]) ); - */ + // If no previous point, we need to create the last point has start ... + if (tmpListPoint.size() == 0) { + tmpListPoint.push_back(esvg::render::Point(lastPosition, esvg::render::Point::type_join)); + } + { + 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; case esvg::render::path_bezierCurveTo: - /* - path.curve3To(it->getRelative(), - vec2(it->m_element[0], - it->m_element[1]), - vec2(it->m_element[2], - it->m_element[3]) ); - */ + // If no previous point, we need to create the last point has start ... + if (tmpListPoint.size() == 0) { + tmpListPoint.push_back(esvg::render::Point(lastPosition, esvg::render::Point::type_join)); + } + { + 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; case esvg::render::path_bezierSmoothCurveTo: - /* - path.curve3SmoothTo(it->getRelative(), - vec2(it->m_element[0], - it->m_element[1]) ); - */ + // If no previous point, we need to create the last point has start ... + if (tmpListPoint.size() == 0) { + tmpListPoint.push_back(esvg::render::Point(lastPosition, esvg::render::Point::type_join)); + } + { + 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; case esvg::render::path_elliptic: /* diff --git a/test/testPath.cpp b/test/testPath.cpp index 3166d26..a2319ec 100644 --- a/test/testPath.cpp +++ b/test/testPath.cpp @@ -48,3 +48,62 @@ TEST(TestPath, fill_and_stroke) { etk::FSNodeWriteAllData("TestPath_fill_and_stroke.svg", data); doc.generateAnImage(ivec2(100, 100), "TestPath_fill_and_stroke.bmp", g_visualDebug); } + +TEST(TestPath, curveTo) { + std::string data("" + "" + " " + ""); + 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("" + "" + " " + ""); + 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("" + "" + " " + ""); + 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("" + "" + " " + ""); + 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); +}