From: Taehyub Kim Date: Thu, 11 Mar 2021 02:24:01 +0000 (+0900) Subject: Implements stroke feature for shape pathes X-Git-Tag: submit/tizen/20210406.060732~16^2~25 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=2d16e1ecdcdf16e90df3b2729d42004c7471f355;p=platform%2Fcore%2Fuifw%2Frive-tizen.git Implements stroke feature for shape pathes --- diff --git a/example/shapes.riv b/example/shapes.riv index 091e2e4..73e0d73 100644 Binary files a/example/shapes.riv and b/example/shapes.riv differ diff --git a/src/renderer/include/thorvg_renderer.hpp b/src/renderer/include/thorvg_renderer.hpp index fbb19b4..0c14756 100644 --- a/src/renderer/include/thorvg_renderer.hpp +++ b/src/renderer/include/thorvg_renderer.hpp @@ -23,9 +23,13 @@ namespace rive struct ThorvgPaint { - int r, g, b, a; + int fillColor[4]; + int strokeColor[4]; float thickness; - ThorvgPaint() : r(0), g(0), b(0), a(0), thickness(0.0) {} + RenderPaintStyle style; + bool isFill; + bool isStroke; + ThorvgPaint() : isFill(false), isStroke(false) {} }; class ThorvgRenderPath : public RenderPath @@ -34,11 +38,13 @@ namespace rive tvg::Shape *m_Path; std::vector m_PathType; std::vector m_PathPoints; - bool pushed; + bool m_Pushed; public: ThorvgRenderPath(); tvg::Shape* path() { return m_Path; } + bool getPushed() { return m_Pushed; } + bool setPushed(bool pushed) { m_Pushed = pushed; } void reset() override; void addRenderPath(RenderPath* path, const Mat2D& transform) override; void fillRule(FillRule value) override; diff --git a/src/renderer/src/thorvg_renderer.cpp b/src/renderer/src/thorvg_renderer.cpp index a97c846..0fc8d6d 100644 --- a/src/renderer/src/thorvg_renderer.cpp +++ b/src/renderer/src/thorvg_renderer.cpp @@ -4,7 +4,7 @@ using namespace rive; -ThorvgRenderPath::ThorvgRenderPath() : pushed(false) +ThorvgRenderPath::ThorvgRenderPath() : m_Pushed(false) { this->m_Path = tvg::Shape::gen().release(); } @@ -103,14 +103,29 @@ void ThorvgRenderer::drawPath(RenderPath* path, RenderPaint* paint) 0, m_Transform[3], m_Transform[5], 0, 0, 1}; + ThorvgRenderPath *renderPath = reinterpret_cast(path); tvg::Shape *drawPath = reinterpret_cast(path)->path(); - drawPath->transform(m); + drawPath->transform(m); ThorvgPaint *drawPaint = reinterpret_cast(paint)->paint(); - drawPath->fill(drawPaint->r, drawPaint->g, drawPaint->b, drawPaint->a); - drawPath->stroke(drawPaint->thickness); + if (drawPaint->isFill) + drawPath->fill(drawPaint->fillColor[0], drawPaint->fillColor[1], drawPaint->fillColor[2], drawPaint->fillColor[3]); + if (drawPaint->isStroke) + { + drawPath->stroke(drawPaint->strokeColor[0], drawPaint->strokeColor[1], drawPaint->strokeColor[2], drawPaint->strokeColor[3]); + if (drawPaint->thickness != 0) + drawPath->stroke(drawPaint->thickness); + } - m_Canvas->push(std::unique_ptr(drawPath)); + if (!renderPath->getPushed()) + { + tvg::Result ret = m_Canvas->push(std::unique_ptr(drawPath)); + renderPath->setPushed(true); + } + else + { + tvg::Result ret = m_Canvas->update(drawPath); + } } void ThorvgRenderer::clipPath(RenderPath* path) @@ -128,17 +143,36 @@ void ThorvgRenderPaint::style(RenderPaintStyle style) switch (style) { case RenderPaintStyle::fill: + m_Paint.style = RenderPaintStyle::fill; + m_Paint.isFill = true; break; case RenderPaintStyle::stroke: + m_Paint.style = RenderPaintStyle::stroke; + m_Paint.isStroke = true; break; } } void ThorvgRenderPaint::color(unsigned int value) { - m_Paint.r = value >> 0 & 255; - m_Paint.g = value >> 8 & 255; - m_Paint.b = value >> 16 & 255; - m_Paint.a = value >> 24 & 255; + int b = value >> 0 & 255; + int g = value >> 8 & 255; + int r = value >> 16 & 255; + int a = value >> 24 & 255; + + if (m_Paint.style == RenderPaintStyle::fill) + { + m_Paint.fillColor[0] = r; + m_Paint.fillColor[1] = g; + m_Paint.fillColor[2] = b; + m_Paint.fillColor[3] = a; + } + else if (m_Paint.style == RenderPaintStyle::stroke) + { + m_Paint.strokeColor[0] = r; + m_Paint.strokeColor[1] = g; + m_Paint.strokeColor[2] = b; + m_Paint.strokeColor[3] = a; + } } void ThorvgRenderPaint::thickness(float value)