render: fix issue with mask opacity handling
authorSubhransu Mohanty <sub.mohanty@samsung.com>
Tue, 18 Aug 2020 04:10:40 +0000 (13:10 +0900)
committerJongmin Lee <jm105.lee@samsung.com>
Sun, 23 Aug 2020 21:11:23 +0000 (06:11 +0900)
src/lottie/lottieitem.cpp

index 4f93794..5fdf28b 100644 (file)
@@ -173,32 +173,38 @@ bool renderer::Composition::render(const rlottie::Surface &surface)
 void renderer::Mask::update(int frameNo, const VMatrix &parentMatrix,
                             float /*parentAlpha*/, const DirtyFlag &flag)
 {
+    bool dirtyPath = false;
+
     if (flag.testFlag(DirtyFlagBit::None) && mData->isStatic()) return;
 
     if (mData->mShape.isStatic()) {
         if (mLocalPath.empty()) {
+            dirtyPath = true;
             mData->mShape.value(frameNo, mLocalPath);
         }
     } else {
+        dirtyPath = true;
         mData->mShape.value(frameNo, mLocalPath);
     }
     /* mask item dosen't inherit opacity */
     mCombinedAlpha = mData->opacity(frameNo);
 
-    mFinalPath.clone(mLocalPath);
-    mFinalPath.transform(parentMatrix);
-
-    mRasterRequest = true;
+    if ( flag.testFlag(DirtyFlagBit::Matrix) || dirtyPath ) {
+        mFinalPath.clone(mLocalPath);
+        mFinalPath.transform(parentMatrix);
+        mRasterRequest = true;
+    }
 }
 
 VRle renderer::Mask::rle()
 {
-    if (mRasterRequest) {
-        mRasterRequest = false;
-        if (!vCompare(mCombinedAlpha, 1.0f))
-            mRasterizer.rle() *= uchar(mCombinedAlpha * 255);
+    if (!vCompare(mCombinedAlpha, 1.0f)) {
+        VRle obj = mRasterizer.rle();
+        obj *= uchar(mCombinedAlpha * 255);
+        return obj;
+    } else {
+        return mRasterizer.rle();
     }
-    return mRasterizer.rle();
 }
 
 void renderer::Mask::preprocess(const VRect &clip)