From 2da6e9ee6ffde8583c838aa413d85b2579a8fa4e Mon Sep 17 00:00:00 2001 From: Edouard DUPIN Date: Mon, 23 Nov 2015 23:03:11 +0100 Subject: [PATCH] [DEBUG] correct the rounded corner of rectangle --- esvg/Rectangle.cpp | 31 ++++++++++++++++++++++++++----- esvg/render/Path.cpp | 6 +++--- 2 files changed, 29 insertions(+), 8 deletions(-) diff --git a/esvg/Rectangle.cpp b/esvg/Rectangle.cpp index fe21317..cbdd538 100644 --- a/esvg/Rectangle.cpp +++ b/esvg/Rectangle.cpp @@ -60,13 +60,34 @@ void esvg::Rectangle::display(int32_t _spacing) { void esvg::Rectangle::draw(esvg::Renderer& _myRenderer, mat2& _basicTrans, int32_t _level) { SVG_VERBOSE(spacingDist(_level) << "DRAW esvg::Rectangle : fill=" << m_paint.fill << " stroke=" << m_paint.stroke); - // TODO : rounded corner ... esvg::render::Path listElement; listElement.clear(); - listElement.moveTo(false, m_position); - listElement.lineToH(true, m_size.x()); - listElement.lineToV(true, m_size.y()); - listElement.lineToH(true, -m_size.x()); + if ( m_roundedCorner.x() == 0.0f + || m_roundedCorner.y() == 0.0f) { + listElement.moveTo(false, m_position); + listElement.lineToH(true, m_size.x()); + listElement.lineToV(true, m_size.y()); + listElement.lineToH(true, -m_size.x()); + } else { + // Rounded rectangle + listElement.moveTo(false, m_position + vec2(m_roundedCorner.x(), 0.0f)); + listElement.lineToH(true, m_size.x()-m_roundedCorner.x()*2.0f); + listElement.curveTo(true, vec2(m_roundedCorner.x()*esvg::kappa90, 0.0f), + vec2(m_roundedCorner.x(), m_roundedCorner.y() * (1.0f - esvg::kappa90)), + vec2(m_roundedCorner.x(), m_roundedCorner.y()) ); + listElement.lineToV(true, m_size.y()-m_roundedCorner.y()*2.0f); + listElement.curveTo(true, vec2(0.0f, m_roundedCorner.y() * esvg::kappa90), + vec2(-m_roundedCorner.x()* (1.0f - esvg::kappa90), m_roundedCorner.y()), + vec2(-m_roundedCorner.x(), m_roundedCorner.y()) ); + listElement.lineToH(true, -(m_size.x()-m_roundedCorner.x()*2.0f)); + listElement.curveTo(true, vec2(-m_roundedCorner.x()*esvg::kappa90, 0.0f), + vec2(-m_roundedCorner.x(), -m_roundedCorner.y() * (1.0f - esvg::kappa90)), + vec2(-m_roundedCorner.x(), -m_roundedCorner.y()) ); + listElement.lineToV(true, -(m_size.y()-m_roundedCorner.y()*2.0f)); + listElement.curveTo(true, vec2(0.0f, -m_roundedCorner.y() * esvg::kappa90), + vec2(m_roundedCorner.x()* (1.0f - esvg::kappa90), -m_roundedCorner.y()), + vec2(m_roundedCorner.x(), -m_roundedCorner.y()) ); + } listElement.close(); mat2 mtx = m_transformMatrix; diff --git a/esvg/render/Path.cpp b/esvg/render/Path.cpp index d619971..f228c5f 100644 --- a/esvg/render/Path.cpp +++ b/esvg/render/Path.cpp @@ -216,9 +216,9 @@ esvg::render::PointList esvg::render::Path::generateListPoints(int32_t _level, i if (it->getRelative() == false) { lastPosition = vec2(0.0f, 0.0f); } - vec2 pos1 = lastPosition + it->getPos1();; - vec2 pos2 = lastPosition + it->getPos2();; - vec2 pos = lastPosition + it->getPos();; + vec2 pos1 = lastPosition + it->getPos1(); + vec2 pos2 = lastPosition + it->getPos2(); + vec2 pos = lastPosition + it->getPos(); interpolateCubicBezier(tmpListPoint, _recurtionMax, _threshold,