lottie: Make path dirty only when it has changed from last frame. 37/193837/3
authorsubhransu mohanty <sub.mohanty@samsung.com>
Tue, 27 Nov 2018 02:28:27 +0000 (11:28 +0900)
committersubhransu mohanty <sub.mohanty@samsung.com>
Tue, 27 Nov 2018 02:51:11 +0000 (11:51 +0900)
Change-Id: I827baef9bac182a25aa98479108307d03c45f5ce

src/lottie/lottieitem.h
src/lottie/lottiemodel.h

index a92dd8d..5749f38 100644 (file)
@@ -311,9 +311,20 @@ class LOTShapeItem: public LOTPathDataItem
 public:
    LOTShapeItem(LOTShapeData *data);
 private:
+   struct Cache {
+        int                     mFrameNo{-1};
+   };
+   Cache                        mCache;
    void updatePath(VPath& path, int frameNo) final;
    LOTShapeData             *mData;
-   bool hasChanged(int) final { return true; }
+   bool hasChanged(int frameNo) final {
+       int prevFrame = mCache.mFrameNo;
+       mCache.mFrameNo = frameNo;
+       if (prevFrame == -1) return true;
+       if (prevFrame == frameNo) return false;
+
+       return mData->mShape.changed(prevFrame, frameNo);
+   }
 };
 
 class LOTPolystarItem: public LOTPathDataItem
index 01ab083..da6502d 100644 (file)
@@ -226,6 +226,18 @@ public:
         return 0;
     }
 
+    bool changed(int prevFrame, int curFrame) {
+        int first = mKeyFrames.front().mStartFrame;
+        int last = mKeyFrames.back().mEndFrame;
+
+        if ((first > prevFrame  && first > curFrame) ||
+            (last < prevFrame  && last < curFrame)) {
+            return false;
+        }
+
+        return true;
+    }
+
 public:
     std::vector<LOTKeyFrame<T>>    mKeyFrames;
 };
@@ -243,6 +255,9 @@ public:
     float angle(int frameNo) const {
         return isStatic() ? 0 : mAnimInfo->angle(frameNo);
     }
+    bool changed(int prevFrame, int curFrame) {
+        return isStatic() ? false : mAnimInfo->changed(prevFrame, curFrame);
+    }
 public:
     T                                 mValue;
     int                               mPropertyIndex; /* "ix" */