1 #include "thorvg_renderer.hpp"
2 #include "math/vec2d.hpp"
3 #include "shapes/paint/color.hpp"
7 ThorvgRenderPath::ThorvgRenderPath() : m_Pushed(false)
9 this->m_Path = tvg::Shape::gen().release();
12 void ThorvgRenderPath::fillRule(FillRule value)
16 case FillRule::evenOdd:
17 m_Path->fill(tvg::FillRule::EvenOdd);
19 case FillRule::nonZero:
24 void ThorvgRenderPath::addRenderPath(RenderPath* path, const Mat2D& transform)
26 std::vector<ThorvgPathType> &m_PathType = reinterpret_cast<ThorvgRenderPath*>(path)->m_PathType;
27 std::vector<ThorvgPoint> &m_PathPoints = reinterpret_cast<ThorvgRenderPath*>(path)->m_PathPoints;
30 for (int i = 0; i < m_PathType.size(); i++)
32 ThorvgPathType type = m_PathType[i];
35 case ThorvgPathType::MoveTo:
36 m_Path->moveTo(m_PathPoints[index].x, m_PathPoints[index].y);
39 case ThorvgPathType::LineTo:
40 m_Path->lineTo(m_PathPoints[index].x, m_PathPoints[index].y);
43 case ThorvgPathType::CubicTo:
44 m_Path->cubicTo(m_PathPoints[index].x, m_PathPoints[index].y,
45 m_PathPoints[index+1].x, m_PathPoints[index+1].y,
46 m_PathPoints[index+2].x, m_PathPoints[index+2].y);
49 case ThorvgPathType::Close:
56 void ThorvgRenderPath::reset()
62 void ThorvgRenderPath::moveTo(float x, float y)
64 m_PathType.push_back(ThorvgPathType::MoveTo);
65 m_PathPoints.push_back(ThorvgPoint(x, y));
68 void ThorvgRenderPath::lineTo(float x, float y)
70 m_PathType.push_back(ThorvgPathType::LineTo);
71 m_PathPoints.push_back(ThorvgPoint(x, y));
74 void ThorvgRenderPath::cubicTo(float ox, float oy, float ix, float iy, float x, float y)
76 m_PathType.push_back(ThorvgPathType::CubicTo);
77 m_PathPoints.push_back(ThorvgPoint(ox, oy));
78 m_PathPoints.push_back(ThorvgPoint(ix, iy));
79 m_PathPoints.push_back(ThorvgPoint(x, y));
82 void ThorvgRenderPath::close()
84 m_PathType.push_back(ThorvgPathType::Close);
87 void ThorvgRenderer::save()
91 void ThorvgRenderer::restore()
95 void ThorvgRenderer::transform(const Mat2D& transform)
97 m_Transform = transform;
100 void ThorvgRenderer::drawPath(RenderPath* path, RenderPaint* paint)
102 tvg::Matrix m = {m_Transform[0], 0, m_Transform[4],
103 0, m_Transform[3], m_Transform[5],
106 ThorvgRenderPath *renderPath = reinterpret_cast<ThorvgRenderPath*>(path);
107 tvg::Shape *drawPath = reinterpret_cast<ThorvgRenderPath*>(path)->path();
108 drawPath->transform(m);
110 ThorvgPaint *drawPaint = reinterpret_cast<ThorvgRenderPaint*>(paint)->paint();
111 if (drawPaint->isFill)
112 drawPath->fill(drawPaint->fillColor[0], drawPaint->fillColor[1], drawPaint->fillColor[2], drawPaint->fillColor[3]);
113 if (drawPaint->isStroke)
115 drawPath->stroke(drawPaint->strokeColor[0], drawPaint->strokeColor[1], drawPaint->strokeColor[2], drawPaint->strokeColor[3]);
116 if (drawPaint->thickness != 0)
117 drawPath->stroke(drawPaint->thickness);
120 if (!renderPath->getPushed())
122 tvg::Result ret = m_Canvas->push(std::unique_ptr<tvg::Shape>(drawPath));
123 renderPath->setPushed(true);
127 tvg::Result ret = m_Canvas->update(drawPath);
131 void ThorvgRenderer::clipPath(RenderPath* path)
136 ThorvgRenderPaint::ThorvgRenderPaint()
141 void ThorvgRenderPaint::style(RenderPaintStyle style)
145 case RenderPaintStyle::fill:
146 m_Paint.style = RenderPaintStyle::fill;
147 m_Paint.isFill = true;
149 case RenderPaintStyle::stroke:
150 m_Paint.style = RenderPaintStyle::stroke;
151 m_Paint.isStroke = true;
155 void ThorvgRenderPaint::color(unsigned int value)
157 int b = value >> 0 & 255;
158 int g = value >> 8 & 255;
159 int r = value >> 16 & 255;
160 int a = value >> 24 & 255;
162 if (m_Paint.style == RenderPaintStyle::fill)
164 m_Paint.fillColor[0] = r;
165 m_Paint.fillColor[1] = g;
166 m_Paint.fillColor[2] = b;
167 m_Paint.fillColor[3] = a;
169 else if (m_Paint.style == RenderPaintStyle::stroke)
171 m_Paint.strokeColor[0] = r;
172 m_Paint.strokeColor[1] = g;
173 m_Paint.strokeColor[2] = b;
174 m_Paint.strokeColor[3] = a;
178 void ThorvgRenderPaint::thickness(float value)
180 m_Paint.thickness = value;
183 void ThorvgRenderPaint::join(StrokeJoin value)
188 void ThorvgRenderPaint::cap(StrokeCap value)
193 void ThorvgRenderPaint::linearGradient(float sx, float sy, float ex, float ey)
198 void ThorvgRenderPaint::radialGradient(float sx, float sy, float ex, float ey)
202 void ThorvgRenderPaint::addStop(unsigned int color, float stop)
206 void ThorvgRenderPaint::completeGradient()
211 void ThorvgRenderPaint::blendMode(BlendMode value)
218 RenderPath* makeRenderPath() { return new ThorvgRenderPath();}
219 RenderPaint* makeRenderPaint() { return new ThorvgRenderPaint();}