lottie-ios 3.2.2 → 3.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (316) hide show
  1. package/.github/actions/setup/action.yml +32 -0
  2. package/.github/issue_template.md +6 -23
  3. package/.github/workflows/main.yml +98 -0
  4. package/.spi.yml +6 -0
  5. package/.swift-version +1 -0
  6. package/.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata +7 -0
  7. package/.swiftpm/xcode/package.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  8. package/.swiftpm/xcode/xcuserdata/{brandonwithrow.xcuserdatad → cal.xcuserdatad}/xcschemes/xcschememanagement.plist +25 -15
  9. package/.swiftpm/xcode/xcuserdata/calstephens.xcuserdatad/xcschemes/xcschememanagement.plist +14 -0
  10. package/Gemfile +4 -0
  11. package/Gemfile.lock +102 -0
  12. package/Lottie.xcodeproj/project.pbxproj +2003 -1972
  13. package/Lottie.xcodeproj/project.xcworkspace/contents.xcworkspacedata +1 -1
  14. package/Lottie.xcodeproj/project.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  15. package/Lottie.xcodeproj/xcshareddata/xcschemes/{Lottie_iOS.xcscheme → Lottie (iOS).xcscheme } +15 -18
  16. package/Lottie.xcodeproj/xcshareddata/xcschemes/{Lottie_macOS.xcscheme → Lottie (macOS).xcscheme } +7 -20
  17. package/Lottie.xcodeproj/xcshareddata/xcschemes/{Lottie_tvOS.xcscheme → Lottie (tvOS).xcscheme } +5 -18
  18. package/Lottie.xcodeproj/xcuserdata/cal.xcuserdatad/xcschemes/xcschememanagement.plist +37 -0
  19. package/Lottie.xcodeproj/xcuserdata/calstephens.xcuserdatad/xcschemes/xcschememanagement.plist +24 -0
  20. package/Lottie.xcworkspace/contents.xcworkspacedata +10 -0
  21. package/Lottie.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
  22. package/Lottie.xcworkspace/xcshareddata/swiftpm/Package.resolved +115 -0
  23. package/Lottie.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  24. package/{Lottie.xcodeproj/xcuserdata/brandonwithrow.xcuserdatad → Lottie.xcworkspace/xcuserdata/cal.xcuserdatad}/xcdebugger/Breakpoints_v2.xcbkptlist +2 -2
  25. package/Lottie.xcworkspace/xcuserdata/cal.xcuserdatad/xcdebugger/Expressions.xcexplist +153 -0
  26. package/Lottie.xcworkspace/xcuserdata/calstephens.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  27. package/Lottie.xcworkspace/xcuserdata/calstephens.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +39 -0
  28. package/Lottie.xcworkspace/xcuserdata/calstephens.xcuserdatad/xcdebugger/Expressions.xcexplist +25 -0
  29. package/Lottie.xcworkspace/xcuserdata/calstephens.xcuserdatad/xcschemes/xcschememanagement.plist +30 -0
  30. package/Package.resolved +88 -0
  31. package/Package.swift +10 -15
  32. package/README.md +40 -60
  33. package/Rakefile +121 -0
  34. package/Sources/Private/CoreAnimation/Animations/CAAnimation+TimingConfiguration.swift +81 -0
  35. package/Sources/Private/CoreAnimation/Animations/CALayer+addAnimation.swift +448 -0
  36. package/Sources/Private/CoreAnimation/Animations/CombinedShapeAnimation.swift +53 -0
  37. package/Sources/Private/CoreAnimation/Animations/CustomPathAnimation.swift +41 -0
  38. package/Sources/Private/CoreAnimation/Animations/EllipseAnimation.swift +28 -0
  39. package/Sources/Private/CoreAnimation/Animations/GradientAnimations.swift +210 -0
  40. package/Sources/Private/CoreAnimation/Animations/LayerProperty.swift +229 -0
  41. package/Sources/Private/CoreAnimation/Animations/OpacityAnimation.swift +52 -0
  42. package/Sources/Private/CoreAnimation/Animations/RectangleAnimation.swift +31 -0
  43. package/Sources/Private/CoreAnimation/Animations/ShapeAnimation.swift +246 -0
  44. package/Sources/Private/CoreAnimation/Animations/StarAnimation.swift +95 -0
  45. package/Sources/Private/CoreAnimation/Animations/StrokeAnimation.swift +70 -0
  46. package/Sources/Private/CoreAnimation/Animations/TransformAnimations.swift +205 -0
  47. package/Sources/Private/CoreAnimation/Animations/VisibilityAnimation.swift +37 -0
  48. package/Sources/Private/CoreAnimation/CompatibilityTracker.swift +130 -0
  49. package/Sources/Private/CoreAnimation/CoreAnimationLayer.swift +492 -0
  50. package/Sources/Private/CoreAnimation/Extensions/CALayer+fillBounds.swift +35 -0
  51. package/Sources/Private/CoreAnimation/Extensions/KeyframeGroup+exactlyOneKeyframe.swift +37 -0
  52. package/Sources/Private/CoreAnimation/Extensions/Keyframes+combinedIfPossible.swift +73 -0
  53. package/Sources/Private/CoreAnimation/Layers/AnimationLayer.swift +83 -0
  54. package/Sources/Private/CoreAnimation/Layers/BaseAnimationLayer.swift +33 -0
  55. package/Sources/Private/CoreAnimation/Layers/BaseCompositionLayer.swift +87 -0
  56. package/Sources/Private/CoreAnimation/Layers/CALayer+setupLayerHierarchy.swift +131 -0
  57. package/Sources/Private/CoreAnimation/Layers/GradientRenderLayer.swift +94 -0
  58. package/Sources/Private/CoreAnimation/Layers/ImageLayer.swift +79 -0
  59. package/Sources/Private/CoreAnimation/Layers/LayerModel+makeAnimationLayer.swift +60 -0
  60. package/Sources/Private/CoreAnimation/Layers/MaskCompositionLayer.swift +138 -0
  61. package/Sources/Private/CoreAnimation/Layers/PreCompLayer.swift +140 -0
  62. package/Sources/Private/CoreAnimation/Layers/ShapeItemLayer.swift +302 -0
  63. package/Sources/Private/CoreAnimation/Layers/ShapeLayer.swift +319 -0
  64. package/Sources/Private/CoreAnimation/Layers/SolidLayer.swift +47 -0
  65. package/Sources/Private/CoreAnimation/Layers/TextLayer.swift +91 -0
  66. package/Sources/Private/CoreAnimation/Layers/TransformLayer.swift +11 -0
  67. package/Sources/Private/CoreAnimation/ValueProviderStore.swift +139 -0
  68. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/CompositionLayer.swift +93 -85
  69. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/ImageCompositionLayer.swift +24 -21
  70. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/MaskContainerLayer.swift +75 -54
  71. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/NullCompositionLayer.swift +5 -5
  72. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/PreCompositionLayer.swift +61 -44
  73. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/ShapeCompositionLayer.swift +22 -20
  74. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/SolidCompositionLayer.swift +26 -17
  75. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/TextCompositionLayer.swift +42 -36
  76. package/{lottie-swift/src/Private/LayerContainers/AnimationContainer.swift → Sources/Private/MainThread/LayerContainers/MainThreadAnimationLayer.swift} +200 -140
  77. package/Sources/Private/MainThread/LayerContainers/Utility/CachedImageProvider.swift +47 -0
  78. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/Utility/CompositionLayersInitializer.swift +33 -24
  79. package/{lottie-swift/src/Private/LayerContainers/Utility/TextLayer.swift → Sources/Private/MainThread/LayerContainers/Utility/CoreTextRenderLayer.swift} +120 -106
  80. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/Utility/InvertedMatteLayer.swift +25 -24
  81. package/Sources/Private/MainThread/LayerContainers/Utility/LayerFontProvider.swift +41 -0
  82. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/Utility/LayerImageProvider.swift +20 -16
  83. package/Sources/Private/MainThread/LayerContainers/Utility/LayerTextProvider.swift +40 -0
  84. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/Utility/LayerTransformNode.swift +82 -67
  85. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Extensions/ItemsExtension.swift +4 -4
  86. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/NodeProperty.swift +29 -21
  87. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/Protocols/AnyNodeProperty.swift +16 -10
  88. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/Protocols/AnyValueContainer.swift +6 -6
  89. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/Protocols/KeypathSearchable.swift +5 -5
  90. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/Protocols/NodePropertyMap.swift +10 -8
  91. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/ValueContainer.swift +25 -21
  92. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/ValueProviders/GroupInterpolator.swift +23 -17
  93. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/ValueProviders/KeyframeInterpolator.swift +125 -108
  94. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/ValueProviders/SingleValueProvider.swift +22 -17
  95. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/ModifierNodes/TrimPathNode.swift +110 -79
  96. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/OutputNodes/GroupOutputNode.swift +22 -16
  97. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/OutputNodes/PassThroughOutputNode.swift +19 -15
  98. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/OutputNodes/PathOutputNode.swift +22 -20
  99. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/OutputNodes/Renderables/FillRenderer.swift +22 -23
  100. package/Sources/Private/MainThread/NodeRenderSystem/Nodes/OutputNodes/Renderables/GradientFillRenderer.swift +242 -0
  101. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/OutputNodes/Renderables/GradientStrokeRenderer.swift +30 -24
  102. package/{lottie-swift/src/Private/NodeRenderSystem/Nodes/OutputNodes/Renderables/GradientFillRenderer.swift → Sources/Private/MainThread/NodeRenderSystem/Nodes/OutputNodes/Renderables/LegacyGradientFillRenderer.swift} +93 -66
  103. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/OutputNodes/Renderables/StrokeRenderer.swift +23 -19
  104. package/Sources/Private/MainThread/NodeRenderSystem/Nodes/PathNodes/EllipseNode.swift +139 -0
  105. package/Sources/Private/MainThread/NodeRenderSystem/Nodes/PathNodes/PolygonNode.swift +170 -0
  106. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/PathNodes/RectNode.swift +95 -58
  107. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/PathNodes/ShapeNode.swift +42 -29
  108. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/PathNodes/StarNode.swift +108 -69
  109. package/Sources/Private/MainThread/NodeRenderSystem/Nodes/RenderContainers/GroupNode.swift +155 -0
  110. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/RenderNodes/FillNode.swift +51 -37
  111. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/RenderNodes/GradientFillNode.swift +54 -42
  112. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/RenderNodes/GradientStrokeNode.swift +65 -57
  113. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/RenderNodes/StrokeNode.swift +84 -58
  114. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/Text/TextAnimatorNode.swift +138 -119
  115. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Protocols/AnimatorNode.swift +80 -79
  116. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Protocols/PathNode.swift +5 -3
  117. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Protocols/RenderNode.swift +22 -17
  118. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/RenderLayers/ShapeContainerLayer.swift +27 -24
  119. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/RenderLayers/ShapeRenderLayer.swift +34 -25
  120. package/Sources/Private/Model/Animation.swift +160 -0
  121. package/Sources/Private/Model/Assets/Asset.swift +43 -0
  122. package/{lottie-swift/src → Sources}/Private/Model/Assets/AssetLibrary.swift +40 -13
  123. package/Sources/Private/Model/Assets/ImageAsset.swift +112 -0
  124. package/{lottie-swift/src → Sources}/Private/Model/Assets/PrecompAsset.swift +20 -10
  125. package/Sources/Private/Model/DictionaryInitializable.swift +67 -0
  126. package/Sources/Private/Model/Extensions/Bundle.swift +34 -0
  127. package/{lottie-swift/src → Sources}/Private/Model/Extensions/KeyedDecodingContainerExtensions.swift +8 -4
  128. package/Sources/Private/Model/Keyframes/KeyframeData.swift +113 -0
  129. package/Sources/Private/Model/Keyframes/KeyframeGroup.swift +197 -0
  130. package/{lottie-swift/src → Sources}/Private/Model/Layers/ImageLayerModel.swift +21 -11
  131. package/Sources/Private/Model/Layers/LayerModel.swift +228 -0
  132. package/{lottie-swift/src → Sources}/Private/Model/Layers/PreCompLayerModel.swift +39 -22
  133. package/{lottie-swift/src → Sources}/Private/Model/Layers/ShapeLayerModel.swift +23 -12
  134. package/{lottie-swift/src → Sources}/Private/Model/Layers/SolidLayerModel.swift +31 -19
  135. package/{lottie-swift/src → Sources}/Private/Model/Layers/TextLayerModel.swift +33 -19
  136. package/Sources/Private/Model/Objects/DashPattern.swift +44 -0
  137. package/Sources/Private/Model/Objects/Marker.swift +33 -0
  138. package/Sources/Private/Model/Objects/Mask.swift +80 -0
  139. package/Sources/Private/Model/Objects/Transform.swift +179 -0
  140. package/Sources/Private/Model/ShapeItems/Ellipse.swift +75 -0
  141. package/Sources/Private/Model/ShapeItems/Fill.swift +74 -0
  142. package/Sources/Private/Model/ShapeItems/GradientFill.swift +124 -0
  143. package/Sources/Private/Model/ShapeItems/GradientStroke.swift +186 -0
  144. package/Sources/Private/Model/ShapeItems/Group.swift +48 -0
  145. package/{lottie-swift/src → Sources}/Private/Model/ShapeItems/Merge.swift +29 -11
  146. package/Sources/Private/Model/ShapeItems/Rectangle.swift +73 -0
  147. package/Sources/Private/Model/ShapeItems/Repeater.swift +136 -0
  148. package/Sources/Private/Model/ShapeItems/Shape.swift +56 -0
  149. package/Sources/Private/Model/ShapeItems/ShapeItem.swift +163 -0
  150. package/Sources/Private/Model/ShapeItems/ShapeTransform.swift +136 -0
  151. package/Sources/Private/Model/ShapeItems/Star.swift +132 -0
  152. package/Sources/Private/Model/ShapeItems/Stroke.swift +102 -0
  153. package/Sources/Private/Model/ShapeItems/Trim.swift +78 -0
  154. package/Sources/Private/Model/Text/Font.swift +61 -0
  155. package/{lottie-swift/src → Sources}/Private/Model/Text/Glyph.swift +63 -39
  156. package/Sources/Private/Model/Text/TextAnimator.swift +164 -0
  157. package/Sources/Private/Model/Text/TextDocument.swift +123 -0
  158. package/Sources/Private/RootAnimationLayer.swift +51 -0
  159. package/{lottie-swift/src → Sources}/Private/Utility/Debugging/AnimatorNodeDebugging.swift +7 -7
  160. package/{lottie-swift/src → Sources}/Private/Utility/Debugging/LayerDebugging.swift +72 -48
  161. package/Sources/Private/Utility/Debugging/TestHelpers.swift +10 -0
  162. package/{lottie-swift/src → Sources}/Private/Utility/Extensions/AnimationKeypathExtension.swift +69 -59
  163. package/Sources/Private/Utility/Extensions/BlendMode+Filter.swift +31 -0
  164. package/Sources/Private/Utility/Extensions/CGColor+RGB.swift +22 -0
  165. package/{lottie-swift/src → Sources}/Private/Utility/Extensions/CGFloatExtensions.swift +70 -67
  166. package/Sources/Private/Utility/Extensions/DataExtension.swift +27 -0
  167. package/Sources/Private/Utility/Extensions/MathKit.swift +450 -0
  168. package/Sources/Private/Utility/Extensions/StringExtensions.swift +38 -0
  169. package/{lottie-swift/src → Sources}/Private/Utility/Helpers/AnimationContext.swift +42 -16
  170. package/Sources/Private/Utility/Interpolatable/InterpolatableExtensions.swift +134 -0
  171. package/{lottie-swift/src → Sources}/Private/Utility/Interpolatable/KeyframeExtensions.swift +13 -10
  172. package/Sources/Private/Utility/Interpolatable/KeyframeGroup+Extensions.swift +59 -0
  173. package/{lottie-swift/src → Sources}/Private/Utility/Primitives/BezierPath.swift +229 -143
  174. package/Sources/Private/Utility/Primitives/CGPointExtension.swift +35 -0
  175. package/{lottie-swift/src → Sources}/Private/Utility/Primitives/ColorExtension.swift +46 -14
  176. package/{lottie-swift/src → Sources}/Private/Utility/Primitives/CompoundBezierPath.swift +58 -49
  177. package/Sources/Private/Utility/Primitives/CurveVertex.swift +184 -0
  178. package/Sources/Private/Utility/Primitives/PathElement.swift +75 -0
  179. package/Sources/Private/Utility/Primitives/UnitBezier.swift +115 -0
  180. package/Sources/Private/Utility/Primitives/VectorsExtensions.swift +341 -0
  181. package/Sources/Public/Animation/AnimationPublic.swift +266 -0
  182. package/Sources/Public/Animation/AnimationView.swift +1335 -0
  183. package/Sources/Public/Animation/AnimationViewInitializers.swift +109 -0
  184. package/Sources/Public/AnimationCache/AnimationCacheProvider.swift +22 -0
  185. package/{lottie-swift/src → Sources}/Public/AnimationCache/LRUAnimationCache.swift +22 -18
  186. package/Sources/Public/DynamicProperties/AnimationKeypath.swift +49 -0
  187. package/Sources/Public/DynamicProperties/AnyValueProvider.swift +132 -0
  188. package/{lottie-swift/src → Sources}/Public/DynamicProperties/ValueProviders/ColorValueProvider.swift +54 -36
  189. package/{lottie-swift/src → Sources}/Public/DynamicProperties/ValueProviders/FloatValueProvider.swift +40 -36
  190. package/Sources/Public/DynamicProperties/ValueProviders/GradientValueProvider.swift +123 -0
  191. package/{lottie-swift/src → Sources}/Public/DynamicProperties/ValueProviders/PointValueProvider.swift +40 -35
  192. package/{lottie-swift/src → Sources}/Public/DynamicProperties/ValueProviders/SizeValueProvider.swift +40 -35
  193. package/{lottie-swift/src → Sources}/Public/FontProvider/AnimationFontProvider.swift +15 -8
  194. package/Sources/Public/ImageProvider/AnimationImageProvider.swift +21 -0
  195. package/Sources/Public/Keyframes/Interpolatable.swift +253 -0
  196. package/Sources/Public/Keyframes/Keyframe.swift +92 -0
  197. package/Sources/Public/Logging/LottieLogger.swift +137 -0
  198. package/Sources/Public/LottieConfiguration.swift +143 -0
  199. package/{lottie-swift/src → Sources}/Public/Primitives/AnimationTime.swift +1 -1
  200. package/{lottie-swift/src → Sources}/Public/Primitives/Color.swift +10 -6
  201. package/{lottie-swift/src → Sources}/Public/Primitives/Vectors.swift +13 -12
  202. package/Sources/Public/TextProvider/AnimationTextProvider.swift +53 -0
  203. package/{lottie-swift/src → Sources}/Public/iOS/AnimatedButton.swift +42 -26
  204. package/{lottie-swift/src → Sources}/Public/iOS/AnimatedControl.swift +100 -91
  205. package/{lottie-swift/src → Sources}/Public/iOS/AnimatedSwitch.swift +128 -94
  206. package/{lottie-swift/src → Sources}/Public/iOS/AnimationSubview.swift +3 -3
  207. package/Sources/Public/iOS/AnimationViewBase.swift +78 -0
  208. package/{lottie-swift/src → Sources}/Public/iOS/BundleImageProvider.swift +36 -34
  209. package/{lottie-swift/src → Sources}/Public/iOS/Compatibility/CompatibleAnimationKeypath.swift +4 -0
  210. package/{lottie-swift/src → Sources}/Public/iOS/Compatibility/CompatibleAnimationView.swift +38 -29
  211. package/{lottie-swift/src → Sources}/Public/iOS/FilepathImageProvider.swift +24 -21
  212. package/{lottie-swift/src → Sources}/Public/iOS/UIColorExtension.swift +4 -4
  213. package/{lottie-swift/src/Public/MacOS/AnimationSubview.swift → Sources/Public/macOS/AnimationSubview.macOS.swift} +4 -5
  214. package/{lottie-swift/src/Public/MacOS/LottieView.swift → Sources/Public/macOS/AnimationViewBase.macOS.swift} +58 -50
  215. package/{lottie-swift/src/Public/MacOS/BundleImageProvider.swift → Sources/Public/macOS/BundleImageProvider.macOS.swift} +31 -32
  216. package/Sources/Public/macOS/FilepathImageProvider.macOS.swift +67 -0
  217. package/Tests/AnimationKeypathTests.swift +94 -0
  218. package/Tests/AutomaticEngineTests.swift +57 -0
  219. package/Tests/BundleTests.swift +25 -0
  220. package/Tests/DataURLTests.swift +64 -0
  221. package/Tests/ParsingTests.swift +43 -0
  222. package/Tests/PerformanceTests.swift +215 -0
  223. package/Tests/SnapshotConfiguration.swift +153 -0
  224. package/Tests/SnapshotTests.swift +265 -0
  225. package/Tests/Utils/Bundle+Module.swift +30 -0
  226. package/Tests/Utils/HardcodedFontProvider.swift +19 -0
  227. package/Tests/Utils/HardcodedImageProvider.swift +23 -0
  228. package/Tests/Utils/Snapshotting+presentationLayer.swift +47 -0
  229. package/Tests/ValueProvidersTests.swift +27 -0
  230. package/lottie-ios.podspec +11 -12
  231. package/package.json +1 -1
  232. package/script/test-carthage/Cartfile +1 -0
  233. package/script/test-carthage/Cartfile.resolved +1 -0
  234. package/script/test-carthage/CarthageTest/AppDelegate.swift +26 -0
  235. package/script/test-carthage/CarthageTest/Assets.xcassets/AccentColor.colorset/Contents.json +11 -0
  236. package/script/test-carthage/CarthageTest/Assets.xcassets/AppIcon.appiconset/Contents.json +98 -0
  237. package/script/test-carthage/CarthageTest/Assets.xcassets/Contents.json +6 -0
  238. package/script/test-carthage/CarthageTest/Base.lproj/LaunchScreen.storyboard +25 -0
  239. package/script/test-carthage/CarthageTest/Base.lproj/Main.storyboard +24 -0
  240. package/script/test-carthage/CarthageTest/Info.plist +66 -0
  241. package/script/test-carthage/CarthageTest/SceneDelegate.swift +10 -0
  242. package/script/test-carthage/CarthageTest/ViewController.swift +15 -0
  243. package/script/test-carthage/CarthageTest-macOS/AppDelegate.swift +7 -0
  244. package/script/test-carthage/CarthageTest-macOS/Assets.xcassets/AccentColor.colorset/Contents.json +11 -0
  245. package/script/test-carthage/CarthageTest-macOS/Assets.xcassets/AppIcon.appiconset/Contents.json +58 -0
  246. package/script/test-carthage/CarthageTest-macOS/Assets.xcassets/Contents.json +6 -0
  247. package/script/test-carthage/CarthageTest-macOS/Base.lproj/Main.storyboard +717 -0
  248. package/script/test-carthage/CarthageTest-macOS/CarthageTest_macOS.entitlements +10 -0
  249. package/script/test-carthage/CarthageTest-macOS/ViewController.swift +15 -0
  250. package/script/test-carthage/CarthageTest.xcodeproj/project.pbxproj +532 -0
  251. package/script/test-carthage/CarthageTest.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
  252. package/script/test-carthage/CarthageTest.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
  253. package/script/test-carthage/CarthageTest.xcodeproj/project.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  254. package/script/test-carthage/CarthageTest.xcodeproj/project.xcworkspace/xcuserdata/calstephens.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  255. package/script/test-carthage/CarthageTest.xcodeproj/xcuserdata/cal.xcuserdatad/xcschemes/xcschememanagement.plist +14 -0
  256. package/script/test-carthage/CarthageTest.xcodeproj/xcuserdata/calstephens.xcuserdatad/xcschemes/xcschememanagement.plist +19 -0
  257. package/script/test-carthage/Mintfile +1 -0
  258. package/script/test-spm/LottieSPM.xcworkspace/contents.xcworkspacedata +7 -0
  259. package/script/test-spm/LottieSPM.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  260. package/script/test-spm/Mintfile +1 -0
  261. package/.swiftpm/xcode/package.xcworkspace/xcuserdata/brandonwithrow.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  262. package/Lottie/Info.plist +0 -22
  263. package/Lottie.xcodeproj/project.xcworkspace/xcuserdata/brandonwithrow.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  264. package/Lottie.xcodeproj/xcuserdata/brandonwithrow.xcuserdatad/xcschemes/LottieLibraryMacOS.xcscheme +0 -80
  265. package/Lottie.xcodeproj/xcuserdata/brandonwithrow.xcuserdatad/xcschemes/xcschememanagement.plist +0 -57
  266. package/lottie-swift/Assets/.gitkeep +0 -0
  267. package/lottie-swift/src/Private/LayerContainers/Utility/LayerFontProvider.swift +0 -37
  268. package/lottie-swift/src/Private/LayerContainers/Utility/LayerTextProvider.swift +0 -36
  269. package/lottie-swift/src/Private/Model/Animation.swift +0 -107
  270. package/lottie-swift/src/Private/Model/Assets/Asset.swift +0 -27
  271. package/lottie-swift/src/Private/Model/Assets/ImageAsset.swift +0 -48
  272. package/lottie-swift/src/Private/Model/Keyframes/Keyframe.swift +0 -128
  273. package/lottie-swift/src/Private/Model/Keyframes/KeyframeGroup.swift +0 -108
  274. package/lottie-swift/src/Private/Model/Layers/LayerModel.swift +0 -150
  275. package/lottie-swift/src/Private/Model/Objects/DashPattern.swift +0 -24
  276. package/lottie-swift/src/Private/Model/Objects/Marker.swift +0 -23
  277. package/lottie-swift/src/Private/Model/Objects/Mask.swift +0 -48
  278. package/lottie-swift/src/Private/Model/Objects/Transform.swift +0 -105
  279. package/lottie-swift/src/Private/Model/ShapeItems/Ellipse.swift +0 -50
  280. package/lottie-swift/src/Private/Model/ShapeItems/FillI.swift +0 -49
  281. package/lottie-swift/src/Private/Model/ShapeItems/GradientFill.swift +0 -86
  282. package/lottie-swift/src/Private/Model/ShapeItems/GradientStroke.swift +0 -125
  283. package/lottie-swift/src/Private/Model/ShapeItems/Group.swift +0 -32
  284. package/lottie-swift/src/Private/Model/ShapeItems/Rectangle.swift +0 -50
  285. package/lottie-swift/src/Private/Model/ShapeItems/Repeater.swift +0 -80
  286. package/lottie-swift/src/Private/Model/ShapeItems/Shape.swift +0 -37
  287. package/lottie-swift/src/Private/Model/ShapeItems/ShapeItem.swift +0 -95
  288. package/lottie-swift/src/Private/Model/ShapeItems/ShapeTransform.swift +0 -68
  289. package/lottie-swift/src/Private/Model/ShapeItems/Star.swift +0 -86
  290. package/lottie-swift/src/Private/Model/ShapeItems/Stroke.swift +0 -67
  291. package/lottie-swift/src/Private/Model/ShapeItems/Trim.swift +0 -53
  292. package/lottie-swift/src/Private/Model/Text/Font.swift +0 -35
  293. package/lottie-swift/src/Private/Model/Text/TextAnimator.swift +0 -99
  294. package/lottie-swift/src/Private/Model/Text/TextDocument.swift +0 -70
  295. package/lottie-swift/src/Private/NodeRenderSystem/Nodes/PathNodes/EllipseNode.swift +0 -109
  296. package/lottie-swift/src/Private/NodeRenderSystem/Nodes/PathNodes/PolygonNode.swift +0 -132
  297. package/lottie-swift/src/Private/NodeRenderSystem/Nodes/RenderContainers/GroupNode.swift +0 -141
  298. package/lottie-swift/src/Private/Utility/Extensions/MathKit.swift +0 -539
  299. package/lottie-swift/src/Private/Utility/Extensions/StringExtensions.swift +0 -32
  300. package/lottie-swift/src/Private/Utility/Interpolatable/Interpolatable.swift +0 -18
  301. package/lottie-swift/src/Private/Utility/Interpolatable/InterpolatableExtensions.swift +0 -170
  302. package/lottie-swift/src/Private/Utility/Primitives/CurveVertex.swift +0 -177
  303. package/lottie-swift/src/Private/Utility/Primitives/PathElement.swift +0 -68
  304. package/lottie-swift/src/Private/Utility/Primitives/VectorsExtensions.swift +0 -218
  305. package/lottie-swift/src/Public/Animation/AnimationPublic.swift +0 -196
  306. package/lottie-swift/src/Public/Animation/AnimationView.swift +0 -1006
  307. package/lottie-swift/src/Public/Animation/AnimationViewInitializers.swift +0 -83
  308. package/lottie-swift/src/Public/AnimationCache/AnimationCacheProvider.swift +0 -24
  309. package/lottie-swift/src/Public/DynamicProperties/AnimationKeypath.swift +0 -46
  310. package/lottie-swift/src/Public/DynamicProperties/AnyValueProvider.swift +0 -29
  311. package/lottie-swift/src/Public/DynamicProperties/ValueProviders/GradientValueProvider.swift +0 -114
  312. package/lottie-swift/src/Public/ImageProvider/AnimationImageProvider.swift +0 -23
  313. package/lottie-swift/src/Public/MacOS/FilepathImageProvider.swift +0 -67
  314. package/lottie-swift/src/Public/TextProvider/AnimationTextProvider.swift +0 -39
  315. package/lottie-swift/src/Public/iOS/LottieView.swift +0 -62
  316. package/lottie-swift-testing.podspec +0 -32
@@ -8,70 +8,37 @@
8
8
  import Foundation
9
9
  import QuartzCore
10
10
 
11
- /**
12
- The base class for a child layer of CompositionContainer
13
- */
11
+ // MARK: - CompositionLayer
12
+
13
+ /// The base class for a child layer of CompositionContainer
14
14
  class CompositionLayer: CALayer, KeypathSearchable {
15
-
16
- weak var layerDelegate: CompositionLayerDelegate?
17
-
18
- let transformNode: LayerTransformNode
19
-
20
- let contentsLayer: CALayer = CALayer()
21
-
22
- let maskLayer: MaskContainerLayer?
23
-
24
- let matteType: MatteType?
25
-
26
- var renderScale: CGFloat = 1 {
27
- didSet {
28
- self.updateRenderScale()
29
- }
30
- }
31
-
32
- var matteLayer: CompositionLayer? {
33
- didSet {
34
- if let matte = matteLayer {
35
- if let type = matteType, type == .invert {
36
- mask = InvertedMatteLayer(inputMatte: matte)
37
- } else {
38
- mask = matte
39
- }
40
- } else {
41
- mask = nil
42
- }
43
- }
44
- }
45
-
46
- let inFrame: CGFloat
47
- let outFrame: CGFloat
48
- let startFrame: CGFloat
49
- let timeStretch: CGFloat
50
-
15
+
16
+ // MARK: Lifecycle
17
+
51
18
  init(layer: LayerModel, size: CGSize) {
52
- self.transformNode = LayerTransformNode(transform: layer.transform)
19
+ transformNode = LayerTransformNode(transform: layer.transform)
53
20
  if let masks = layer.masks {
54
21
  maskLayer = MaskContainerLayer(masks: masks)
55
22
  } else {
56
23
  maskLayer = nil
57
24
  }
58
- self.matteType = layer.matte
59
- self.inFrame = layer.inFrame.cgFloat
60
- self.outFrame = layer.outFrame.cgFloat
61
- self.timeStretch = layer.timeStretch.cgFloat
62
- self.startFrame = layer.startTime.cgFloat
63
- self.keypathName = layer.name
64
- self.childKeypaths = [transformNode.transformProperties]
25
+ matteType = layer.matte
26
+ inFrame = layer.inFrame.cgFloat
27
+ outFrame = layer.outFrame.cgFloat
28
+ timeStretch = layer.timeStretch.cgFloat
29
+ startFrame = layer.startTime.cgFloat
30
+ keypathName = layer.name
31
+ childKeypaths = [transformNode.transformProperties]
65
32
  super.init()
66
- self.anchorPoint = .zero
67
- self.actions = [
33
+ anchorPoint = .zero
34
+ actions = [
68
35
  "opacity" : NSNull(),
69
36
  "transform" : NSNull(),
70
37
  "bounds" : NSNull(),
71
38
  "anchorPoint" : NSNull(),
72
- "sublayerTransform" : NSNull()
39
+ "sublayerTransform" : NSNull(),
73
40
  ]
74
-
41
+
75
42
  contentsLayer.anchorPoint = .zero
76
43
  contentsLayer.bounds = CGRect(origin: .zero, size: size)
77
44
  contentsLayer.actions = [
@@ -80,36 +47,90 @@ class CompositionLayer: CALayer, KeypathSearchable {
80
47
  "bounds" : NSNull(),
81
48
  "anchorPoint" : NSNull(),
82
49
  "sublayerTransform" : NSNull(),
83
- "hidden" : NSNull()
50
+ "hidden" : NSNull(),
84
51
  ]
52
+ compositingFilter = layer.blendMode.filterName
85
53
  addSublayer(contentsLayer)
86
-
54
+
87
55
  if let maskLayer = maskLayer {
88
56
  contentsLayer.mask = maskLayer
89
57
  }
58
+
59
+ name = layer.name
90
60
  }
91
-
61
+
92
62
  override init(layer: Any) {
93
63
  /// Used for creating shadow model layers. Read More here: https://developer.apple.com/documentation/quartzcore/calayer/1410842-init
94
64
  guard let layer = layer as? CompositionLayer else {
95
65
  fatalError("Wrong Layer Class")
96
66
  }
97
- self.transformNode = layer.transformNode
98
- self.matteType = layer.matteType
99
- self.inFrame = layer.inFrame
100
- self.outFrame = layer.outFrame
101
- self.timeStretch = layer.timeStretch
102
- self.startFrame = layer.startFrame
103
- self.keypathName = layer.keypathName
104
- self.childKeypaths = [transformNode.transformProperties]
105
- self.maskLayer = nil
67
+ transformNode = layer.transformNode
68
+ matteType = layer.matteType
69
+ inFrame = layer.inFrame
70
+ outFrame = layer.outFrame
71
+ timeStretch = layer.timeStretch
72
+ startFrame = layer.startFrame
73
+ keypathName = layer.keypathName
74
+ childKeypaths = [transformNode.transformProperties]
75
+ maskLayer = nil
106
76
  super.init(layer: layer)
107
77
  }
108
-
109
- required init?(coder aDecoder: NSCoder) {
78
+
79
+ required init?(coder _: NSCoder) {
110
80
  fatalError("init(coder:) has not been implemented")
111
81
  }
112
-
82
+
83
+ // MARK: Internal
84
+
85
+ weak var layerDelegate: CompositionLayerDelegate?
86
+
87
+ let transformNode: LayerTransformNode
88
+
89
+ let contentsLayer = CALayer()
90
+
91
+ let maskLayer: MaskContainerLayer?
92
+
93
+ let matteType: MatteType?
94
+
95
+ let inFrame: CGFloat
96
+ let outFrame: CGFloat
97
+ let startFrame: CGFloat
98
+ let timeStretch: CGFloat
99
+
100
+ // MARK: Keypath Searchable
101
+
102
+ let keypathName: String
103
+
104
+ final var childKeypaths: [KeypathSearchable]
105
+
106
+ var renderScale: CGFloat = 1 {
107
+ didSet {
108
+ updateRenderScale()
109
+ }
110
+ }
111
+
112
+ var matteLayer: CompositionLayer? {
113
+ didSet {
114
+ if let matte = matteLayer {
115
+ if let type = matteType, type == .invert {
116
+ mask = InvertedMatteLayer(inputMatte: matte)
117
+ } else {
118
+ mask = matte
119
+ }
120
+ } else {
121
+ mask = nil
122
+ }
123
+ }
124
+ }
125
+
126
+ var keypathProperties: [String: AnyNodeProperty] {
127
+ [:]
128
+ }
129
+
130
+ var keypathLayer: CALayer? {
131
+ contentsLayer
132
+ }
133
+
113
134
  final func displayWithFrame(frame: CGFloat, forceUpdates: Bool) {
114
135
  transformNode.updateTree(frame, forceUpdates: forceUpdates)
115
136
  let layerVisible = frame.isInRangeOrEqual(inFrame, outFrame)
@@ -123,31 +144,18 @@ class CompositionLayer: CALayer, KeypathSearchable {
123
144
  contentsLayer.isHidden = !layerVisible
124
145
  layerDelegate?.frameUpdated(frame: frame)
125
146
  }
126
-
127
- func displayContentsWithFrame(frame: CGFloat, forceUpdates: Bool) {
147
+
148
+ func displayContentsWithFrame(frame _: CGFloat, forceUpdates _: Bool) {
128
149
  /// To be overridden by subclass
129
150
  }
130
-
131
- // MARK: Keypath Searchable
132
-
133
- let keypathName: String
134
-
135
- var keypathProperties: [String : AnyNodeProperty] {
136
- return [:]
137
- }
138
-
139
- final var childKeypaths: [KeypathSearchable]
140
-
141
- var keypathLayer: CALayer? {
142
- return contentsLayer
143
- }
144
-
151
+
145
152
  func updateRenderScale() {
146
- /// To be overridden by subclass
153
+ contentsScale = renderScale
147
154
  }
148
155
  }
149
156
 
157
+ // MARK: - CompositionLayerDelegate
158
+
150
159
  protocol CompositionLayerDelegate: AnyObject {
151
160
  func frameUpdated(frame: CGFloat)
152
161
  }
153
-
@@ -5,43 +5,46 @@
5
5
  // Created by Brandon Withrow on 1/25/19.
6
6
  //
7
7
 
8
- import Foundation
9
8
  import CoreGraphics
9
+ import Foundation
10
10
  import QuartzCore
11
11
 
12
12
  final class ImageCompositionLayer: CompositionLayer {
13
-
14
- var image: CGImage? = nil {
15
- didSet {
16
- if let image = image {
17
- contentsLayer.contents = image
18
- } else {
19
- contentsLayer.contents = nil
20
- }
21
- }
22
- }
23
-
24
- let imageReferenceID: String
25
-
13
+
14
+ // MARK: Lifecycle
15
+
26
16
  init(imageLayer: ImageLayerModel, size: CGSize) {
27
- self.imageReferenceID = imageLayer.referenceID
17
+ imageReferenceID = imageLayer.referenceID
28
18
  super.init(layer: imageLayer, size: size)
29
19
  contentsLayer.masksToBounds = true
30
20
  contentsLayer.contentsGravity = CALayerContentsGravity.resize
31
21
  }
32
-
22
+
33
23
  override init(layer: Any) {
34
24
  /// Used for creating shadow model layers. Read More here: https://developer.apple.com/documentation/quartzcore/calayer/1410842-init
35
25
  guard let layer = layer as? ImageCompositionLayer else {
36
26
  fatalError("init(layer:) Wrong Layer Class")
37
27
  }
38
- self.imageReferenceID = layer.imageReferenceID
39
- self.image = nil
28
+ imageReferenceID = layer.imageReferenceID
29
+ image = nil
40
30
  super.init(layer: layer)
41
31
  }
42
-
43
- required init?(coder aDecoder: NSCoder) {
32
+
33
+ required init?(coder _: NSCoder) {
44
34
  fatalError("init(coder:) has not been implemented")
45
35
  }
46
-
36
+
37
+ // MARK: Internal
38
+
39
+ let imageReferenceID: String
40
+
41
+ var image: CGImage? = nil {
42
+ didSet {
43
+ if let image = image {
44
+ contentsLayer.contents = image
45
+ } else {
46
+ contentsLayer.contents = nil
47
+ }
48
+ }
49
+ }
47
50
  }
@@ -29,13 +29,17 @@ extension MaskMode {
29
29
  }
30
30
  }
31
31
 
32
+ // MARK: - MaskContainerLayer
33
+
32
34
  final class MaskContainerLayer: CALayer {
33
-
35
+
36
+ // MARK: Lifecycle
37
+
34
38
  init(masks: [Mask]) {
35
39
  super.init()
36
40
  anchorPoint = .zero
37
41
  var containerLayer = CALayer()
38
- var firstObject: Bool = true
42
+ var firstObject = true
39
43
  for mask in masks {
40
44
  let maskLayer = MaskLayer(mask: mask)
41
45
  maskLayers.append(maskLayer)
@@ -53,7 +57,7 @@ final class MaskContainerLayer: CALayer {
53
57
  }
54
58
  addSublayer(containerLayer)
55
59
  }
56
-
60
+
57
61
  override init(layer: Any) {
58
62
  /// Used for creating shadow model layers. Read More here: https://developer.apple.com/documentation/quartzcore/calayer/1410842-init
59
63
  guard let layer = layer as? MaskContainerLayer else {
@@ -61,71 +65,84 @@ final class MaskContainerLayer: CALayer {
61
65
  }
62
66
  super.init(layer: layer)
63
67
  }
64
-
65
- fileprivate var maskLayers: [MaskLayer] = []
66
-
68
+
69
+ required init?(coder _: NSCoder) {
70
+ fatalError("init(coder:) has not been implemented")
71
+ }
72
+
73
+ // MARK: Internal
74
+
67
75
  func updateWithFrame(frame: CGFloat, forceUpdates: Bool) {
68
76
  maskLayers.forEach({ $0.updateWithFrame(frame: frame, forceUpdates: forceUpdates) })
69
77
  }
70
-
71
- required init?(coder aDecoder: NSCoder) {
72
- fatalError("init(coder:) has not been implemented")
73
- }
78
+
79
+ // MARK: Fileprivate
80
+
81
+ fileprivate var maskLayers: [MaskLayer] = []
74
82
  }
75
83
 
76
84
  extension CGRect {
77
85
  static var veryLargeRect: CGRect {
78
- return CGRect(x: -100_000_000,
79
- y: -100_000_000,
80
- width: 200_000_000,
81
- height: 200_000_000)
86
+ CGRect(
87
+ x: -100_000_000,
88
+ y: -100_000_000,
89
+ width: 200_000_000,
90
+ height: 200_000_000)
82
91
  }
83
92
  }
84
93
 
85
- fileprivate class MaskLayer: CALayer {
86
-
87
- let properties: MaskNodeProperties?
88
-
89
- let maskLayer = CAShapeLayer()
90
-
94
+ // MARK: - MaskLayer
95
+
96
+ private class MaskLayer: CALayer {
97
+
98
+ // MARK: Lifecycle
99
+
91
100
  init(mask: Mask) {
92
- self.properties = MaskNodeProperties(mask: mask)
101
+ properties = MaskNodeProperties(mask: mask)
93
102
  super.init()
94
103
  addSublayer(maskLayer)
95
104
  anchorPoint = .zero
96
- maskLayer.fillColor = mask.mode == .add ? CGColor(colorSpace: CGColorSpaceCreateDeviceRGB(), components: [1, 0, 0, 1]) :
97
- CGColor(colorSpace: CGColorSpaceCreateDeviceRGB(), components: [0, 1, 0, 1])
105
+ maskLayer.fillColor = mask.mode == .add
106
+ ? CGColor(colorSpace: CGColorSpaceCreateDeviceRGB(), components: [1, 0, 0, 1])
107
+ : CGColor(colorSpace: CGColorSpaceCreateDeviceRGB(), components: [0, 1, 0, 1])
98
108
  maskLayer.fillRule = CAShapeLayerFillRule.evenOdd
99
- self.actions = [
100
- "opacity" : NSNull()
109
+ actions = [
110
+ "opacity" : NSNull(),
101
111
  ]
102
-
103
112
  }
104
-
113
+
105
114
  override init(layer: Any) {
106
- self.properties = nil
115
+ properties = nil
107
116
  super.init(layer: layer)
108
117
  }
109
-
110
- required init?(coder aDecoder: NSCoder) {
118
+
119
+ required init?(coder _: NSCoder) {
111
120
  fatalError("init(coder:) has not been implemented")
112
121
  }
113
-
122
+
123
+ // MARK: Internal
124
+
125
+ let properties: MaskNodeProperties?
126
+
127
+ let maskLayer = CAShapeLayer()
128
+
114
129
  func updateWithFrame(frame: CGFloat, forceUpdates: Bool) {
115
130
  guard let properties = properties else { return }
116
131
  if properties.opacity.needsUpdate(frame: frame) || forceUpdates {
117
132
  properties.opacity.update(frame: frame)
118
- self.opacity = Float(properties.opacity.value.cgFloatValue)
133
+ opacity = Float(properties.opacity.value.cgFloatValue)
119
134
  }
120
-
135
+
121
136
  if properties.shape.needsUpdate(frame: frame) || forceUpdates {
122
137
  properties.shape.update(frame: frame)
123
138
  properties.expansion.update(frame: frame)
124
-
139
+
125
140
  let shapePath = properties.shape.value.cgPath()
126
141
  var path = shapePath
127
- if properties.mode.usableMode == .subtract && !properties.inverted ||
128
- (properties.mode.usableMode == .add && properties.inverted) {
142
+ if
143
+ properties.mode.usableMode == .subtract && !properties.inverted ||
144
+ (properties.mode.usableMode == .add && properties.inverted)
145
+ {
129
146
  /// Add a bounds rect to invert the mask
130
147
  let newPath = CGMutablePath()
131
148
  newPath.addRect(CGRect.veryLargeRect)
@@ -134,35 +151,39 @@ fileprivate class MaskLayer: CALayer {
134
151
  }
135
152
  maskLayer.path = path
136
153
  }
137
-
138
154
  }
139
155
  }
140
156
 
141
- fileprivate class MaskNodeProperties: NodePropertyMap {
142
-
143
- var propertyMap: [String : AnyNodeProperty]
144
-
145
- var properties: [AnyNodeProperty]
146
-
157
+ // MARK: - MaskNodeProperties
158
+
159
+ private class MaskNodeProperties: NodePropertyMap {
160
+
161
+ // MARK: Lifecycle
162
+
147
163
  init(mask: Mask) {
148
- self.mode = mask.mode
149
- self.inverted = mask.inverted
150
- self.opacity = NodeProperty(provider: KeyframeInterpolator(keyframes: mask.opacity.keyframes))
151
- self.shape = NodeProperty(provider: KeyframeInterpolator(keyframes: mask.shape.keyframes))
152
- self.expansion = NodeProperty(provider: KeyframeInterpolator(keyframes: mask.expansion.keyframes))
153
- self.propertyMap = [
164
+ mode = mask.mode
165
+ inverted = mask.inverted
166
+ opacity = NodeProperty(provider: KeyframeInterpolator(keyframes: mask.opacity.keyframes))
167
+ shape = NodeProperty(provider: KeyframeInterpolator(keyframes: mask.shape.keyframes))
168
+ expansion = NodeProperty(provider: KeyframeInterpolator(keyframes: mask.expansion.keyframes))
169
+ propertyMap = [
154
170
  "Opacity" : opacity,
155
171
  "Shape" : shape,
156
- "Expansion" : expansion
172
+ "Expansion" : expansion,
157
173
  ]
158
- self.properties = Array(self.propertyMap.values)
174
+ properties = Array(propertyMap.values)
159
175
  }
160
-
176
+
177
+ // MARK: Internal
178
+
179
+ var propertyMap: [String: AnyNodeProperty]
180
+
181
+ var properties: [AnyNodeProperty]
182
+
161
183
  let mode: MaskMode
162
184
  let inverted: Bool
163
-
185
+
164
186
  let opacity: NodeProperty<Vector1D>
165
187
  let shape: NodeProperty<BezierPath>
166
188
  let expansion: NodeProperty<Vector1D>
167
189
  }
168
-
@@ -8,15 +8,15 @@
8
8
  import Foundation
9
9
 
10
10
  final class NullCompositionLayer: CompositionLayer {
11
-
11
+
12
12
  init(layer: LayerModel) {
13
13
  super.init(layer: layer, size: .zero)
14
14
  }
15
-
16
- required init?(coder aDecoder: NSCoder) {
15
+
16
+ required init?(coder _: NSCoder) {
17
17
  fatalError("init(coder:) has not been implemented")
18
18
  }
19
-
19
+
20
20
  override init(layer: Any) {
21
21
  /// Used for creating shadow model layers. Read More here: https://developer.apple.com/documentation/quartzcore/calayer/1410842-init
22
22
  guard let layer = layer as? NullCompositionLayer else {
@@ -24,5 +24,5 @@ final class NullCompositionLayer: CompositionLayer {
24
24
  }
25
25
  super.init(layer: layer)
26
26
  }
27
-
27
+
28
28
  }
@@ -9,35 +9,41 @@ import Foundation
9
9
  import QuartzCore
10
10
 
11
11
  final class PreCompositionLayer: CompositionLayer {
12
-
13
- let frameRate: CGFloat
14
- let remappingNode: NodeProperty<Vector1D>?
15
- fileprivate var animationLayers: [CompositionLayer]
16
-
17
- init(precomp: PreCompLayerModel,
18
- asset: PrecompAsset,
19
- layerImageProvider: LayerImageProvider,
20
- textProvider: AnimationTextProvider,
21
- fontProvider: AnimationFontProvider,
22
- assetLibrary: AssetLibrary?,
23
- frameRate: CGFloat) {
24
- self.animationLayers = []
12
+
13
+ // MARK: Lifecycle
14
+
15
+ init(
16
+ precomp: PreCompLayerModel,
17
+ asset: PrecompAsset,
18
+ layerImageProvider: LayerImageProvider,
19
+ textProvider: AnimationTextProvider,
20
+ fontProvider: AnimationFontProvider,
21
+ assetLibrary: AssetLibrary?,
22
+ frameRate: CGFloat)
23
+ {
24
+ animationLayers = []
25
25
  if let keyframes = precomp.timeRemapping?.keyframes {
26
- self.remappingNode = NodeProperty(provider: KeyframeInterpolator(keyframes: keyframes))
26
+ remappingNode = NodeProperty(provider: KeyframeInterpolator(keyframes: keyframes))
27
27
  } else {
28
- self.remappingNode = nil
28
+ remappingNode = nil
29
29
  }
30
30
  self.frameRate = frameRate
31
31
  super.init(layer: precomp, size: CGSize(width: precomp.width, height: precomp.height))
32
+ bounds = CGRect(origin: .zero, size: CGSize(width: precomp.width, height: precomp.height))
32
33
  contentsLayer.masksToBounds = true
33
- contentsLayer.bounds = CGRect(origin: .zero, size: CGSize(width: precomp.width, height: precomp.height))
34
-
35
- let layers = asset.layers.initializeCompositionLayers(assetLibrary: assetLibrary, layerImageProvider: layerImageProvider, textProvider: textProvider, fontProvider: fontProvider, frameRate: frameRate)
36
-
34
+ contentsLayer.bounds = bounds
35
+
36
+ let layers = asset.layers.initializeCompositionLayers(
37
+ assetLibrary: assetLibrary,
38
+ layerImageProvider: layerImageProvider,
39
+ textProvider: textProvider,
40
+ fontProvider: fontProvider,
41
+ frameRate: frameRate)
42
+
37
43
  var imageLayers = [ImageCompositionLayer]()
38
-
44
+
39
45
  var mattedLayer: CompositionLayer? = nil
40
-
46
+
41
47
  for layer in layers.reversed() {
42
48
  layer.bounds = bounds
43
49
  animationLayers.append(layer)
@@ -50,35 +56,49 @@ final class PreCompositionLayer: CompositionLayer {
50
56
  mattedLayer = nil
51
57
  continue
52
58
  }
53
- if let matte = layer.matteType,
54
- (matte == .add || matte == .invert) {
59
+ if
60
+ let matte = layer.matteType,
61
+ matte == .add || matte == .invert
62
+ {
55
63
  /// We have a layer that requires a matte.
56
64
  mattedLayer = layer
57
65
  }
58
66
  contentsLayer.addSublayer(layer)
59
67
  }
60
-
61
- self.childKeypaths.append(contentsOf: layers)
62
-
68
+
69
+ childKeypaths.append(contentsOf: layers)
70
+
63
71
  layerImageProvider.addImageLayers(imageLayers)
64
72
  }
65
-
73
+
66
74
  override init(layer: Any) {
67
75
  /// Used for creating shadow model layers. Read More here: https://developer.apple.com/documentation/quartzcore/calayer/1410842-init
68
76
  guard let layer = layer as? PreCompositionLayer else {
69
77
  fatalError("init(layer:) Wrong Layer Class")
70
78
  }
71
- self.frameRate = layer.frameRate
72
- self.remappingNode = nil
73
- self.animationLayers = []
74
-
79
+ frameRate = layer.frameRate
80
+ remappingNode = nil
81
+ animationLayers = []
82
+
75
83
  super.init(layer: layer)
76
84
  }
77
-
78
- required init?(coder aDecoder: NSCoder) {
85
+
86
+ required init?(coder _: NSCoder) {
79
87
  fatalError("init(coder:) has not been implemented")
80
88
  }
81
-
89
+
90
+ // MARK: Internal
91
+
92
+ let frameRate: CGFloat
93
+ let remappingNode: NodeProperty<Vector1D>?
94
+
95
+ override var keypathProperties: [String: AnyNodeProperty] {
96
+ guard let remappingNode = remappingNode else {
97
+ return super.keypathProperties
98
+ }
99
+ return ["Time Remap" : remappingNode]
100
+ }
101
+
82
102
  override func displayContentsWithFrame(frame: CGFloat, forceUpdates: Bool) {
83
103
  let localFrame: CGFloat
84
104
  if let remappingNode = remappingNode {
@@ -87,18 +107,15 @@ final class PreCompositionLayer: CompositionLayer {
87
107
  } else {
88
108
  localFrame = (frame - startFrame) / timeStretch
89
109
  }
90
- animationLayers.forEach( { $0.displayWithFrame(frame: localFrame, forceUpdates: forceUpdates) })
110
+ animationLayers.forEach({ $0.displayWithFrame(frame: localFrame, forceUpdates: forceUpdates) })
91
111
  }
92
-
93
- override var keypathProperties: [String : AnyNodeProperty] {
94
- guard let remappingNode = remappingNode else {
95
- return super.keypathProperties
96
- }
97
- return ["Time Remap" : remappingNode]
98
- }
99
-
112
+
100
113
  override func updateRenderScale() {
101
114
  super.updateRenderScale()
102
- animationLayers.forEach( { $0.renderScale = renderScale } )
115
+ animationLayers.forEach({ $0.renderScale = renderScale })
103
116
  }
117
+
118
+ // MARK: Fileprivate
119
+
120
+ fileprivate var animationLayers: [CompositionLayer]
104
121
  }