From 7697e4c2639ed9cb6f064d36e792e258baaa3776 Mon Sep 17 00:00:00 2001 From: Taehyub Kim Date: Mon, 15 Mar 2021 16:48:13 +0900 Subject: [PATCH] renderer: Implements Skeletone Codes for Gradient --- src/renderer/include/thorvg_renderer.hpp | 46 +++++++++++++++++++++++++++++++- src/renderer/src/thorvg_renderer.cpp | 38 +++++++++++++++++++++++--- 2 files changed, 80 insertions(+), 4 deletions(-) diff --git a/src/renderer/include/thorvg_renderer.hpp b/src/renderer/include/thorvg_renderer.hpp index 3b153ac..7709a4e 100644 --- a/src/renderer/include/thorvg_renderer.hpp +++ b/src/renderer/include/thorvg_renderer.hpp @@ -42,14 +42,58 @@ namespace rive virtual void close() override; }; + struct GradientStop + { + unsigned int color; + float stop; + GradientStop(unsigned int color, float stop) : color(color), stop(stop) + { + } + }; + + class TvgGradientBuilder + { + public: + std::vector stops; + float sx, sy, ex, ey; + virtual ~TvgGradientBuilder() {} + TvgGradientBuilder(float sx, float sy, float ex, float ey) : + sx(sx), sy(sy), ex(ex), ey(ey) + { + } + + virtual void make(TvgPaint* paint) = 0; + }; + + class TvgRadialGradientBuilder : public TvgGradientBuilder + { + public: + TvgRadialGradientBuilder(float sx, float sy, float ex, float ey) : + TvgGradientBuilder(sx, sy, ex, ey) + { + } + void make(TvgPaint* paint) override; + }; + + class TvgLinearGradientBuilder : public TvgGradientBuilder + { + public: + TvgLinearGradientBuilder(float sx, float sy, float ex, float ey) : + TvgGradientBuilder(sx, sy, ex, ey) + { + } + void make(TvgPaint* paint) override; + }; + class TvgRenderPaint : public RenderPaint { private: TvgPaint m_Paint; + TvgGradientBuilder* m_GradientBuilder; public: - TvgRenderPaint(); TvgPaint* paint() { return &m_Paint; } + TvgRenderPaint(); void style(RenderPaintStyle style) override; void color(unsigned int value) override; void thickness(float value) override; diff --git a/src/renderer/src/thorvg_renderer.cpp b/src/renderer/src/thorvg_renderer.cpp index 9cf0484..03ea5fb 100644 --- a/src/renderer/src/thorvg_renderer.cpp +++ b/src/renderer/src/thorvg_renderer.cpp @@ -225,22 +225,54 @@ void TvgRenderPaint::cap(StrokeCap value) } } -void TvgRenderPaint::linearGradient(float sx, float sy, float ex, float ey) +void TvgRadialGradientBuilder::make(TvgPaint* paint) { + /* Implements Tvg Radial Gradient Here*/ + int numStops = stops.size(); + if (numStops != 0) + { + unsigned int value = stops[0].color; + paint->color[0] = value >> 16 & 255; + paint->color[1] = value >> 8 & 255; + paint->color[2] = value >> 0 & 255; + paint->color[3] = value >> 24 & 255; + } +} + +void TvgLinearGradientBuilder::make(TvgPaint* paint) +{ + /* Implements Tvg Linear Gradient Here*/ + int numStops = stops.size(); + + if (numStops != 0) + { + unsigned int value = stops[0].color; + paint->color[0] = value >> 16 & 255; + paint->color[1] = value >> 8 & 255; + paint->color[2] = value >> 0 & 255; + paint->color[3] = value >> 24 & 255; + } +} +void TvgRenderPaint::linearGradient(float sx, float sy, float ex, float ey) +{ + m_GradientBuilder = new TvgLinearGradientBuilder(sx, sy, ex, ey); } void TvgRenderPaint::radialGradient(float sx, float sy, float ex, float ey) { + m_GradientBuilder = new TvgRadialGradientBuilder(sx, sy, ex, ey); } void TvgRenderPaint::addStop(unsigned int color, float stop) { + m_GradientBuilder->stops.emplace_back(GradientStop(color, stop)); } void TvgRenderPaint::completeGradient() { - + m_GradientBuilder->make(&m_Paint); + delete m_GradientBuilder; } void TvgRenderPaint::blendMode(BlendMode value) @@ -252,4 +284,4 @@ namespace rive { RenderPath* makeRenderPath() { return new TvgRenderPath();} RenderPaint* makeRenderPaint() { return new TvgRenderPaint();} -} \ No newline at end of file +} -- 2.7.4