update skia renderer
diff --git a/include/rive/renderer.hpp b/include/rive/renderer.hpp
index dcd3b83..0053fa7 100644
--- a/include/rive/renderer.hpp
+++ b/include/rive/renderer.hpp
@@ -117,7 +117,7 @@
virtual void transform(const Mat2D& transform) = 0;
virtual void drawPath(RenderPath* path, RenderPaint* paint) = 0;
virtual void clipPath(RenderPath* path) = 0;
- virtual void drawImage(RenderImage*, BlendMode, float opacity) = 0;
+ virtual void drawImage(const RenderImage*, BlendMode, float opacity) = 0;
virtual void drawImageMesh(const RenderImage*,
rcp<RenderBuffer> vertices_f32,
rcp<RenderBuffer> uvCoords_f32,
diff --git a/skia/renderer/include/skia_renderer.hpp b/skia/renderer/include/skia_renderer.hpp
index f28dfa7..74f78ff 100644
--- a/skia/renderer/include/skia_renderer.hpp
+++ b/skia/renderer/include/skia_renderer.hpp
@@ -63,8 +63,13 @@
void transform(const Mat2D& transform) override;
void clipPath(RenderPath* path) override;
void drawPath(RenderPath* path, RenderPaint* paint) override;
- void drawImage(RenderImage*, BlendMode, float opacity) override;
- void drawMesh(const RenderMesh*, const RenderShader*, BlendMode, float opacity) override;
+ void drawImage(const RenderImage*, BlendMode, float opacity) override;
+ void drawImageMesh(const RenderImage*,
+ rcp<RenderBuffer> vertices_f32,
+ rcp<RenderBuffer> uvCoords_f32,
+ rcp<RenderBuffer> indices_u16,
+ BlendMode,
+ float opacity) override;
};
} // namespace rive
#endif
diff --git a/skia/renderer/src/skia_renderer.cpp b/skia/renderer/src/skia_renderer.cpp
index 6cafdc4..430a13f 100644
--- a/skia/renderer/src/skia_renderer.cpp
+++ b/skia/renderer/src/skia_renderer.cpp
@@ -25,7 +25,7 @@
free(m_Buffer);
}
- const float* f32s() {
+ const float* f32s() const {
assert(m_ElemSize == sizeof(float));
return static_cast<const float*>(m_Buffer);
}
@@ -34,6 +34,14 @@
assert(m_ElemSize == sizeof(uint16_t));
return static_cast<const uint16_t*>(m_Buffer);
}
+
+ const SkPoint* points() const {
+ return reinterpret_cast<const SkPoint*>(this->f32s());
+ }
+
+ static const SkiaBuffer* Cast(const RenderBuffer* buffer) {
+ return reinterpret_cast<const SkiaBuffer*>(buffer);
+ }
};
template <typename T> rcp<RenderBuffer> make_buffer(const T src[], size_t count) {
@@ -47,13 +55,6 @@
sk_sp<SkShader> shader;
};
-class SkiaRenderMesh : public RenderMesh {
-public:
- SkiaRenderMesh(sk_sp<SkVertices> vt) : vertices(std::move(vt)) {}
-
- sk_sp<SkVertices> vertices;
-};
-
void SkiaRenderPath::fillRule(FillRule value) {
switch (value) {
case FillRule::evenOdd:
@@ -123,31 +124,52 @@
m_Canvas->clipPath(reinterpret_cast<SkiaRenderPath*>(path)->path(), true);
}
-void SkiaRenderer::drawImage(RenderImage* image,
+void SkiaRenderer::drawImage(const RenderImage* image,
BlendMode blendMode,
float opacity) {
SkPaint paint;
paint.setAlphaf(opacity);
paint.setBlendMode(ToSkia::convert(blendMode));
- auto skiaImage = reinterpret_cast<SkiaRenderImage*>(image);
- SkSamplingOptions samplingOptions(SkFilterMode::kLinear,
- SkMipmapMode::kNone);
- m_Canvas->drawImage(
- skiaImage->skImage(), 0.0f, 0.0f, samplingOptions, &paint);
+ auto skiaImage = reinterpret_cast<const SkiaRenderImage*>(image);
+ SkSamplingOptions sampling(SkFilterMode::kLinear);
+ m_Canvas->drawImage(skiaImage->skImage(), 0.0f, 0.0f, sampling, &paint);
}
-void SkiaRenderer::drawMesh(const RenderMesh* mesh,
- const RenderShader* shader,
- BlendMode mode,
- float opacity) {
- auto skmesh = reinterpret_cast<const SkiaRenderMesh*>(mesh);
- auto skshader = reinterpret_cast<const SkiaRenderShader*>(shader);
+void SkiaRenderer::drawImageMesh(const RenderImage* image,
+ rcp<RenderBuffer> vertices,
+ rcp<RenderBuffer> uvCoords,
+ rcp<RenderBuffer> indices,
+ BlendMode blendMode,
+ float opacity) {
+ // need our vertices and uvs to agree
+ assert(vertices->count() == uvCoords->count());
+ // vertices and uvs are arrays of floats, so we need their counts to be even,
+ // since we treat them as arrays of points
+ assert((vertices->count() & 1) == 0);
+
+ auto skiaImage = reinterpret_cast<const SkiaRenderImage*>(image)->skImage();
+ const SkSamplingOptions sampling(SkFilterMode::kLinear);
+ auto shader = skiaImage->makeShader(SkTileMode::kClamp, SkTileMode::kClamp,
+ sampling, nullptr);
SkPaint paint;
- paint.setBlendMode(ToSkia::convert(mode));
paint.setAlphaf(opacity);
- paint.setShader(skshader->shader);
- m_Canvas->drawVertices(skmesh->vertices, SkBlendMode::kModulate, paint);
+ paint.setBlendMode(ToSkia::convert(blendMode));
+ paint.setShader(shader);
+
+ const SkColor* no_colors = nullptr;
+ auto vertexMode = SkVertices::kTriangles_VertexMode;
+ const int vertexCount = vertices->count() >> 1;
+ auto vt = SkVertices::MakeCopy(vertexMode,
+ vertexCount,
+ SkiaBuffer::Cast(vertices.get())->points(),
+ SkiaBuffer::Cast(uvCoords.get())->points(),
+ no_colors,
+ indices->count(),
+ SkiaBuffer::Cast(indices.get())->u16s());
+
+ // The blend mode is ignored if we don't have colors && uvs
+ m_Canvas->drawVertices(vt, SkBlendMode::kModulate, paint);
}
bool SkiaRenderImage::decode(const uint8_t* bytes, std::size_t size) {
@@ -216,17 +238,4 @@
0, &lm);
return rcp<RenderShader>(new SkiaRenderShader(std::move(sh)));
}
-
- rcp<RenderMesh> makeMesh(int vertexCount, const float vertices[], const float texCoords[],
- int indexCount, const uint16_t indices[])
- {
- const SkColor* colors = nullptr;
- auto mode = SkVertices::kTriangles_VertexMode;
- auto vt = SkVertices::MakeCopy(mode, vertexCount,
- (const SkPoint*)vertices,
- (const SkPoint*)texCoords,
- colors,
- indexCount, indices);
- return rcp<RenderMesh>(new SkiaRenderMesh(std::move(vt)));
- }
} // namespace rive