Sharable utilities for runtime Move common subclass of RenderBuffer (just cpu memory) into shareable location - used by both Skia and CoreGraphics factories Diffs= be8594d42 Sharable utilities for runtime
diff --git a/.rive_head b/.rive_head index be0bf2a..d7961db 100644 --- a/.rive_head +++ b/.rive_head
@@ -1 +1 @@ -ec44ae50d2c31782b8e3713033f94adc85625d90 +be8594d42c6084c10ac5e9bac3a2f33a31e7b27a
diff --git a/include/utils/factory_utils.hpp b/include/utils/factory_utils.hpp new file mode 100644 index 0000000..dd19172 --- /dev/null +++ b/include/utils/factory_utils.hpp
@@ -0,0 +1,51 @@ +/* + * Copyright 2022 Rive + */ + +#ifndef _RIVE_FACTORY_UTILS_HPP_ +#define _RIVE_FACTORY_UTILS_HPP_ + +#include "rive/factory.hpp" + +namespace rive { + + // Generic subclass of RenderBuffer that just stores the data on the cpu. + // + class DataRenderBuffer : public RenderBuffer { + const size_t m_elemSize; + std::vector<uint32_t> m_storage; // store 32bits for alignment + + public: + DataRenderBuffer(const void* src, size_t count, size_t elemSize) : + RenderBuffer(count), m_elemSize(elemSize) { + const size_t bytes = count * elemSize; + m_storage.resize((bytes + 3) >> 2); // round up to next 32bit count + memcpy(m_storage.data(), src, bytes); + } + + const float* f32s() const { + assert(m_elemSize == sizeof(float)); + return reinterpret_cast<const float*>(m_storage.data()); + } + + const uint16_t* u16s() const { + assert(m_elemSize == sizeof(uint16_t)); + return reinterpret_cast<const uint16_t*>(m_storage.data()); + } + + const Vec2D* vecs() const { return reinterpret_cast<const Vec2D*>(this->f32s()); } + + size_t elemSize() const { return m_elemSize; } + + static const DataRenderBuffer* Cast(const RenderBuffer* buffer) { + return static_cast<const DataRenderBuffer*>(buffer); + } + + template <typename T> static rcp<RenderBuffer> Make(Span<T> span) { + return rcp<RenderBuffer>(new DataRenderBuffer(span.data(), span.size(), sizeof(T))); + } + }; + +} // namespace rive + +#endif
diff --git a/skia/renderer/src/cg_factory.cpp b/skia/renderer/src/cg_factory.cpp index c4d25bb..e8db79b 100644 --- a/skia/renderer/src/cg_factory.cpp +++ b/skia/renderer/src/cg_factory.cpp
@@ -17,6 +17,7 @@ #include <ImageIO/ImageIO.h> #endif +#include "utils/factory_utils.hpp" #include "rive/math/vec2d.hpp" #include "rive/shapes/paint/color.hpp" @@ -269,42 +270,6 @@ } }; -// todo: move this to common place -class DataRenderBuffer : public RenderBuffer { - const size_t m_elemSize; - std::vector<uint32_t> m_storage; // store 32bits for alignment - -public: - DataRenderBuffer(const void* src, size_t count, size_t elemSize) : - RenderBuffer(count), m_elemSize(elemSize) { - const size_t bytes = count * elemSize; - m_storage.resize((bytes + 3) >> 2); // round up to next 32bit count - memcpy(m_storage.data(), src, bytes); - } - - const float* f32s() const { - assert(m_elemSize == sizeof(float)); - return reinterpret_cast<const float*>(m_storage.data()); - } - - const uint16_t* u16s() const { - assert(m_elemSize == sizeof(uint16_t)); - return reinterpret_cast<const uint16_t*>(m_storage.data()); - } - - const Vec2D* vecs() const { return reinterpret_cast<const Vec2D*>(this->f32s()); } - - size_t elemSize() const { return m_elemSize; } - - static const DataRenderBuffer* Cast(const RenderBuffer* buffer) { - return static_cast<const DataRenderBuffer*>(buffer); - } -}; - -template <typename T> rcp<RenderBuffer> make_buffer(Span<T> span) { - return rcp<RenderBuffer>(new DataRenderBuffer(span.data(), span.size(), sizeof(T))); -} - ////////////////////////////////////////////////////////////////////////// CGRenderer::CGRenderer(CGContextRef ctx, int width, int height) : m_ctx(ctx) { @@ -420,11 +385,17 @@ // Factory -rcp<RenderBuffer> CGFactory::makeBufferU16(Span<const uint16_t> data) { return make_buffer(data); } +rcp<RenderBuffer> CGFactory::makeBufferU16(Span<const uint16_t> data) { + return DataRenderBuffer::Make(data); +} -rcp<RenderBuffer> CGFactory::makeBufferU32(Span<const uint32_t> data) { return make_buffer(data); } +rcp<RenderBuffer> CGFactory::makeBufferU32(Span<const uint32_t> data) { + return DataRenderBuffer::Make(data); +} -rcp<RenderBuffer> CGFactory::makeBufferF32(Span<const float> data) { return make_buffer(data); } +rcp<RenderBuffer> CGFactory::makeBufferF32(Span<const float> data) { + return DataRenderBuffer::Make(data); +} rcp<RenderShader> CGFactory::makeLinearGradient(float sx, float sy,
diff --git a/skia/renderer/src/skia_factory.cpp b/skia/renderer/src/skia_factory.cpp index 086a28d..72cff4a 100644 --- a/skia/renderer/src/skia_factory.cpp +++ b/skia/renderer/src/skia_factory.cpp
@@ -17,6 +17,7 @@ #include "rive/math/vec2d.hpp" #include "rive/shapes/paint/color.hpp" +#include "utils/factory_utils.hpp" using namespace rive; @@ -69,41 +70,6 @@ sk_sp<SkImage> skImage() const { return m_SkImage; } }; -class SkiaBuffer : public RenderBuffer { - const size_t m_ElemSize; - void* m_Buffer; - -public: - SkiaBuffer(const void* src, size_t count, size_t elemSize) : - RenderBuffer(count), m_ElemSize(elemSize) { - size_t bytes = count * elemSize; - m_Buffer = malloc(bytes); - memcpy(m_Buffer, src, bytes); - } - - ~SkiaBuffer() override { free(m_Buffer); } - - const float* f32s() const { - assert(m_ElemSize == sizeof(float)); - return static_cast<const float*>(m_Buffer); - } - - const uint16_t* u16s() const { - 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(Span<T> span) { - return rcp<RenderBuffer>(new SkiaBuffer(span.data(), span.size(), sizeof(T))); -} - class SkiaRenderShader : public RenderShader { public: SkiaRenderShader(sk_sp<SkShader> sh) : shader(std::move(sh)) {} @@ -189,7 +155,7 @@ SkMatrix scaleM; - const SkPoint* uvs = SkiaBuffer::Cast(uvCoords.get())->points(); + auto uvs = (const SkPoint*)DataRenderBuffer::Cast(uvCoords.get())->vecs(); #ifdef SKIA_BUG_13047 // The local matrix is ignored for drawVertices, so we have to manually scale @@ -220,11 +186,11 @@ // clang-format off auto vt = SkVertices::MakeCopy(vertexMode, vertexCount, - SkiaBuffer::Cast(vertices.get())->points(), + (const SkPoint*)DataRenderBuffer::Cast(vertices.get())->vecs(), uvs, no_colors, indices->count(), - SkiaBuffer::Cast(indices.get())->u16s()); + DataRenderBuffer::Cast(indices.get())->u16s()); // clang-format on // The blend mode is ignored if we don't have colors && uvs @@ -239,14 +205,16 @@ // Factory rcp<RenderBuffer> SkiaFactory::makeBufferU16(Span<const uint16_t> data) { - return make_buffer(data); + return DataRenderBuffer::Make(data); } rcp<RenderBuffer> SkiaFactory::makeBufferU32(Span<const uint32_t> data) { - return make_buffer(data); + return DataRenderBuffer::Make(data); } -rcp<RenderBuffer> SkiaFactory::makeBufferF32(Span<const float> data) { return make_buffer(data); } +rcp<RenderBuffer> SkiaFactory::makeBufferF32(Span<const float> data) { + return DataRenderBuffer::Make(data); +} rcp<RenderShader> SkiaFactory::makeLinearGradient(float sx, float sy,
diff --git a/viewer/src/skia/skia_host.cpp b/viewer/src/skia/skia_host.cpp index 71abe50..fe433bb 100644 --- a/viewer/src/skia/skia_host.cpp +++ b/viewer/src/skia/skia_host.cpp
@@ -27,7 +27,7 @@ void skiaPresentSurface(sk_sp<SkSurface> surface); // Experimental flag, until we complete coregraphics_host -#define TEST_CG_RENDERER +//#define TEST_CG_RENDERER #ifdef TEST_CG_RENDERER #include "cg_factory.hpp"