From 20910257baa5d8f3e9dac6df5df07efbf49e6932 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Tue, 4 Dec 2018 16:34:03 +0900 Subject: [PATCH] lottie: Add Mask information to the layer node. Change-Id: I312e178d10747f29b6a6cbde9862edf5541a6c53 --- src/lottie/lottieitem.cpp | 42 ++++++++++++++++++++++++++++++++++++++---- src/lottie/lottieitem.h | 2 ++ 2 files changed, 40 insertions(+), 4 deletions(-) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index 31ddb30..2494d36 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -151,10 +151,13 @@ void LOTMaskItem::update(int frameNo, const VMatrix &parentMatrix, opacity = opacity * parentAlpha; mCombinedAlpha = opacity; - VPath path = mLocalPath; - path.transform(parentMatrix); + mFinalPath.reset(); + mFinalPath.addPath(mLocalPath); + mFinalPath.transform(parentMatrix); - mRleTask = VRaster::generateFillInfo(std::move(path), std::move(mRle)); + VPath tmp = mFinalPath; + + mRleTask = VRaster::generateFillInfo(std::move(tmp), std::move(mRle)); mRle = VRle(); } @@ -204,7 +207,38 @@ void LOTLayerItem::buildLayerNode() } } if (hasMask()) { - //TODO populate mask property + mMasksCNode.clear(); + for (const auto &mask : mMasks) { + LOTMask cNode; + const std::vector &elm = mask->mFinalPath.elements(); + const std::vector & pts = mask->mFinalPath.points(); + const float *ptPtr = reinterpret_cast(pts.data()); + const char * elmPtr = reinterpret_cast(elm.data()); + cNode.mPath.ptPtr = ptPtr; + cNode.mPath.ptCount = pts.size(); + cNode.mPath.elmPtr = elmPtr; + cNode.mPath.elmCount = elm.size(); + switch (mask->maskMode()) { + case LOTMaskData::Mode::Add: + cNode.mMode = MaskModeAdd; + break; + case LOTMaskData::Mode::Substarct: + cNode.mMode = MaskModeSubstract; + break; + case LOTMaskData::Mode::Intersect: + cNode.mMode = MaskModeIntersect; + break; + case LOTMaskData::Mode::Difference: + cNode.mMode = MaskModeDifference; + break; + default: + cNode.mMode = MaskModeAdd; + break; + } + mMasksCNode.push_back(std::move(cNode)); + } + mLayerCNode->mMaskList.ptr = mMasksCNode.data(); + mLayerCNode->mMaskList.size = mMasksCNode.size(); } } diff --git a/src/lottie/lottieitem.h b/src/lottie/lottieitem.h index 0251460..695ac45 100644 --- a/src/lottie/lottieitem.h +++ b/src/lottie/lottieitem.h @@ -84,6 +84,7 @@ protected: VRle maskRle(const VRect &clipRect); bool hasMask() const {return !mMasks.empty();} protected: + std::vector mMasksCNode; std::unique_ptr mLayerCNode; std::vector mDrawableList; std::vector> mMasks; @@ -161,6 +162,7 @@ public: float mCombinedAlpha; VMatrix mCombinedMatrix; VPath mLocalPath; + VPath mFinalPath; std::future mRleTask; VRle mRle; }; -- 2.7.4