rlottie: make sure rle object shared between 2 threads always keeps refcount 1 to...
authorsubhransu mohanty <sub.mohanty@samsung.com>
Fri, 24 May 2019 07:15:18 +0000 (16:15 +0900)
committerHermet Park <hermetpark@gmail.com>
Wed, 19 Jun 2019 04:29:52 +0000 (13:29 +0900)
src/lottie/lottieitem.cpp
src/vector/vdrawable.cpp
src/vector/vraster.h

index b68b1ca..83e2cc8 100644 (file)
@@ -214,7 +214,9 @@ void LOTMaskItem::update(int frameNo, const VMatrix &parentMatrix,
 
     if (!mRleFuture) mRleFuture = std::make_shared<VSharedState<VRle>>();
 
+    if (mRleFuture->valid()) mRle = mRleFuture->get();
     mRleFuture->reuse();
+
     VRaster::generateFillInfo(mRleFuture, std::move(tmp), std::move(mRle));
     mRle = VRle();
 }
@@ -402,7 +404,11 @@ VRle LOTLayerMaskItem::maskRle(const VRect &clipRect)
         }
     }
 
-    mRle = rle;
+    if (!rle.empty() && !rle.unique()) {
+        mRle.clone(rle);
+    } else {
+        mRle = rle;
+    }
     mDirty = false;
     return mRle;
 }
@@ -702,7 +708,9 @@ void LOTClipperItem::update(const VMatrix &matrix)
 
     if (!mRleFuture) mRleFuture = std::make_shared<VSharedState<VRle>>();
 
+    if (mRleFuture->valid()) mRle = mRleFuture->get();
     mRleFuture->reuse();
+
     VRaster::generateFillInfo(mRleFuture, std::move(tmp), std::move(mRle));
     mRle = VRle();
 }
index d23dabb..575d6cd 100644 (file)
@@ -26,6 +26,7 @@ void VDrawable::preprocess(const VRect &clip)
 
         if (!mRleFuture) mRleFuture = std::make_shared<VSharedState<VRle>>();
 
+        if (mRleFuture->valid()) mRle = mRleFuture->get();
         mRleFuture->reuse();
 
         if (mStroke.enable) {
index f710c19..a858b63 100644 (file)
@@ -56,7 +56,7 @@ private:
     std::mutex               _mutex;
     std::condition_variable  _cv;
     bool                     _ready{false};
-    bool                     _valid{true};
+    bool                     _valid{false};
 };
 
 using RleShare = std::shared_ptr<VSharedState<VRle>>;