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"