From 7ed3d937e97b6fa0e4902d0c9855bf1a2c2c4637 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Mon, 4 Nov 2019 15:53:22 +0900 Subject: [PATCH] rlottie/model: lazy generation of layerlist --- src/lottie/lottieanimation.cpp | 6 +++++- src/lottie/lottiemodel.cpp | 16 ++++++++++++++++ src/lottie/lottiemodel.h | 5 ++--- src/lottie/lottieparser.cpp | 13 +++---------- 4 files changed, 26 insertions(+), 14 deletions(-) diff --git a/src/lottie/lottieanimation.cpp b/src/lottie/lottieanimation.cpp index 2b1938c..ef93930 100644 --- a/src/lottie/lottieanimation.cpp +++ b/src/lottie/lottieanimation.cpp @@ -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 mModel; std::unique_ptr mCompItem; diff --git a/src/lottie/lottiemodel.cpp b/src/lottie/lottiemodel.cpp index ae1d032..f3e42e6 100644 --- a/src/lottie/lottiemodel.cpp +++ b/src/lottie/lottiemodel.cpp @@ -367,3 +367,19 @@ void LOTAsset::loadImagePath(std::string path) { if (!path.empty()) mBitmap = VImageLoader::instance().load(path.c_str()); } + +std::vector LOTCompositionData::layerInfoList() const +{ + if (!mRootLayer || mRootLayer->mChildren.empty()) return {}; + + std::vector result; + + result.reserve(mRootLayer->mChildren.size()); + + for (auto it : mRootLayer->mChildren) { + auto layer = static_cast(it); + result.emplace_back(layer->name(), layer->mInFrame, layer->mOutFrame); + } + + return result; +} diff --git a/src/lottie/lottiemodel.h b/src/lottie/lottiemodel.h index 588f7d1..e92c841 100644 --- a/src/lottie/lottiemodel.h +++ b/src/lottie/lottiemodel.h @@ -655,7 +655,7 @@ class LOTCompositionData : public LOTData { public: LOTCompositionData():LOTData(LOTData::Type::Composition){} - const std::vector &layerInfoList() const { return mLayerInfoList;} + std::vector layerInfoList() const; const std::vector &markers() const { return mMarkers;} double duration() const { return frameDuration() / frameRate(); // in second @@ -687,7 +687,6 @@ public: std::unordered_map mAssets; - std::vector mLayerInfoList; std::vector 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 &layerInfoList() const { return mRoot->layerInfoList();} + std::vector layerInfoList() const { return mRoot->layerInfoList();} const std::vector &markers() const { return mRoot->markers();} public: std::shared_ptr mRoot; diff --git a/src/lottie/lottieparser.cpp b/src/lottie/lottieparser.cpp index d1229d0..b55d207 100644 --- a/src/lottie/lottieparser.cpp +++ b/src/lottie/lottieparser.cpp @@ -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 mLayersToUpdate; std::string mDirPath; - std::vector mLayerInfoList; std::vector mInPoint; /* "i" */ std::vector mOutPoint; /* "o" */ std::vector 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(); @@ -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; } -- 2.34.1