rlottie/optimization: remove unnecessary pointer indirection to optimize memory alloc...
authorsubhransu mohanty <sub.mohanty@samsung.com>
Mon, 17 Jun 2019 04:09:35 +0000 (13:09 +0900)
committerHermet Park <hermetpark@gmail.com>
Wed, 19 Jun 2019 04:36:07 +0000 (13:36 +0900)
src/lottie/lottieitem.cpp
src/lottie/lottieitem.h
src/vector/vdrawable.h

index 99b56486ff7d8592e447e8e03d362ee6b4bd8ac4..d318dc09d01a581560f1622eb1c9118b9e84d7d6 100644 (file)
@@ -743,30 +743,23 @@ void LOTCompLayerItem::renderList(std::vector<VDrawable *> &list)
 
 LOTSolidLayerItem::LOTSolidLayerItem(LOTLayerData *layerData)
     : LOTLayerItem(layerData)
-{
-}
+{}
 
 void LOTSolidLayerItem::updateContent()
 {
-    if (!mRenderNode) {
-        mRenderNode = std::make_unique<LOTDrawable>();
-        mRenderNode->mType = VDrawable::Type::Fill;
-        mRenderNode->mFlag |= VDrawable::DirtyState::All;
-    }
-
     if (flag() & DirtyFlagBit::Matrix) {
         VPath path;
         path.addRect(
             VRectF(0, 0, mLayerData->solidWidth(), mLayerData->solidHeight()));
         path.transform(combinedMatrix());
-        mRenderNode->mFlag |= VDrawable::DirtyState::Path;
-        mRenderNode->mPath = path;
+        mRenderNode.mFlag |= VDrawable::DirtyState::Path;
+        mRenderNode.mPath = path;
     }
     if (flag() & DirtyFlagBit::Alpha) {
         LottieColor color = mLayerData->solidColor();
         VBrush      brush(color.toColor(combinedAlpha()));
-        mRenderNode->setBrush(brush);
-        mRenderNode->mFlag |= VDrawable::DirtyState::Brush;
+        mRenderNode.setBrush(brush);
+        mRenderNode.mFlag |= VDrawable::DirtyState::Brush;
     }
 }
 
@@ -791,32 +784,26 @@ void LOTSolidLayerItem::renderList(std::vector<VDrawable *> &list)
 {
     if (!visible() || vIsZero(combinedAlpha())) return;
 
-    list.push_back(mRenderNode.get());
+    list.push_back(&mRenderNode);
 }
 
 LOTImageLayerItem::LOTImageLayerItem(LOTLayerData *layerData)
     : LOTLayerItem(layerData)
 {
+    VBrush brush(mLayerData->mAsset->bitmap());
+    mRenderNode.setBrush(brush);
 }
 
 void LOTImageLayerItem::updateContent()
 {
-    if (!mRenderNode) {
-        mRenderNode = std::make_unique<LOTDrawable>();
-        mRenderNode->mType = VDrawable::Type::Fill;
-        mRenderNode->mFlag |= VDrawable::DirtyState::All;
-        VBrush brush(mLayerData->mAsset->bitmap());
-        mRenderNode->setBrush(brush);
-    }
-
     if (flag() & DirtyFlagBit::Matrix) {
         VPath path;
         path.addRect(
             VRectF(0, 0, mLayerData->mAsset->mWidth, mLayerData->mAsset->mHeight));
         path.transform(combinedMatrix());
-        mRenderNode->mFlag |= VDrawable::DirtyState::Path;
-        mRenderNode->mPath = path;
-        mRenderNode->mBrush.setMatrix(combinedMatrix());
+        mRenderNode.mFlag |= VDrawable::DirtyState::Path;
+        mRenderNode.mPath = path;
+        mRenderNode.mBrush.setMatrix(combinedMatrix());
     }
 
     if (flag() & DirtyFlagBit::Alpha) {
@@ -828,7 +815,7 @@ void LOTImageLayerItem::renderList(std::vector<VDrawable *> &list)
 {
     if (!visible() || vIsZero(combinedAlpha())) return;
 
-    list.push_back(mRenderNode.get());
+    list.push_back(&mRenderNode);
 }
 
 void LOTImageLayerItem::buildLayerNode()
@@ -843,9 +830,9 @@ void LOTImageLayerItem::buildLayerNode()
         LOTDrawable *lotDrawable = static_cast<LOTDrawable *>(i);
         lotDrawable->sync();
 
-        lotDrawable->mCNode->mImageInfo.data = mRenderNode->mBrush.mTexture.data();
-        lotDrawable->mCNode->mImageInfo.width = mRenderNode->mBrush.mTexture.width();
-        lotDrawable->mCNode->mImageInfo.height = mRenderNode->mBrush.mTexture.height();
+        lotDrawable->mCNode->mImageInfo.data = lotDrawable->mBrush.mTexture.data();
+        lotDrawable->mCNode->mImageInfo.width = lotDrawable->mBrush.mTexture.width();
+        lotDrawable->mCNode->mImageInfo.height = lotDrawable->mBrush.mTexture.height();
 
         lotDrawable->mCNode->mImageInfo.mMatrix.m11 = combinedMatrix().m_11();
         lotDrawable->mCNode->mImageInfo.mMatrix.m12 = combinedMatrix().m_12();
@@ -1279,7 +1266,6 @@ void LOTPolystarItem::updatePath(VPath& path, int frameNo)
  */
 LOTPaintDataItem::LOTPaintDataItem(bool staticContent):
     LOTContentItem(ContentType::Paint),
-    mDrawable(std::make_unique<LOTDrawable>()),
     mStaticContent(staticContent){}
 
 void LOTPaintDataItem::update(int frameNo, const VMatrix &/*parentMatrix*/,
@@ -1309,10 +1295,10 @@ void LOTPaintDataItem::updateRenderNode()
         for (auto &i : mPathItems) {
             mPath.addPath(i->finalPath());
         }
-        mDrawable->setPath(mPath);
+        mDrawable.setPath(mPath);
     } else {
-        if (mDrawable->mFlag & VDrawable::DirtyState::Path)
-            mDrawable->mPath = mPath;
+        if (mDrawable.mFlag & VDrawable::DirtyState::Path)
+            mDrawable.mPath = mPath;
     }
 }
 
@@ -1323,7 +1309,7 @@ void LOTPaintDataItem::renderList(std::vector<VDrawable *> &list)
         LOTPaintDataItem::updateRenderNode();
         mRenderNodeUpdate = false;
     }
-    list.push_back(mDrawable.get());
+    list.push_back(&mDrawable);
 }
 
 
@@ -1349,8 +1335,8 @@ void LOTFillItem::updateRenderNode()
 
     color.setAlpha(color.a * parentAlpha());
     VBrush brush(color);
-    mDrawable->setBrush(brush);
-    mDrawable->setFillRule(mModel.fillRule());
+    mDrawable.setBrush(brush);
+    mDrawable.setFillRule(mModel.fillRule());
 }
 
 LOTGFillItem::LOTGFillItem(LOTGFillData *data)
@@ -1369,8 +1355,8 @@ void LOTGFillItem::updateContent(int frameNo)
 void LOTGFillItem::updateRenderNode()
 {
     mGradient->setAlpha(mAlpha * parentAlpha());
-    mDrawable->setBrush(VBrush(mGradient.get()));
-    mDrawable->setFillRule(mFillRule);
+    mDrawable.setBrush(VBrush(mGradient.get()));
+    mDrawable.setFillRule(mFillRule);
 }
 
 LOTStrokeItem::LOTStrokeItem(LOTStrokeData *data)
@@ -1406,9 +1392,9 @@ void LOTStrokeItem::updateRenderNode()
 
     color.setAlpha(color.a * parentAlpha());
     VBrush brush(color);
-    mDrawable->setBrush(brush);
+    mDrawable.setBrush(brush);
     float scale = getScale(static_cast<LOTContentGroupItem *>(parent())->matrix());
-    mDrawable->setStrokeInfo(mModel.capStyle(), mModel.joinStyle(), mModel.meterLimit(),
+    mDrawable.setStrokeInfo(mModel.capStyle(), mModel.joinStyle(), mModel.meterLimit(),
                             mWidth * scale);
     if (mDashArraySize) {
         for (int i = 0 ; i < mDashArraySize ; i++)
@@ -1417,7 +1403,7 @@ void LOTStrokeItem::updateRenderNode()
         /* AE draw the dash even if dash value is 0 */
         if (vCompare(mDashArray[0], 0.0f)) mDashArray[0]= 0.1;
 
-        mDrawable->setDashInfo(mDashArray, mDashArraySize);
+        mDrawable.setDashInfo(mDashArray, mDashArraySize);
     }
 }
 
@@ -1445,13 +1431,13 @@ void LOTGStrokeItem::updateRenderNode()
 {
     float scale = getScale(mGradient->mMatrix);
     mGradient->setAlpha(mAlpha * parentAlpha());
-    mDrawable->setBrush(VBrush(mGradient.get()));
-    mDrawable->setStrokeInfo(mCap, mJoin, mMiterLimit,
+    mDrawable.setBrush(VBrush(mGradient.get()));
+    mDrawable.setStrokeInfo(mCap, mJoin, mMiterLimit,
                             mWidth * scale);
     if (mDashArraySize) {
         for (int i = 0 ; i < mDashArraySize ; i++)
             mDashArray[i] *= scale;
-        mDrawable->setDashInfo(mDashArray, mDashArraySize);
+        mDrawable.setDashInfo(mDashArray, mDashArraySize);
     }
 }
 
index 73eeb7c7f20ca353988a10fda5899898af74c438..da83dc3c1df9f78b9039053bca9c4bd2c04abead 100644 (file)
@@ -47,6 +47,19 @@ class LOTLayerItem;
 class LOTMaskItem;
 class VDrawable;
 
+class LOTDrawable : public VDrawable
+{
+public:
+    void sync();
+public:
+    std::unique_ptr<LOTNode>  mCNode{nullptr};
+
+    ~LOTDrawable() {
+        if (mCNode && mCNode->mGradient.stopPtr)
+          free(mCNode->mGradient.stopPtr);
+    }
+};
+
 class LOTCompItem
 {
 public:
@@ -161,7 +174,7 @@ protected:
    void renderList(std::vector<VDrawable *> &list) final;
 private:
    std::vector<LOTNode *>       mCNodeList;
-   std::unique_ptr<VDrawable>   mRenderNode;
+   LOTDrawable                  mRenderNode;
 };
 
 class LOTContentItem;
@@ -198,7 +211,7 @@ protected:
    void renderList(std::vector<VDrawable *> &list) final;
 private:
    std::vector<LOTNode *>       mCNodeList;
-   std::unique_ptr<VDrawable>   mRenderNode;
+   LOTDrawable                  mRenderNode;
 };
 
 class LOTMaskItem
@@ -235,19 +248,6 @@ public:
     bool                       mDirty{true};
 };
 
-class LOTDrawable : public VDrawable
-{
-public:
-    void sync();
-public:
-    std::unique_ptr<LOTNode>  mCNode;
-
-    ~LOTDrawable() {
-        if (mCNode && mCNode->mGradient.stopPtr)
-          free(mCNode->mGradient.stopPtr);
-    }
-};
-
 class LOTPathDataItem;
 class LOTPaintDataItem;
 class LOTTrimItem;
@@ -403,13 +403,13 @@ protected:
    virtual void updateContent(int frameNo) = 0;
    virtual void updateRenderNode();
    inline float parentAlpha() const {return mParentAlpha;}
-public:
-   float                            mParentAlpha{1.0f};
+protected:
+   std::vector<LOTPathDataItem *>   mPathItems;
+   LOTDrawable                      mDrawable;
    VPath                            mPath;
-   DirtyFlag                        mFlag;
+   float                            mParentAlpha{1.0f};
    int                              mFrameNo{-1};
-   std::vector<LOTPathDataItem *>   mPathItems;
-   std::unique_ptr<VDrawable>       mDrawable;
+   DirtyFlag                        mFlag;
    bool                             mStaticContent;
    bool                             mRenderNodeUpdate{true};
 };
index 4e9bf03cd502b05cc29c769aadfae20e40dfb095..861d9be1a0ff9d2fc9e3eded2a7def4db6403d4e 100644 (file)
@@ -38,7 +38,6 @@ public:
         Stroke,
     };
     typedef vFlag<DirtyState> DirtyFlag;
-    virtual ~VDrawable() = default;
     void setPath(const VPath &path);
     void setFillRule(FillRule rule) { mFillRule = rule; }
     void setBrush(const VBrush &brush) { mBrush = brush; }