const LayerInfoList &layerInfoList() const
{
- return mModel->layerInfoList();
+ if (mLayerList.empty()) {
+ mLayerList = mModel->layerInfoList();
+ }
+ return mLayerList;
}
const MarkerList &markers() const
{
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;
{
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;
+}
{
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
std::unordered_map<std::string,
LOTAsset*> mAssets;
- std::vector<LayerInfo> mLayerInfoList;
std::vector<Marker> mMarkers;
VArenaAlloc mArenaAlloc{2048};
LOTModelStat mStats;
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;
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);
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;
comp->mRootLayer->mInFrame = comp->mStartFrame;
comp->mRootLayer->mOutFrame = comp->mEndFrame;
- comp->mLayerInfoList = std::move(mLayerInfoList);
-
mComposition = sharedComposition;
}
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);
* 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>();
layer->setStatic(staticFlag && layer->mTransform->isStatic());
- if (record) {
- mLayerInfoList.push_back(
- LayerInfo(layer->name(), layer->mInFrame, layer->mOutFrame));
- }
return layer;
}