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