Updating to latest rive-cpp master.
diff --git a/build/premake5.lua b/build/premake5.lua
index a0e55fa..7ed2b6c 100644
--- a/build/premake5.lua
+++ b/build/premake5.lua
@@ -51,7 +51,7 @@
         defines {"DEBUG"}
         symbols "On"
 
-    configuration "with-low-level-rendering"
+    filter "options:with-low-level-rendering"
         defines("LOW_LEVEL_RENDERING")
         defines("CONTOUR_RECURSIVE")
 
diff --git a/include/rive/math/mat2d.hpp b/include/rive/math/mat2d.hpp
index bbb5092..2ab92cc 100644
--- a/include/rive/math/mat2d.hpp
+++ b/include/rive/math/mat2d.hpp
@@ -2,6 +2,7 @@
 #define _RIVE_MAT2D_HPP_
 
 #include <cstddef>
+#include <stdio.h>
 
 namespace rive
 {
diff --git a/renderer/library/include/low_level/low_level_renderer.hpp b/renderer/library/include/low_level/low_level_renderer.hpp
index 17682e9..a4a315c 100644
--- a/renderer/library/include/low_level/low_level_renderer.hpp
+++ b/renderer/library/include/low_level/low_level_renderer.hpp
@@ -59,6 +59,7 @@
 
 		virtual RenderPaint* makeRenderPaint() = 0;
 		virtual RenderPath* makeRenderPath() = 0;
+		virtual RenderImage* makeRenderImage() = 0;
 		virtual bool initialize(void* data) = 0;
 		bool initialize() { return initialize(nullptr); }
 
diff --git a/renderer/library/include/metal/metal_renderer.hpp b/renderer/library/include/metal/metal_renderer.hpp
index 4db6dc4..f35d846 100644
--- a/renderer/library/include/metal/metal_renderer.hpp
+++ b/renderer/library/include/metal/metal_renderer.hpp
@@ -14,6 +14,15 @@
 
 namespace rive
 {
+	class MetalRenderImage : public RenderImage
+	{
+	public:
+		bool decode(const uint8_t* bytes, std::size_t size) override
+		{
+			return true;
+		}
+	};
+
 	class MetalRenderer : public LowLevelRenderer
 	{
 	public:
@@ -24,12 +33,15 @@
 		void transform(const Mat2D& transform) override;
 		void drawPath(RenderPath* path, RenderPaint* paint) override;
 		void clipPath(RenderPath* path) override;
+		void
+		drawImage(RenderImage* image, BlendMode value, float opacity) override;
 
 		void startFrame() override;
 		void endFrame() override;
 
 		RenderPaint* makeRenderPaint() override;
 		RenderPath* makeRenderPath() override;
+		RenderImage* makeRenderImage() override;
 		bool initialize(void* data) override;
 
 		virtual id<MTLDevice> acquireDevice() = 0;
diff --git a/renderer/library/include/opengl/opengl_renderer.hpp b/renderer/library/include/opengl/opengl_renderer.hpp
index 2b779e6..02d2e68 100644
--- a/renderer/library/include/opengl/opengl_renderer.hpp
+++ b/renderer/library/include/opengl/opengl_renderer.hpp
@@ -8,6 +8,15 @@
 
 namespace rive
 {
+	class OpenGLRenderImage : public RenderImage
+	{
+	public:
+		bool decode(const uint8_t* bytes, std::size_t size) override
+		{
+			return true;
+		}
+	};
+
 	class OpenGLRenderer : public LowLevelRenderer
 	{
 	private:
@@ -38,12 +47,15 @@
 		OpenGLRenderer();
 		~OpenGLRenderer();
 		void drawPath(RenderPath* path, RenderPaint* paint) override;
+		void
+		drawImage(RenderImage* image, BlendMode value, float opacity) override;
 
 		void startFrame() override;
 		void endFrame() override;
 
 		RenderPaint* makeRenderPaint() override;
 		RenderPath* makeRenderPath() override;
+		RenderImage* makeRenderImage() override;
 
 		bool initialize(void* data) override;
 
diff --git a/renderer/library/src/graphics_api.cpp b/renderer/library/src/graphics_api.cpp
index 579af1f..cd73925 100644
--- a/renderer/library/src/graphics_api.cpp
+++ b/renderer/library/src/graphics_api.cpp
@@ -76,4 +76,10 @@
 		assert(g_GraphicsApi != nullptr);
 		return g_GraphicsApi->makeRenderPath();
 	}
+
+	RenderImage* makeRenderImage()
+	{
+		assert(g_GraphicsApi != nullptr);
+		return g_GraphicsApi->makeRenderImage();
+	}
 } // namespace rive
\ No newline at end of file
diff --git a/renderer/library/src/metal/metal_renderer.mm b/renderer/library/src/metal/metal_renderer.mm
index 18651f3..e690004 100644
--- a/renderer/library/src/metal/metal_renderer.mm
+++ b/renderer/library/src/metal/metal_renderer.mm
@@ -8,6 +8,11 @@
 void MetalRenderer::restore() {}
 void MetalRenderer::transform(const Mat2D& transform) {}
 void MetalRenderer::drawPath(RenderPath* path, RenderPaint* paint) {}
+void MetalRenderer::drawImage(RenderImage* image,
+                              BlendMode value,
+                              float opacity)
+{
+}
 void MetalRenderer::clipPath(RenderPath* path) {}
 
 void MetalRenderer::startFrame() {}
@@ -15,6 +20,7 @@
 
 RenderPaint* MetalRenderer::makeRenderPaint() { return new MetalRenderPaint(); }
 RenderPath* MetalRenderer::makeRenderPath() { return new MetalRenderPath(); }
+RenderImage* MetalRenderer::makeRenderImage() { return new MetalRenderImage(); }
 
 static const char kShaderSource[] =
     "#include <metal_stdlib>\n"
diff --git a/renderer/library/src/opengl/opengl_renderer.cpp b/renderer/library/src/opengl/opengl_renderer.cpp
index e7bfbda..98059f5 100644
--- a/renderer/library/src/opengl/opengl_renderer.cpp
+++ b/renderer/library/src/opengl/opengl_renderer.cpp
@@ -115,6 +115,13 @@
 	return true;
 }
 
+void OpenGLRenderer::drawImage(RenderImage* image,
+                               BlendMode value,
+                               float opacity)
+{
+	// TODO: implement drawImage
+}
+
 void OpenGLRenderer::drawPath(RenderPath* path, RenderPaint* paint)
 {
 	auto glPaint = static_cast<OpenGLRenderPaint*>(paint);
@@ -315,6 +322,10 @@
 	return new OpenGLRenderPaint();
 }
 RenderPath* OpenGLRenderer::makeRenderPath() { return new OpenGLRenderPath(); }
+RenderImage* OpenGLRenderer::makeRenderImage()
+{
+	return new OpenGLRenderImage();
+}
 
 void OpenGLRenderer::updateIndexBuffer(std::size_t contourLength)
 {