lottie: reuse path for reducing constructor/destructor calls from getPath()/toPath() 75/185675/3
authorYoungbok Shin <youngb.shin@samsung.com>
Wed, 1 Aug 2018 11:15:15 +0000 (20:15 +0900)
committerSubhransu Mohanty <sub.mohanty@samsung.com>
Thu, 2 Aug 2018 03:12:59 +0000 (03:12 +0000)
It helps to improve performance by avoiding constructor/destructor calls.
The getPath function is renamed to updatePath function.
And it does not return VPath anymore.

Change-Id: I6e6cc52ec3f1560aac2ee0633cdf5a8c224dcc6e

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

index 111a069..5533379 100644 (file)
@@ -172,10 +172,10 @@ void LOTMaskItem::update(int frameNo, const VMatrix &parentMatrix,
 {
     if (mData->mShape.isStatic()) {
         if (mLocalPath.isEmpty()) {
-            mLocalPath = mData->mShape.value(frameNo).toPath();
+            mData->mShape.value(frameNo).toPath(mLocalPath);
         }
     } else {
-        mLocalPath = mData->mShape.value(frameNo).toPath();
+        mData->mShape.value(frameNo).toPath(mLocalPath);
     }
     float opacity = mData->opacity(frameNo);
     opacity = opacity * parentAlpha;
@@ -670,7 +670,7 @@ void LOTPathDataItem::update(int frameNo, const VMatrix &parentMatrix,
 
     // 1. update the local path if needed
     if (!(mInit && mStaticPath)) {
-        mLocalPath = getPath(frameNo);
+        updatePath(mLocalPath, frameNo);
         mInit = true;
         mPathChanged = true;
     }
@@ -726,7 +726,7 @@ LOTRectItem::LOTRectItem(LOTRectData *data)
 {
 }
 
-VPath LOTRectItem::getPath(int frameNo)
+void LOTRectItem::updatePath(VPath& path, int frameNo)
 {
     VPointF pos = mData->mPos.value(frameNo);
     VPointF size = mData->mSize.value(frameNo);
@@ -734,10 +734,8 @@ VPath LOTRectItem::getPath(int frameNo)
     VRectF  r(pos.x() - size.x() / 2, pos.y() - size.y() / 2, size.x(),
              size.y());
 
-    VPath path;
+    path.reset();
     path.addRoundRect(r, radius, radius, mData->direction());
-
-    return path;
 }
 
 LOTEllipseItem::LOTEllipseItem(LOTEllipseData *data)
@@ -745,17 +743,15 @@ LOTEllipseItem::LOTEllipseItem(LOTEllipseData *data)
 {
 }
 
-VPath LOTEllipseItem::getPath(int frameNo)
+void LOTEllipseItem::updatePath(VPath& path, int frameNo)
 {
     VPointF pos = mData->mPos.value(frameNo);
     VPointF size = mData->mSize.value(frameNo);
     VRectF  r(pos.x() - size.x() / 2, pos.y() - size.y() / 2, size.x(),
              size.y());
 
-    VPath path;
+    path.reset();
     path.addOval(r, mData->direction());
-
-    return path;
 }
 
 LOTShapeItem::LOTShapeItem(LOTShapeData *data)
@@ -763,9 +759,9 @@ LOTShapeItem::LOTShapeItem(LOTShapeData *data)
 {
 }
 
-VPath LOTShapeItem::getPath(int frameNo)
+void LOTShapeItem::updatePath(VPath& path, int frameNo)
 {
-    return mData->mShape.value(frameNo).toPath();
+    mData->mShape.value(frameNo).toPath(path);
 }
 
 LOTPolystarItem::LOTPolystarItem(LOTPolystarData *data)
@@ -773,7 +769,7 @@ LOTPolystarItem::LOTPolystarItem(LOTPolystarData *data)
 {
 }
 
-VPath LOTPolystarItem::getPath(int frameNo)
+void LOTPolystarItem::updatePath(VPath& path, int frameNo)
 {
     VPointF pos = mData->mPos.value(frameNo);
     float   points = mData->mPointCount.value(frameNo);
@@ -783,7 +779,7 @@ VPath LOTPolystarItem::getPath(int frameNo)
     float   outerRoundness = mData->mOuterRoundness.value(frameNo);
     float   rotation = mData->mRotation.value(frameNo);
 
-    VPath   path;
+    path.reset();
     VMatrix m;
 
     if (mData->mType == LOTPolystarData::PolyType::Star) {
@@ -797,8 +793,6 @@ VPath LOTPolystarItem::getPath(int frameNo)
     m.translate(pos.x(), pos.y()).rotate(rotation);
     m.rotate(rotation);
     path.transform(m);
-
-    return path;
 }
 
 /*
index cb87ecc..1d35d48 100644 (file)
@@ -225,7 +225,7 @@ private:
    bool                                    mPathChanged;
    float                                   mCombinedAlpha;
 protected:
-   virtual VPath getPath(int frameNo) = 0;
+   virtual void updatePath(VPath& path, int frameNo) = 0;
 };
 
 class LOTRectItem: public LOTPathDataItem
@@ -233,7 +233,7 @@ class LOTRectItem: public LOTPathDataItem
 public:
    LOTRectItem(LOTRectData *data);
 protected:
-   VPath getPath(int frameNo) final;
+   void updatePath(VPath& path, int frameNo) final;
    LOTRectData           *mData;
 };
 
@@ -242,7 +242,7 @@ class LOTEllipseItem: public LOTPathDataItem
 public:
    LOTEllipseItem(LOTEllipseData *data);
 private:
-   VPath getPath(int frameNo) final;
+   void updatePath(VPath& path, int frameNo) final;
    LOTEllipseData           *mData;
 };
 
@@ -251,7 +251,7 @@ class LOTShapeItem: public LOTPathDataItem
 public:
    LOTShapeItem(LOTShapeData *data);
 private:
-   VPath getPath(int frameNo) final;
+   void updatePath(VPath& path, int frameNo) final;
    LOTShapeData             *mData;
 };
 
@@ -260,7 +260,7 @@ class LOTPolystarItem: public LOTPathDataItem
 public:
    LOTPolystarItem(LOTPolystarData *data);
 private:
-   VPath getPath(int frameNo) final;
+   void updatePath(VPath& path, int frameNo) final;
    LOTPolystarData             *mData;
 };
 
index 6880ffa..8d9df61 100644 (file)
@@ -106,10 +106,11 @@ public:
     void reserve(int size) {
         mPoints.reserve(mPoints.size() + size);
     }
-    VPath toPath() const{
-        if (mPoints.empty()) return VPath();
+    void toPath(VPath& path) {
+        path.reset();
+
+        if (mPoints.empty()) return;
 
-        VPath path;
         int size = mPoints.size();
         const VPointF *points = mPoints.data();
         /* reserve exact memory requirement at once
@@ -123,8 +124,6 @@ public:
         }
         if (mClosed)
           path.close();
-
-       return path;
     }
 public:
     std::vector<VPointF>    mPoints;