rlottie/model: lazy generation of layerlist
authorsubhransu mohanty <sub.mohanty@samsung.com>
Mon, 4 Nov 2019 06:53:22 +0000 (15:53 +0900)
committerJunsuChoi <jsuya.choi@samsung.com>
Wed, 13 Nov 2019 00:44:45 +0000 (09:44 +0900)
src/lottie/lottieanimation.cpp
src/lottie/lottiemodel.cpp
src/lottie/lottiemodel.h
src/lottie/lottieparser.cpp

index 2b1938c..ef93930 100644 (file)
@@ -56,7 +56,10 @@ public:
 
     const LayerInfoList &layerInfoList() const
     {
-        return mModel->layerInfoList();
+        if (mLayerList.empty()) {
+            mLayerList = mModel->layerInfoList();
+        }
+        return mLayerList;
     }
     const MarkerList &markers() const
     {
@@ -66,6 +69,7 @@ public:
     void removeFilter(const std::string &keypath, Property prop);
 
 private:
+    mutable LayerInfoList        mLayerList;
     std::string                  mFilePath;
     std::shared_ptr<LOTModel>    mModel;
     std::unique_ptr<LOTCompItem> mCompItem;
index ae1d032..f3e42e6 100644 (file)
@@ -367,3 +367,19 @@ void LOTAsset::loadImagePath(std::string path)
 {
     if (!path.empty()) mBitmap = VImageLoader::instance().load(path.c_str());
 }
+
+std::vector<LayerInfo> LOTCompositionData::layerInfoList() const
+{
+    if (!mRootLayer || mRootLayer->mChildren.empty()) return {};
+
+    std::vector<LayerInfo> result;
+
+    result.reserve(mRootLayer->mChildren.size());
+
+    for (auto it : mRootLayer->mChildren) {
+        auto layer = static_cast<LOTLayerData *>(it);
+        result.emplace_back(layer->name(), layer->mInFrame, layer->mOutFrame);
+    }
+
+    return result;
+}
index 588f7d1..e92c841 100644 (file)
@@ -655,7 +655,7 @@ class LOTCompositionData : public LOTData
 {
 public:
     LOTCompositionData():LOTData(LOTData::Type::Composition){}
-    const std::vector<LayerInfo> &layerInfoList() const { return  mLayerInfoList;}
+    std::vector<LayerInfo> layerInfoList() const;
     const std::vector<Marker> &markers() const { return  mMarkers;}
     double duration() const {
         return frameDuration() / frameRate(); // in second
@@ -687,7 +687,6 @@ public:
     std::unordered_map<std::string,
                        LOTAsset*>    mAssets;
 
-    std::vector<LayerInfo>  mLayerInfoList;
     std::vector<Marker>     mMarkers;
     VArenaAlloc             mArenaAlloc{2048};
     LOTModelStat            mStats;
@@ -1091,7 +1090,7 @@ public:
    size_t startFrame() const {return mRoot->startFrame();}
    size_t endFrame() const {return mRoot->endFrame();}
    size_t frameAtPos(double pos) const {return mRoot->frameAtPos(pos);}
-   const std::vector<LayerInfo> &layerInfoList() const { return mRoot->layerInfoList();}
+   std::vector<LayerInfo> layerInfoList() const { return mRoot->layerInfoList();}
    const std::vector<Marker> &markers() const { return mRoot->markers();}
 public:
     std::shared_ptr<LOTCompositionData> mRoot;
index d1229d0..b55d207 100644 (file)
@@ -211,7 +211,7 @@ public:
     void                         parseAssets(LOTCompositionData *comp);
     LOTAsset*                    parseAsset();
     void                         parseLayers(LOTCompositionData *comp);
-    LOTLayerData*                parseLayer(bool record = false);
+    LOTLayerData*                parseLayer();
     void                         parseMaskProperty(LOTLayerData *layer);
     void                         parseShapesAttr(LOTLayerData *layer);
     void                         parseObject(LOTGroupData *parent);
@@ -271,7 +271,6 @@ protected:
     LOTLayerData *                             curLayerRef{nullptr};
     std::vector<LOTLayerData *>                mLayersToUpdate;
     std::string                                mDirPath;
-    std::vector<LayerInfo>                     mLayerInfoList;
     std::vector<VPointF>                       mInPoint;  /* "i" */
     std::vector<VPointF>                       mOutPoint; /* "o" */
     std::vector<VPointF>                       mVertices;
@@ -609,8 +608,6 @@ void LottieParserImpl::parseComposition()
     comp->mRootLayer->mInFrame = comp->mStartFrame;
     comp->mRootLayer->mOutFrame = comp->mEndFrame;
 
-    comp->mLayerInfoList = std::move(mLayerInfoList);
-
     mComposition = sharedComposition;
 }
 
@@ -803,7 +800,7 @@ void LottieParserImpl::parseLayers(LOTCompositionData *comp)
     RAPIDJSON_ASSERT(PeekType() == kArrayType);
     EnterArray();
     while (NextArrayValue()) {
-        auto layer = parseLayer(true);
+        auto layer = parseLayer();
         if (layer) {
             staticFlag = staticFlag && layer->isStatic();
             comp->mRootLayer->mChildren.push_back(layer);
@@ -891,7 +888,7 @@ LayerType LottieParserImpl::getLayerType()
  * https://github.com/airbnb/lottie-web/blob/master/docs/json/layers/shape.json
  *
  */
-LOTLayerData* LottieParserImpl::parseLayer(bool record)
+LOTLayerData* LottieParserImpl::parseLayer()
 {
     RAPIDJSON_ASSERT(PeekType() == kObjectType);
     LOTLayerData *layer = allocator().make<LOTLayerData>();
@@ -1005,10 +1002,6 @@ LOTLayerData* LottieParserImpl::parseLayer(bool record)
 
     layer->setStatic(staticFlag && layer->mTransform->isStatic());
 
-    if (record) {
-        mLayerInfoList.push_back(
-            LayerInfo(layer->name(), layer->mInFrame, layer->mOutFrame));
-    }
     return layer;
 }