rlottie: Update DirtyMatrix only when needed.
authorsubhransu mohanty <sub.mohanty@samsung.com>
Wed, 26 Jun 2019 01:53:44 +0000 (10:53 +0900)
committerHermet Park <hermetpark@gmail.com>
Wed, 10 Jul 2019 01:55:38 +0000 (10:55 +0900)
src/lottie/lottieitem.cpp

index 8dcdebe..9b823c5 100644 (file)
@@ -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);
     }
 }