From 75f9d3ff29b3f7590f703927c60762f65afb98fc Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Wed, 26 Jun 2019 10:53:44 +0900 Subject: [PATCH] rlottie: Update DirtyMatrix only when needed. --- src/lottie/lottieitem.cpp | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index 8dcdebe274..9b823c5b8a 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -467,18 +467,20 @@ void LOTLayerItem::update(int frameNumber, const VMatrix &parentMatrix, m *= parentMatrix; // 3. update the dirty flag based on the change - if (!mCombinedMatrix.fuzzyCompare(m)) { + if (mCombinedMatrix != m) { mDirtyFlag |= DirtyFlagBit::Matrix; + mCombinedMatrix = m; } + if (!vCompare(mCombinedAlpha, alpha)) { mDirtyFlag |= DirtyFlagBit::Alpha; + mCombinedAlpha = alpha; } - mCombinedMatrix = m; - mCombinedAlpha = alpha; // 4. update the mask if (mLayerMask) { - mLayerMask->update(frameNo(), m, alpha, mDirtyFlag); + mLayerMask->update(frameNo(), mCombinedMatrix, mCombinedAlpha, + mDirtyFlag); } // 5. if no parent property change and layer is static then nothing to do. @@ -1034,28 +1036,30 @@ void LOTContentGroupItem::addChildren(LOTGroupData *data) void LOTContentGroupItem::update(int frameNo, const VMatrix &parentMatrix, float parentAlpha, const DirtyFlag &flag) { - VMatrix m = parentMatrix; float alpha = parentAlpha; DirtyFlag newFlag = flag; if (mData && mData->mTransform) { - // update the matrix and the flag - if ((flag & DirtyFlagBit::Matrix) || !mData->mTransform->isStatic()) { + VMatrix m = mData->mTransform->matrix(frameNo); + m *= parentMatrix; + + if (!(flag & DirtyFlagBit::Matrix) && !mData->mTransform->isStatic() && + (m != mMatrix)) { newFlag |= DirtyFlagBit::Matrix; } - m = mData->mTransform->matrix(frameNo); - m *= parentMatrix; - alpha *= mData->mTransform->opacity(frameNo); + mMatrix = m; + + alpha *= mData->mTransform->opacity(frameNo); if (!vCompare(alpha, parentAlpha)) { newFlag |= DirtyFlagBit::Alpha; } + } else { + mMatrix = parentMatrix; } - mMatrix = m; - for (const auto &content : mContents) { - content->update(frameNo, m, alpha, newFlag); + content->update(frameNo, matrix(), alpha, newFlag); } }