renderer: Implements Skeletone Codes for Gradient
authorTaehyub Kim <taehyub.kim@samsung.com>
Mon, 15 Mar 2021 07:48:13 +0000 (16:48 +0900)
committerHermet Park <hermetpark@gmail.com>
Mon, 15 Mar 2021 09:57:03 +0000 (18:57 +0900)
src/renderer/include/thorvg_renderer.hpp
src/renderer/src/thorvg_renderer.cpp

index 3b153ac..7709a4e 100644 (file)
@@ -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<GradientStop> 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;
index 9cf0484..03ea5fb 100644 (file)
@@ -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
+}