91 lines
3.2 KiB
Swift
91 lines
3.2 KiB
Swift
//
|
|
// CompositionLayersInitializer.swift
|
|
// lottie-swift
|
|
//
|
|
// Created by Brandon Withrow on 1/25/19.
|
|
//
|
|
|
|
import CoreGraphics
|
|
import Foundation
|
|
|
|
extension Array where Element == LayerModel {
|
|
|
|
func initializeCompositionLayers(
|
|
assetLibrary: AssetLibrary?,
|
|
layerImageProvider: LayerImageProvider,
|
|
textProvider: AnimationTextProvider,
|
|
fontProvider: AnimationFontProvider,
|
|
frameRate: CGFloat) -> [CompositionLayer]
|
|
{
|
|
var compositionLayers = [CompositionLayer]()
|
|
var layerMap = [Int : CompositionLayer]()
|
|
|
|
/// Organize the assets into a dictionary of [ID : ImageAsset]
|
|
var childLayers = [LayerModel]()
|
|
|
|
for layer in self {
|
|
if layer.hidden == true {
|
|
let genericLayer = NullCompositionLayer(layer: layer)
|
|
compositionLayers.append(genericLayer)
|
|
layerMap[layer.index] = genericLayer
|
|
} else if let shapeLayer = layer as? ShapeLayerModel {
|
|
let shapeContainer = ShapeCompositionLayer(shapeLayer: shapeLayer)
|
|
compositionLayers.append(shapeContainer)
|
|
layerMap[layer.index] = shapeContainer
|
|
} else if let solidLayer = layer as? SolidLayerModel {
|
|
let solidContainer = SolidCompositionLayer(solid: solidLayer)
|
|
compositionLayers.append(solidContainer)
|
|
layerMap[layer.index] = solidContainer
|
|
} else if
|
|
let precompLayer = layer as? PreCompLayerModel,
|
|
let assetLibrary = assetLibrary,
|
|
let precompAsset = assetLibrary.precompAssets[precompLayer.referenceID]
|
|
{
|
|
let precompContainer = PreCompositionLayer(
|
|
precomp: precompLayer,
|
|
asset: precompAsset,
|
|
layerImageProvider: layerImageProvider,
|
|
textProvider: textProvider,
|
|
fontProvider: fontProvider,
|
|
assetLibrary: assetLibrary,
|
|
frameRate: frameRate)
|
|
compositionLayers.append(precompContainer)
|
|
layerMap[layer.index] = precompContainer
|
|
} else if
|
|
let imageLayer = layer as? ImageLayerModel,
|
|
let assetLibrary = assetLibrary,
|
|
let imageAsset = assetLibrary.imageAssets[imageLayer.referenceID]
|
|
{
|
|
let imageContainer = ImageCompositionLayer(
|
|
imageLayer: imageLayer,
|
|
size: CGSize(width: imageAsset.width, height: imageAsset.height))
|
|
compositionLayers.append(imageContainer)
|
|
layerMap[layer.index] = imageContainer
|
|
} else if let textLayer = layer as? TextLayerModel {
|
|
let textContainer = TextCompositionLayer(textLayer: textLayer, textProvider: textProvider, fontProvider: fontProvider)
|
|
compositionLayers.append(textContainer)
|
|
layerMap[layer.index] = textContainer
|
|
} else {
|
|
let genericLayer = NullCompositionLayer(layer: layer)
|
|
compositionLayers.append(genericLayer)
|
|
layerMap[layer.index] = genericLayer
|
|
}
|
|
if layer.parent != nil {
|
|
childLayers.append(layer)
|
|
}
|
|
}
|
|
|
|
/// Now link children with their parents
|
|
for layerModel in childLayers {
|
|
if let parentID = layerModel.parent {
|
|
let childLayer = layerMap[layerModel.index]
|
|
let parentLayer = layerMap[parentID]
|
|
childLayer?.transformNode.parentNode = parentLayer?.transformNode
|
|
}
|
|
}
|
|
|
|
return compositionLayers
|
|
}
|
|
|
|
}
|