You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

90 lines
3.2 KiB

2 years ago
  1. //
  2. // CompositionLayersInitializer.swift
  3. // lottie-swift
  4. //
  5. // Created by Brandon Withrow on 1/25/19.
  6. //
  7. import CoreGraphics
  8. import Foundation
  9. extension Array where Element == LayerModel {
  10. func initializeCompositionLayers(
  11. assetLibrary: AssetLibrary?,
  12. layerImageProvider: LayerImageProvider,
  13. textProvider: AnimationTextProvider,
  14. fontProvider: AnimationFontProvider,
  15. frameRate: CGFloat) -> [CompositionLayer]
  16. {
  17. var compositionLayers = [CompositionLayer]()
  18. var layerMap = [Int : CompositionLayer]()
  19. /// Organize the assets into a dictionary of [ID : ImageAsset]
  20. var childLayers = [LayerModel]()
  21. for layer in self {
  22. if layer.hidden == true {
  23. let genericLayer = NullCompositionLayer(layer: layer)
  24. compositionLayers.append(genericLayer)
  25. layerMap[layer.index] = genericLayer
  26. } else if let shapeLayer = layer as? ShapeLayerModel {
  27. let shapeContainer = ShapeCompositionLayer(shapeLayer: shapeLayer)
  28. compositionLayers.append(shapeContainer)
  29. layerMap[layer.index] = shapeContainer
  30. } else if let solidLayer = layer as? SolidLayerModel {
  31. let solidContainer = SolidCompositionLayer(solid: solidLayer)
  32. compositionLayers.append(solidContainer)
  33. layerMap[layer.index] = solidContainer
  34. } else if
  35. let precompLayer = layer as? PreCompLayerModel,
  36. let assetLibrary = assetLibrary,
  37. let precompAsset = assetLibrary.precompAssets[precompLayer.referenceID]
  38. {
  39. let precompContainer = PreCompositionLayer(
  40. precomp: precompLayer,
  41. asset: precompAsset,
  42. layerImageProvider: layerImageProvider,
  43. textProvider: textProvider,
  44. fontProvider: fontProvider,
  45. assetLibrary: assetLibrary,
  46. frameRate: frameRate)
  47. compositionLayers.append(precompContainer)
  48. layerMap[layer.index] = precompContainer
  49. } else if
  50. let imageLayer = layer as? ImageLayerModel,
  51. let assetLibrary = assetLibrary,
  52. let imageAsset = assetLibrary.imageAssets[imageLayer.referenceID]
  53. {
  54. let imageContainer = ImageCompositionLayer(
  55. imageLayer: imageLayer,
  56. size: CGSize(width: imageAsset.width, height: imageAsset.height))
  57. compositionLayers.append(imageContainer)
  58. layerMap[layer.index] = imageContainer
  59. } else if let textLayer = layer as? TextLayerModel {
  60. let textContainer = TextCompositionLayer(textLayer: textLayer, textProvider: textProvider, fontProvider: fontProvider)
  61. compositionLayers.append(textContainer)
  62. layerMap[layer.index] = textContainer
  63. } else {
  64. let genericLayer = NullCompositionLayer(layer: layer)
  65. compositionLayers.append(genericLayer)
  66. layerMap[layer.index] = genericLayer
  67. }
  68. if layer.parent != nil {
  69. childLayers.append(layer)
  70. }
  71. }
  72. /// Now link children with their parents
  73. for layerModel in childLayers {
  74. if let parentID = layerModel.parent {
  75. let childLayer = layerMap[layerModel.index]
  76. let parentLayer = layerMap[parentID]
  77. childLayer?.transformNode.parentNode = parentLayer?.transformNode
  78. }
  79. }
  80. return compositionLayers
  81. }
  82. }