From 1c8f3aaea2ecf6d8edca20d4d3f9bb5c1ec49772 Mon Sep 17 00:00:00 2001 From: "joogab.yun" Date: Mon, 15 Jul 2024 10:11:58 +0900 Subject: [PATCH] To improve performance, offscreen rendering is performed only when there are multiple shapes. Change-Id: I760ee09b81ae38a67f6cd7333f4703480d26991f --- src/lottie/lottieitem.cpp | 32 +++++++++++++++++++++----------- src/lottie/lottieitem.h | 3 +++ 2 files changed, 24 insertions(+), 11 deletions(-) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index 7c7694e..d7b7078 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -833,11 +833,16 @@ renderer::ShapeLayer::ShapeLayer(model::Layer *layerData, list.clear(); mRoot->processTrimItems(list); } + + if (list.size() > 1) setComplexShape(true); + else setComplexShape(false); } void renderer::ShapeLayer::updateContent() { - mRoot->update(frameNo(), combinedMatrix(), 1.0f , flag()); + float alpha = combinedAlpha(); + if (isComplexShape()) alpha = 1.0f; + mRoot->update(frameNo(), combinedMatrix(), alpha , flag()); if (mLayerData->hasPathOperator()) { mRoot->applyTrim(); @@ -872,16 +877,21 @@ void renderer::ShapeLayer::render(VPainter *painter, const VRle &inheritMask, if (vCompare(combinedAlpha(), 1.0)) { Layer::render(painter, inheritMask, matteRle, cache); } else { - //do offscreen rendering - VSize size = painter->clipBoundingRect().size(); - VPainter srcPainter; - VBitmap srcBitmap = cache.make_surface(size.width(), size.height()); - srcPainter.begin(&srcBitmap); - Layer::render(&srcPainter, inheritMask, matteRle, cache); - srcPainter.end(); - painter->drawBitmap(VPoint(), srcBitmap, - uint8_t(combinedAlpha() * 255.0f)); - cache.release_surface(srcBitmap); + if (isComplexShape()) { + //do offscreen rendering + VSize size = painter->clipBoundingRect().size(); + VPainter srcPainter; + VBitmap srcBitmap = cache.make_surface(size.width(), size.height()); + srcPainter.begin(&srcBitmap); + Layer::render(&srcPainter, inheritMask, matteRle, cache); + srcPainter.end(); + painter->drawBitmap(VPoint(), srcBitmap, + uint8_t(combinedAlpha() * 255.0f)); + cache.release_surface(srcBitmap); + } + else { + Layer::render(painter, inheritMask, matteRle, cache); + } } } diff --git a/src/lottie/lottieitem.h b/src/lottie/lottieitem.h index d3ffb7a..a1c6a1a 100644 --- a/src/lottie/lottieitem.h +++ b/src/lottie/lottieitem.h @@ -322,12 +322,15 @@ public: LOTVariant &value) override; void render(VPainter *painter, const VRle &mask, const VRle &matteRle, SurfaceCache &cache) final; + void setComplexShape(bool value) { mComplexShpae = value; } + bool isComplexShape() { return mComplexShpae; } protected: void preprocessStage(const VRect &clip) final; void updateContent() final; std::vector mDrawableList; Group * mRoot{nullptr}; + bool mComplexShpae{false}; }; class NullLayer final : public Layer { -- 2.34.1