Fix image clipping. rive-app/rive#3322
diff --git a/include/rive/drawable.hpp b/include/rive/drawable.hpp
index fc1727f..fc710ab 100644
--- a/include/rive/drawable.hpp
+++ b/include/rive/drawable.hpp
@@ -24,7 +24,7 @@
 
 	public:
 		BlendMode blendMode() const { return (BlendMode)blendModeValue(); }
-		bool clip(Renderer* renderer) const;
+		bool clip(Renderer* renderer, bool needsSave = true) const;
 		virtual void draw(Renderer* renderer) = 0;
 		void addClippingShape(ClippingShape* shape);
 		inline const std::vector<ClippingShape*>& clippingShapes() const
diff --git a/src/drawable.cpp b/src/drawable.cpp
index 02ed17b..855775f 100644
--- a/src/drawable.cpp
+++ b/src/drawable.cpp
@@ -11,14 +11,17 @@
 	m_ClippingShapes.push_back(shape);
 }
 
-bool Drawable::clip(Renderer* renderer) const
+bool Drawable::clip(Renderer* renderer, bool needsSave) const
 {
 	if (m_ClippingShapes.size() == 0)
 	{
 		return false;
 	}
 
-	renderer->save();
+	if (needsSave)
+	{
+		renderer->save();
+	}
 
 	for (auto clippingShape : m_ClippingShapes)
 	{
diff --git a/src/shapes/image.cpp b/src/shapes/image.cpp
index 9eb58e7..2877c01 100644
--- a/src/shapes/image.cpp
+++ b/src/shapes/image.cpp
@@ -14,6 +14,9 @@
 	}
 	renderer->save();
 
+	// Clip and tell it we're already saved (avoids extra save op).
+	clip(renderer, false);
+
 	auto renderImage = m_ImageAsset->renderImage();
 	auto width = renderImage->width();
 	auto height = renderImage->height();
@@ -26,6 +29,7 @@
 	renderer->transform(originTranslation);
 
 	renderer->drawImage(renderImage, blendMode(), renderOpacity());
+
 	renderer->restore();
 }