From: subhransu mohanty Date: Thu, 3 Jan 2019 07:41:15 +0000 (+0900) Subject: lottie/render: Added Clipper for nested composition layer. X-Git-Tag: accepted/tizen/unified/20190111.055210~6 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=1787aaf4abdabd23730e4c8519ccb95a85cc25e2;p=platform%2Fcore%2Fuifw%2Flottie-player.git lottie/render: Added Clipper for nested composition layer. Change-Id: Ic9a9b390863dc05a0391a3f17acc80ab912d172a --- diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index c70f9c4..3a9bfbd 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -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(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>(); + + 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()); diff --git a/src/lottie/lottieitem.h b/src/lottie/lottieitem.h index cb6f0bf..47c816c 100644 --- a/src/lottie/lottieitem.h +++ b/src/lottie/lottieitem.h @@ -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 DirtyFlag; class LOTLayerItem { @@ -127,6 +140,7 @@ protected: private: std::vector mLayersCNode; std::vector> mLayers; + std::unique_ptr mClipper; }; class LOTSolidLayerItem: public LOTLayerItem