lottie/render: Added Clipper for nested composition layer. 58/196658/1
authorsubhransu mohanty <sub.mohanty@samsung.com>
Thu, 3 Jan 2019 07:41:15 +0000 (16:41 +0900)
committersubhransu mohanty <sub.mohanty@samsung.com>
Thu, 3 Jan 2019 07:43:12 +0000 (16:43 +0900)
Change-Id: Ic9a9b390863dc05a0391a3f17acc80ab912d172a

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

index c70f9c4..3a9bfbd 100644 (file)
@@ -458,6 +458,11 @@ LOTCompLayerItem::LOTCompLayerItem(LOTLayerData *layerModel)
     // 3. keep the layer in back-to-front order.
     // as lottie model keeps the data in front-toback-order.
     std::reverse(mLayers.begin(), mLayers.end());
+
+    // 4. check if its a nested composition
+    if (!layerModel->layerSize().empty()) {
+        mClipper = std::make_unique<LOTClipperItem>(layerModel->layerSize());
+    }
 }
 
 void LOTCompLayerItem::updateStaticProperty()
@@ -518,6 +523,14 @@ void LOTCompLayerItem::render(VPainter *painter, const VRle &inheritMask, const
         mask = inheritMask;
     }
 
+    if (mClipper) {
+        if (mask.empty()) {
+            mask = mClipper->rle();
+        } else {
+            mask = mClipper->rle() & mask;
+        }
+    }
+
     LOTLayerItem *matteLayer = nullptr;
     for (const auto &layer : mLayers) {
         if (!matteLayer && layer->hasMatte()) {
@@ -536,8 +549,35 @@ void LOTCompLayerItem::render(VPainter *painter, const VRle &inheritMask, const
     }
 }
 
+void LOTClipperItem::update(const VMatrix &matrix)
+{
+    mPath.reset();
+    mPath.addRect(VRectF(0,0, mSize.width(), mSize.height()));
+    mPath.transform(matrix);
+
+    VPath tmp = mPath;
+
+    if (!mRleFuture) mRleFuture = std::make_shared<VSharedState<VRle>>();
+
+    mRleFuture->reuse();
+    VRaster::generateFillInfo(mRleFuture, std::move(tmp), std::move(mRle));
+    mRle = VRle();
+}
+
+VRle LOTClipperItem::rle()
+{
+    if (mRleFuture && mRleFuture->valid()) {
+        mRle = mRleFuture->get();
+    }
+    return mRle;
+}
+
 void LOTCompLayerItem::updateContent()
 {
+    if (mClipper && flag().testFlag(DirtyFlagBit::Matrix)) {
+        mClipper->update(combinedMatrix());
+    }
+
     for (const auto &layer : mLayers) {
         layer->update( mLayerData->timeRemap(frameNo()) - mLayerData->startFrame(),
                        combinedMatrix(), combinedAlpha());
index cb6f0bf..47c816c 100644 (file)
@@ -71,6 +71,19 @@ private:
 
 class LOTLayerMaskItem;
 
+class LOTClipperItem
+{
+public:
+    LOTClipperItem(VSize size): mSize(size){}
+    void update(const VMatrix &matrix);
+    VRle rle();
+public:
+    VSize                    mSize;
+    VPath                    mPath;
+    RleShare                 mRleFuture;
+    VRle                     mRle;
+};
+
 typedef vFlag<DirtyFlagBit> DirtyFlag;
 class LOTLayerItem
 {
@@ -127,6 +140,7 @@ protected:
 private:
    std::vector<LOTLayerNode *>                  mLayersCNode;
    std::vector<std::unique_ptr<LOTLayerItem>>   mLayers;
+   std::unique_ptr<LOTClipperItem>              mClipper;
 };
 
 class LOTSolidLayerItem: public LOTLayerItem