#include "CompositionLayersInitializer.hpp" #include "Lottie/Private/MainThread/LayerContainers/CompLayers/NullCompositionLayer.hpp" #include "Lottie/Private/MainThread/LayerContainers/CompLayers/ShapeCompositionLayer.hpp" #include "Lottie/Private/MainThread/LayerContainers/CompLayers/PreCompositionLayer.hpp" #include "Lottie/Private/MainThread/LayerContainers/CompLayers/ImageCompositionLayer.hpp" #include "Lottie/Private/MainThread/LayerContainers/CompLayers/TextCompositionLayer.hpp" namespace lottie { std::vector> initializeCompositionLayers( std::vector> const &layers, std::shared_ptr const &assetLibrary, std::shared_ptr const &layerImageProvider, std::shared_ptr const &textProvider, std::shared_ptr const &fontProvider, double frameRate ) { std::vector> compositionLayers; std::map> layerMap; /// Organize the assets into a dictionary of [ID : ImageAsset] std::vector> childLayers; for (const auto &layer : layers) { if (layer->hidden) { auto genericLayer = std::make_shared(layer); compositionLayers.push_back(genericLayer); if (layer->index) { layerMap.insert(std::make_pair(layer->index.value(), genericLayer)); } } else if (layer->type == LayerType::Shape) { auto shapeContainer = std::make_shared(std::static_pointer_cast(layer)); compositionLayers.push_back(shapeContainer); if (layer->index) { layerMap.insert(std::make_pair(layer->index.value(), shapeContainer)); } } else if (layer->type == LayerType::Solid) { auto shapeContainer = std::make_shared(std::static_pointer_cast(layer)); compositionLayers.push_back(shapeContainer); if (layer->index) { layerMap.insert(std::make_pair(layer->index.value(), shapeContainer)); } } else if (layer->type == LayerType::Precomp && assetLibrary) { auto precompLayer = std::static_pointer_cast(layer); auto precompAssetIt = assetLibrary->precompAssets.find(precompLayer->referenceID); if (precompAssetIt != assetLibrary->precompAssets.end()) { auto precompContainer = std::make_shared( precompLayer, *(precompAssetIt->second), layerImageProvider, textProvider, fontProvider, assetLibrary, frameRate ); compositionLayers.push_back(precompContainer); if (layer->index) { layerMap.insert(std::make_pair(layer->index.value(), precompContainer)); } } } else if (layer->type == LayerType::Image && assetLibrary) { auto imageLayer = std::static_pointer_cast(layer); auto imageAssetIt = assetLibrary->imageAssets.find(imageLayer->referenceID); if (imageAssetIt != assetLibrary->imageAssets.end()) { auto imageContainer = std::make_shared( imageLayer, Vector2D((*imageAssetIt->second).width, (*imageAssetIt->second).height) ); compositionLayers.push_back(imageContainer); if (layer->index) { layerMap.insert(std::make_pair(layer->index.value(), imageContainer)); } } } else if (layer->type == LayerType::Text) { auto textContainer = std::make_shared(std::static_pointer_cast(layer), textProvider, fontProvider); compositionLayers.push_back(textContainer); if (layer->index) { layerMap.insert(std::make_pair(layer->index.value(), textContainer)); } } else { auto genericLayer = std::make_shared(layer); compositionLayers.push_back(genericLayer); if (layer->index) { layerMap.insert(std::make_pair(layer->index.value(), genericLayer)); } } if (layer->parent) { childLayers.push_back(layer); } } /// Now link children with their parents for (const auto &layerModel : childLayers) { if (!layerModel->index.has_value()) { continue; } if (const auto parentID = layerModel->parent) { auto childLayerIt = layerMap.find(layerModel->index.value()); if (childLayerIt != layerMap.end()) { auto parentLayerIt = layerMap.find(parentID.value()); if (parentLayerIt != layerMap.end()) { childLayerIt->second->transformNode()->setParentNode(parentLayerIt->second->transformNode()); } } } } return compositionLayers; } }