To improve performance, offscreen rendering is performed only when there are multiple... 01/314601/2 accepted/tizen/8.0/unified/20240729.125322
authorjoogab.yun <joogab.yun@samsung.com>
Mon, 15 Jul 2024 01:11:58 +0000 (10:11 +0900)
committerjoogab.yun <joogab.yun@samsung.com>
Tue, 16 Jul 2024 05:13:28 +0000 (14:13 +0900)
Change-Id: I760ee09b81ae38a67f6cd7333f4703480d26991f

src/lottie/lottieitem.cpp
src/lottie/lottieitem.h

index 7c7694e7ffe8a55eca1e80bf9ba2a0e80ddf8b79..d7b707840ee71a7ab5cbf1eb88836071023563b2 100644 (file)
@@ -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);
+        }
     }
 }
 
index d3ffb7acbd31638d67c75afeefa6077c6feb1ed4..a1c6a1a4d4e937e3d8db03b17525eda4e3a97296 100644 (file)
@@ -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<VDrawable *> mDrawableList;
     Group *                  mRoot{nullptr};
+    bool                     mComplexShpae{false};
 };
 
 class NullLayer final : public Layer {