Use the new hotness with is Span
diff --git a/include/rive/renderer.hpp b/include/rive/renderer.hpp
index 0053fa7..adeff88 100644
--- a/include/rive/renderer.hpp
+++ b/include/rive/renderer.hpp
@@ -5,6 +5,7 @@
 #include "rive/command_path.hpp"
 #include "rive/layout.hpp"
 #include "rive/refcnt.hpp"
+#include "rive/span.hpp"
 #include "rive/math/aabb.hpp"
 #include "rive/math/mat2d.hpp"
 #include "rive/shapes/paint/blend_mode.hpp"
@@ -26,9 +27,9 @@
         size_t count() const { return m_Count; }
     };
 
-    extern rcp<RenderBuffer> makeBufferU16(const uint16_t[], size_t count);
-    extern rcp<RenderBuffer> makeBufferU32(const uint32_t[], size_t count);
-    extern rcp<RenderBuffer> makeBufferF32(const float[], size_t count);
+    extern rcp<RenderBuffer> makeBufferU16(Span<const uint16_t>);
+    extern rcp<RenderBuffer> makeBufferU32(Span<const uint32_t>);
+    extern rcp<RenderBuffer> makeBufferF32(Span<const float>);
 
     enum class RenderPaintStyle { stroke, fill };
 
@@ -90,7 +91,7 @@
 
     public:
         virtual ~RenderImage() {}
-        virtual bool decode(const uint8_t* bytes, std::size_t size) = 0;
+        virtual bool decode(Span<const uint8_t>) = 0;
         int width() const { return m_Width; }
         int height() const { return m_Height; }
         
diff --git a/include/rive/span.hpp b/include/rive/span.hpp
index 714272e..36bfbe7 100644
--- a/include/rive/span.hpp
+++ b/include/rive/span.hpp
@@ -42,7 +42,14 @@
     constexpr T& front() const { return (*this)[0]; }
     constexpr T& back()  const { return (*this)[m_Size-1]; }
 
-    constexpr size_t totalBytes() const { return m_Size * sizeof(T); }
+    // returns byte-size of the entire span
+    constexpr size_t size_bytes() const { return m_Size * sizeof(T); }
+
+    constexpr int count() const {
+        const int n = static_cast<int>(m_Size);
+        assert(n >= 0);
+        return n;
+    }
 
     constexpr Span<T> subset(size_t offset, size_t size) const {
         assert(offset <= m_Size);
diff --git a/skia/renderer/include/skia_renderer.hpp b/skia/renderer/include/skia_renderer.hpp
index 74f78ff..d7af5f7 100644
--- a/skia/renderer/include/skia_renderer.hpp
+++ b/skia/renderer/include/skia_renderer.hpp
@@ -47,7 +47,7 @@
 
     public:
         sk_sp<SkImage> skImage() const { return m_SkImage; };
-        bool decode(const uint8_t* bytes, std::size_t size) override;
+        bool decode(Span<const uint8_t>) override;
         rcp<RenderShader> makeShader(RenderTileMode tx, RenderTileMode ty,
                                      const Mat2D* localMatrix) const override;
     };
diff --git a/skia/renderer/src/skia_renderer.cpp b/skia/renderer/src/skia_renderer.cpp
index 430a13f..7be0650 100644
--- a/skia/renderer/src/skia_renderer.cpp
+++ b/skia/renderer/src/skia_renderer.cpp
@@ -44,8 +44,8 @@
     }
 };
 
-template <typename T> rcp<RenderBuffer> make_buffer(const T src[], size_t count) {
-    return rcp<RenderBuffer>(new SkiaBuffer(src, count, sizeof(T)));
+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 {
@@ -172,9 +172,10 @@
     m_Canvas->drawVertices(vt, SkBlendMode::kModulate, paint);
 }
 
-bool SkiaRenderImage::decode(const uint8_t* bytes, std::size_t size) {
+bool SkiaRenderImage::decode(Span<const uint8_t> encodedData) {
 
-    sk_sp<SkData> data = SkData::MakeWithoutCopy(bytes, size);
+    sk_sp<SkData> data = SkData::MakeWithoutCopy(encodedData.data(),
+                                                 encodedData.size());
     m_SkImage = SkImage::MakeFromEncoded(data);
     m_Width = m_SkImage->width();
     m_Height = m_SkImage->height();
@@ -191,13 +192,13 @@
 
 namespace rive {
     rcp<RenderBuffer> makeBufferU16(const uint16_t src[], size_t count) {
-        return make_buffer<uint16_t>(src, count);
+        return make_buffer(Span{src, count});
     }
     rcp<RenderBuffer> makeBufferU32(const uint32_t src[], size_t count) {
-        return make_buffer<uint32_t>(src, count);
+        return make_buffer(Span{src, count});
     }
     rcp<RenderBuffer> makeBufferF32(const float src[], size_t count) {
-        return make_buffer<float>(src, count);
+        return make_buffer(Span{src, count});
     }
 
     RenderPath* makeRenderPath() { return new SkiaRenderPath(); }
diff --git a/src/assets/image_asset.cpp b/src/assets/image_asset.cpp
index 8433680..6988c1b 100644
--- a/src/assets/image_asset.cpp
+++ b/src/assets/image_asset.cpp
@@ -10,7 +10,7 @@
 #ifdef TESTING
     decodedByteSize = size;
 #endif
-    return m_RenderImage->decode(bytes, size);
+    return m_RenderImage->decode({bytes, size});
 }
 
-std::string ImageAsset::fileExtension() { return "png"; }
\ No newline at end of file
+std::string ImageAsset::fileExtension() { return "png"; }
diff --git a/test/no_op_renderer.hpp b/test/no_op_renderer.hpp
index 56903dd..57d23df 100644
--- a/test/no_op_renderer.hpp
+++ b/test/no_op_renderer.hpp
@@ -6,7 +6,7 @@
 namespace rive {
     class NoOpRenderImage : public RenderImage {
     public:
-        bool decode(const uint8_t* bytes, std::size_t size) override {
+        bool decode(Span<const uint8_t>) override {
             return true;
         }
         rcp<RenderShader> makeShader(RenderTileMode, RenderTileMode, const Mat2D*) const override {
diff --git a/test/span_test.cpp b/test/span_test.cpp
index 1a84ea5..b252d2a 100644
--- a/test/span_test.cpp
+++ b/test/span_test.cpp
@@ -12,7 +12,7 @@
     Span<int> span;
     REQUIRE(span.empty());
     REQUIRE(span.size() == 0);
-    REQUIRE(span.totalBytes() == 0);
+    REQUIRE(span.size_bytes() == 0);
     REQUIRE(span.begin() == span.end());
 
     int array[] = { 0, 1, 2, 3, 4, 5, 6,7 ,8, 9 };
@@ -21,7 +21,7 @@
     REQUIRE(!span.empty());
     REQUIRE(span.data() == array);
     REQUIRE(span.size() == 4);
-    REQUIRE(span.totalBytes() == 4 * sizeof(int));
+    REQUIRE(span.size_bytes() == 4 * sizeof(int));
     REQUIRE(span.begin() + span.size() == span.end());
     
     int counter = 0;