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();
}