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;
}
}
-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)
{
RenderPath* makeRenderPath() { return new TvgRenderPath();}
RenderPaint* makeRenderPaint() { return new TvgRenderPaint();}
-}
\ No newline at end of file
+}