lottie-ios 3.2.3 → 3.4.2

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 (434) 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/.github/workflows/stale_issues.yml +17 -0
  5. package/.spi.yml +6 -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/package.xcworkspace/xcuserdata/calstephens.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  9. package/.swiftpm/xcode/xcuserdata/{brandonwithrow.xcuserdatad → cal.xcuserdatad}/xcschemes/xcschememanagement.plist +25 -15
  10. package/.swiftpm/xcode/xcuserdata/calstephens.xcuserdatad/xcschemes/xcschememanagement.plist +14 -0
  11. package/Gemfile +4 -0
  12. package/Gemfile.lock +102 -0
  13. package/Lottie.xcodeproj/project.pbxproj +2011 -1972
  14. package/Lottie.xcodeproj/project.xcworkspace/contents.xcworkspacedata +1 -1
  15. package/Lottie.xcodeproj/project.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  16. package/Lottie.xcodeproj/xcshareddata/xcschemes/{Lottie_iOS.xcscheme → Lottie (iOS).xcscheme } +15 -18
  17. package/Lottie.xcodeproj/xcshareddata/xcschemes/{Lottie_tvOS.xcscheme → Lottie (macOS).xcscheme } +5 -18
  18. package/Lottie.xcodeproj/xcshareddata/xcschemes/{Lottie_macOS.xcscheme → Lottie (tvOS).xcscheme } +5 -18
  19. package/Lottie.xcodeproj/xcuserdata/cal.xcuserdatad/xcschemes/xcschememanagement.plist +37 -0
  20. package/Lottie.xcodeproj/xcuserdata/calstephens.xcuserdatad/xcschemes/xcschememanagement.plist +24 -0
  21. package/Lottie.xcworkspace/contents.xcworkspacedata +10 -0
  22. package/Lottie.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
  23. package/Lottie.xcworkspace/xcshareddata/swiftpm/Package.resolved +34 -0
  24. package/Lottie.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  25. package/{Lottie.xcodeproj/xcuserdata/brandonwithrow.xcuserdatad → Lottie.xcworkspace/xcuserdata/cal.xcuserdatad}/xcdebugger/Breakpoints_v2.xcbkptlist +2 -2
  26. package/Lottie.xcworkspace/xcuserdata/cal.xcuserdatad/xcdebugger/Expressions.xcexplist +153 -0
  27. package/Lottie.xcworkspace/xcuserdata/calstephens.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  28. package/Lottie.xcworkspace/xcuserdata/calstephens.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +22 -0
  29. package/Lottie.xcworkspace/xcuserdata/calstephens.xcuserdatad/xcdebugger/Expressions.xcexplist +138 -0
  30. package/Lottie.xcworkspace/xcuserdata/calstephens.xcuserdatad/xcschemes/xcschememanagement.plist +30 -0
  31. package/Package.swift +5 -15
  32. package/README.md +40 -60
  33. package/Rakefile +160 -0
  34. package/Sources/Private/CoreAnimation/Animations/CAAnimation+TimingConfiguration.swift +81 -0
  35. package/Sources/Private/CoreAnimation/Animations/CALayer+addAnimation.swift +447 -0
  36. package/Sources/Private/CoreAnimation/Animations/CombinedShapeAnimation.swift +81 -0
  37. package/Sources/Private/CoreAnimation/Animations/CustomPathAnimation.swift +41 -0
  38. package/Sources/Private/CoreAnimation/Animations/EllipseAnimation.swift +55 -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 +58 -0
  43. package/Sources/Private/CoreAnimation/Animations/ShapeAnimation.swift +257 -0
  44. package/Sources/Private/CoreAnimation/Animations/StarAnimation.swift +124 -0
  45. package/Sources/Private/CoreAnimation/Animations/StrokeAnimation.swift +73 -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 +497 -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 +154 -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 +88 -0
  56. package/Sources/Private/CoreAnimation/Layers/CALayer+setupLayerHierarchy.swift +167 -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 +64 -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/RepeaterLayer.swift +85 -0
  63. package/Sources/Private/CoreAnimation/Layers/ShapeItemLayer.swift +315 -0
  64. package/Sources/Private/CoreAnimation/Layers/ShapeLayer.swift +390 -0
  65. package/Sources/Private/CoreAnimation/Layers/SolidLayer.swift +47 -0
  66. package/Sources/Private/CoreAnimation/Layers/TextLayer.swift +91 -0
  67. package/Sources/Private/CoreAnimation/Layers/TransformLayer.swift +11 -0
  68. package/Sources/Private/CoreAnimation/ValueProviderStore.swift +139 -0
  69. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/CompositionLayer.swift +94 -86
  70. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/ImageCompositionLayer.swift +24 -21
  71. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/MaskContainerLayer.swift +75 -54
  72. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/NullCompositionLayer.swift +5 -5
  73. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/PreCompositionLayer.swift +59 -43
  74. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/ShapeCompositionLayer.swift +22 -20
  75. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/SolidCompositionLayer.swift +26 -17
  76. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/TextCompositionLayer.swift +42 -36
  77. package/{lottie-swift/src/Private/LayerContainers/AnimationContainer.swift → Sources/Private/MainThread/LayerContainers/MainThreadAnimationLayer.swift} +200 -140
  78. package/Sources/Private/MainThread/LayerContainers/Utility/CachedImageProvider.swift +47 -0
  79. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/Utility/CompositionLayersInitializer.swift +33 -24
  80. package/{lottie-swift/src/Private/LayerContainers/Utility/TextLayer.swift → Sources/Private/MainThread/LayerContainers/Utility/CoreTextRenderLayer.swift} +149 -106
  81. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/Utility/InvertedMatteLayer.swift +26 -24
  82. package/Sources/Private/MainThread/LayerContainers/Utility/LayerFontProvider.swift +41 -0
  83. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/Utility/LayerImageProvider.swift +20 -16
  84. package/Sources/Private/MainThread/LayerContainers/Utility/LayerTextProvider.swift +40 -0
  85. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/Utility/LayerTransformNode.swift +82 -67
  86. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Extensions/ItemsExtension.swift +9 -4
  87. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/NodeProperty.swift +29 -21
  88. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/Protocols/AnyNodeProperty.swift +16 -10
  89. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/Protocols/AnyValueContainer.swift +6 -6
  90. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/Protocols/KeypathSearchable.swift +5 -5
  91. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/Protocols/NodePropertyMap.swift +10 -8
  92. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/ValueContainer.swift +25 -21
  93. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/ValueProviders/GroupInterpolator.swift +23 -17
  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 +247 -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 +57 -42
  112. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/RenderNodes/GradientStrokeNode.swift +66 -58
  113. package/Sources/Private/MainThread/NodeRenderSystem/Nodes/RenderNodes/StrokeNode.swift +169 -0
  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 +222 -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 +74 -0
  141. package/Sources/Private/Model/ShapeItems/Fill.swift +74 -0
  142. package/Sources/Private/Model/ShapeItems/GradientFill.swift +137 -0
  143. package/Sources/Private/Model/ShapeItems/GradientStroke.swift +185 -0
  144. package/Sources/Private/Model/ShapeItems/Group.swift +48 -0
  145. package/{lottie-swift/src → Sources}/Private/Model/ShapeItems/Merge.swift +29 -12
  146. package/Sources/Private/Model/ShapeItems/Rectangle.swift +72 -0
  147. package/Sources/Private/Model/ShapeItems/Repeater.swift +135 -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 +135 -0
  151. package/Sources/Private/Model/ShapeItems/Star.swift +131 -0
  152. package/Sources/Private/Model/ShapeItems/Stroke.swift +101 -0
  153. package/Sources/Private/Model/ShapeItems/Trim.swift +77 -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/Private/NodeRenderSystem/NodeProperties/ValueProviders → Sources/Private/Utility/Interpolatable}/KeyframeInterpolator.swift +125 -108
  174. package/{lottie-swift/src → Sources}/Private/Utility/Primitives/BezierPath.swift +229 -143
  175. package/Sources/Private/Utility/Primitives/CGPointExtension.swift +35 -0
  176. package/{lottie-swift/src → Sources}/Private/Utility/Primitives/ColorExtension.swift +46 -14
  177. package/{lottie-swift/src → Sources}/Private/Utility/Primitives/CompoundBezierPath.swift +58 -49
  178. package/Sources/Private/Utility/Primitives/CurveVertex.swift +184 -0
  179. package/Sources/Private/Utility/Primitives/PathElement.swift +75 -0
  180. package/Sources/Private/Utility/Primitives/UnitBezier.swift +115 -0
  181. package/Sources/Private/Utility/Primitives/VectorsExtensions.swift +341 -0
  182. package/Sources/Public/Animation/AnimationPublic.swift +266 -0
  183. package/Sources/Public/Animation/AnimationView.swift +1335 -0
  184. package/Sources/Public/Animation/AnimationViewInitializers.swift +109 -0
  185. package/Sources/Public/AnimationCache/AnimationCacheProvider.swift +22 -0
  186. package/{lottie-swift/src → Sources}/Public/AnimationCache/LRUAnimationCache.swift +22 -18
  187. package/Sources/Public/DynamicProperties/AnimationKeypath.swift +49 -0
  188. package/Sources/Public/DynamicProperties/AnyValueProvider.swift +132 -0
  189. package/{lottie-swift/src → Sources}/Public/DynamicProperties/ValueProviders/ColorValueProvider.swift +54 -36
  190. package/{lottie-swift/src → Sources}/Public/DynamicProperties/ValueProviders/FloatValueProvider.swift +40 -36
  191. package/Sources/Public/DynamicProperties/ValueProviders/GradientValueProvider.swift +123 -0
  192. package/{lottie-swift/src → Sources}/Public/DynamicProperties/ValueProviders/PointValueProvider.swift +40 -35
  193. package/{lottie-swift/src → Sources}/Public/DynamicProperties/ValueProviders/SizeValueProvider.swift +40 -35
  194. package/{lottie-swift/src → Sources}/Public/FontProvider/AnimationFontProvider.swift +15 -8
  195. package/Sources/Public/ImageProvider/AnimationImageProvider.swift +21 -0
  196. package/Sources/Public/Keyframes/Interpolatable.swift +253 -0
  197. package/Sources/Public/Keyframes/Keyframe.swift +92 -0
  198. package/Sources/Public/Logging/LottieLogger.swift +137 -0
  199. package/Sources/Public/LottieConfiguration.swift +143 -0
  200. package/{lottie-swift/src → Sources}/Public/Primitives/AnimationTime.swift +1 -1
  201. package/{lottie-swift/src → Sources}/Public/Primitives/Color.swift +10 -6
  202. package/{lottie-swift/src → Sources}/Public/Primitives/Vectors.swift +13 -12
  203. package/Sources/Public/TextProvider/AnimationTextProvider.swift +53 -0
  204. package/{lottie-swift/src → Sources}/Public/iOS/AnimatedButton.swift +42 -26
  205. package/{lottie-swift/src → Sources}/Public/iOS/AnimatedControl.swift +100 -91
  206. package/{lottie-swift/src → Sources}/Public/iOS/AnimatedSwitch.swift +128 -94
  207. package/{lottie-swift/src → Sources}/Public/iOS/AnimationSubview.swift +3 -3
  208. package/Sources/Public/iOS/AnimationViewBase.swift +78 -0
  209. package/{lottie-swift/src → Sources}/Public/iOS/BundleImageProvider.swift +36 -34
  210. package/{lottie-swift/src → Sources}/Public/iOS/Compatibility/CompatibleAnimationKeypath.swift +4 -0
  211. package/{lottie-swift/src → Sources}/Public/iOS/Compatibility/CompatibleAnimationView.swift +38 -29
  212. package/{lottie-swift/src → Sources}/Public/iOS/FilepathImageProvider.swift +24 -21
  213. package/{lottie-swift/src → Sources}/Public/iOS/UIColorExtension.swift +4 -4
  214. package/{lottie-swift/src/Public/MacOS/AnimationSubview.swift → Sources/Public/macOS/AnimationSubview.macOS.swift} +4 -5
  215. package/{lottie-swift/src/Public/MacOS/LottieView.swift → Sources/Public/macOS/AnimationViewBase.macOS.swift} +58 -50
  216. package/{lottie-swift/src/Public/MacOS/BundleImageProvider.swift → Sources/Public/macOS/BundleImageProvider.macOS.swift} +31 -32
  217. package/Sources/Public/macOS/FilepathImageProvider.macOS.swift +67 -0
  218. package/Tests/AnimationKeypathTests.swift +103 -0
  219. package/Tests/AutomaticEngineTests.swift +57 -0
  220. package/Tests/BundleTests.swift +25 -0
  221. package/Tests/DataURLTests.swift +64 -0
  222. package/Tests/ParsingTests.swift +43 -0
  223. package/Tests/PerformanceTests.swift +214 -0
  224. package/Tests/Samples/9squares_AlBoardman.json +1 -0
  225. package/Tests/Samples/Boat_Loader.json +1 -0
  226. package/Tests/Samples/HamburgerArrow.json +1 -0
  227. package/Tests/Samples/IconTransitions.json +1 -0
  228. package/Tests/Samples/Images/dog.png +0 -0
  229. package/Tests/Samples/Issues/issue_1125.json +1 -0
  230. package/Tests/Samples/Issues/issue_1260.json +1 -0
  231. package/Tests/Samples/Issues/issue_1403.json +1 -0
  232. package/Tests/Samples/Issues/issue_1407.json +1 -0
  233. package/Tests/Samples/Issues/issue_1460.json +1 -0
  234. package/Tests/Samples/Issues/issue_1488.json +1 -0
  235. package/Tests/Samples/Issues/issue_1505.json +1 -0
  236. package/Tests/Samples/Issues/issue_1541.json +1 -0
  237. package/Tests/Samples/Issues/issue_1557.json +1 -0
  238. package/Tests/Samples/Issues/issue_1603.json +1 -0
  239. package/Tests/Samples/Issues/issue_1628.json +1 -0
  240. package/Tests/Samples/Issues/issue_1636.json +1 -0
  241. package/Tests/Samples/Issues/issue_1643.json +1 -0
  242. package/Tests/Samples/Issues/issue_1655.json +1 -0
  243. package/Tests/Samples/Issues/issue_1664.json +1 -0
  244. package/Tests/Samples/Issues/issue_1683.json +1 -0
  245. package/Tests/Samples/Issues/issue_1687.json +1 -0
  246. package/Tests/Samples/Issues/issue_1711.json +1 -0
  247. package/Tests/Samples/Issues/issue_1717.json +1 -0
  248. package/Tests/Samples/Issues/issue_769.json +1 -0
  249. package/Tests/Samples/Issues/issue_885.json +1 -0
  250. package/Tests/Samples/Issues/issue_965.json +1 -0
  251. package/Tests/Samples/Issues/pr_1536.json +1 -0
  252. package/Tests/Samples/Issues/pr_1563.json +8439 -0
  253. package/Tests/Samples/Issues/pr_1592.json +5527 -0
  254. package/Tests/Samples/Issues/pr_1599.json +738 -0
  255. package/Tests/Samples/Issues/pr_1604_1.json +1 -0
  256. package/Tests/Samples/Issues/pr_1604_2.json +1 -0
  257. package/Tests/Samples/Issues/pr_1632_1.json +1 -0
  258. package/Tests/Samples/Issues/pr_1632_2.json +1 -0
  259. package/Tests/Samples/Issues/pr_1686.json +513 -0
  260. package/Tests/Samples/Issues/pr_1698.json +1 -0
  261. package/Tests/Samples/Issues/pr_1699.json +1 -0
  262. package/Tests/Samples/LottieFiles/LICENSE.md +14 -0
  263. package/Tests/Samples/LottieFiles/bounce_strokes.json +1 -0
  264. package/Tests/Samples/LottieFiles/cactus.json +1 -0
  265. package/Tests/Samples/LottieFiles/dog_car_ride.json +1 -0
  266. package/Tests/Samples/LottieFiles/draft_icon.json +1 -0
  267. package/Tests/Samples/LottieFiles/fireworks.json +1 -0
  268. package/Tests/Samples/LottieFiles/gradient_1.json +1 -0
  269. package/Tests/Samples/LottieFiles/gradient_2.json +1 -0
  270. package/Tests/Samples/LottieFiles/gradient_pill.json +1 -0
  271. package/Tests/Samples/LottieFiles/gradient_shapes.json +1 -0
  272. package/Tests/Samples/LottieFiles/gradient_square.json +1 -0
  273. package/Tests/Samples/LottieFiles/growth.json +1 -0
  274. package/Tests/Samples/LottieFiles/infinity_loader.json +1 -0
  275. package/Tests/Samples/LottieFiles/loading_dots_1.json +1 -0
  276. package/Tests/Samples/LottieFiles/loading_dots_2.json +1 -0
  277. package/Tests/Samples/LottieFiles/loading_dots_3.json +1 -0
  278. package/Tests/Samples/LottieFiles/loading_gradient_strokes.json +1 -0
  279. package/Tests/Samples/LottieFiles/settings_slider.json +1 -0
  280. package/Tests/Samples/LottieFiles/shop.json +1 -0
  281. package/Tests/Samples/LottieFiles/step_loader.json +1 -0
  282. package/Tests/Samples/LottieLogo1.json +1 -0
  283. package/Tests/Samples/LottieLogo1_masked.json +1 -0
  284. package/Tests/Samples/LottieLogo2.json +1 -0
  285. package/Tests/Samples/MotionCorpse_Jrcanest.json +1 -0
  286. package/Tests/Samples/Nonanimating/BasicLayers.json +1 -0
  287. package/Tests/Samples/Nonanimating/DisableNodesTest.json +1 -0
  288. package/Tests/Samples/Nonanimating/FirstText.json +1 -0
  289. package/Tests/Samples/Nonanimating/GeometryTransformTest.json +1 -0
  290. package/Tests/Samples/Nonanimating/Text_AnimatedProperties.json +1 -0
  291. package/Tests/Samples/Nonanimating/Text_Glyph.json +1 -0
  292. package/Tests/Samples/Nonanimating/Text_NoAnimation.json +1 -0
  293. package/Tests/Samples/Nonanimating/Text_NoGlyph.json +1 -0
  294. package/Tests/Samples/Nonanimating/Zoom.json +1 -0
  295. package/Tests/Samples/Nonanimating/_dog.json +1 -0
  296. package/Tests/Samples/Nonanimating/base64Test.json +1 -0
  297. package/Tests/Samples/Nonanimating/blend_mode_test.json +1 -0
  298. package/Tests/Samples/Nonanimating/keypathTest.json +1 -0
  299. package/Tests/Samples/Nonanimating/verifyLineHeight.json +1 -0
  300. package/Tests/Samples/PinJump.json +1 -0
  301. package/Tests/Samples/Switch.json +1 -0
  302. package/Tests/Samples/Switch_States.json +1 -0
  303. package/Tests/Samples/TwitterHeart.json +1 -0
  304. package/Tests/Samples/TwitterHeartButton.json +1 -0
  305. package/Tests/Samples/TypeFace/A.json +1 -0
  306. package/Tests/Samples/TypeFace/Apostrophe.json +1 -0
  307. package/Tests/Samples/TypeFace/B.json +1 -0
  308. package/Tests/Samples/TypeFace/BlinkingCursor.json +1 -0
  309. package/Tests/Samples/TypeFace/C.json +1 -0
  310. package/Tests/Samples/TypeFace/Colon.json +1 -0
  311. package/Tests/Samples/TypeFace/Comma.json +1 -0
  312. package/Tests/Samples/TypeFace/D.json +1 -0
  313. package/Tests/Samples/TypeFace/E.json +1 -0
  314. package/Tests/Samples/TypeFace/F.json +1 -0
  315. package/Tests/Samples/TypeFace/G.json +1 -0
  316. package/Tests/Samples/TypeFace/H.json +1 -0
  317. package/Tests/Samples/TypeFace/I.json +1 -0
  318. package/Tests/Samples/TypeFace/J.json +1 -0
  319. package/Tests/Samples/TypeFace/K.json +1 -0
  320. package/Tests/Samples/TypeFace/L.json +1 -0
  321. package/Tests/Samples/TypeFace/M.json +1 -0
  322. package/Tests/Samples/TypeFace/N.json +1 -0
  323. package/Tests/Samples/TypeFace/O.json +1 -0
  324. package/Tests/Samples/TypeFace/P.json +1 -0
  325. package/Tests/Samples/TypeFace/Q.json +1 -0
  326. package/Tests/Samples/TypeFace/R.json +1 -0
  327. package/Tests/Samples/TypeFace/S.json +1 -0
  328. package/Tests/Samples/TypeFace/T.json +1 -0
  329. package/Tests/Samples/TypeFace/U.json +1 -0
  330. package/Tests/Samples/TypeFace/V.json +1 -0
  331. package/Tests/Samples/TypeFace/W.json +1 -0
  332. package/Tests/Samples/TypeFace/X.json +1 -0
  333. package/Tests/Samples/TypeFace/Y.json +1 -0
  334. package/Tests/Samples/TypeFace/Z.json +1 -0
  335. package/Tests/Samples/Watermelon.json +1 -0
  336. package/Tests/Samples/setValueTest.json +1 -0
  337. package/Tests/Samples/timeremap.json +1 -0
  338. package/Tests/Samples/vcTransition1.json +1 -0
  339. package/Tests/Samples/vcTransition2.json +1 -0
  340. package/Tests/SnapshotConfiguration.swift +158 -0
  341. package/Tests/SnapshotTests.swift +265 -0
  342. package/Tests/Utils/Bundle+Module.swift +30 -0
  343. package/Tests/Utils/HardcodedFontProvider.swift +19 -0
  344. package/Tests/Utils/HardcodedImageProvider.swift +23 -0
  345. package/Tests/Utils/Snapshotting+presentationLayer.swift +47 -0
  346. package/Tests/ValueProvidersTests.swift +27 -0
  347. package/lottie-ios.podspec +12 -12
  348. package/package.json +1 -1
  349. package/script/test-carthage/Cartfile +1 -0
  350. package/script/test-carthage/Cartfile.resolved +1 -0
  351. package/script/test-carthage/CarthageTest/AppDelegate.swift +26 -0
  352. package/script/test-carthage/CarthageTest/Assets.xcassets/AccentColor.colorset/Contents.json +11 -0
  353. package/script/test-carthage/CarthageTest/Assets.xcassets/AppIcon.appiconset/Contents.json +98 -0
  354. package/script/test-carthage/CarthageTest/Assets.xcassets/Contents.json +6 -0
  355. package/script/test-carthage/CarthageTest/Base.lproj/LaunchScreen.storyboard +25 -0
  356. package/script/test-carthage/CarthageTest/Base.lproj/Main.storyboard +24 -0
  357. package/script/test-carthage/CarthageTest/Info.plist +66 -0
  358. package/script/test-carthage/CarthageTest/SceneDelegate.swift +10 -0
  359. package/script/test-carthage/CarthageTest/ViewController.swift +15 -0
  360. package/script/test-carthage/CarthageTest-macOS/AppDelegate.swift +7 -0
  361. package/script/test-carthage/CarthageTest-macOS/Assets.xcassets/AccentColor.colorset/Contents.json +11 -0
  362. package/script/test-carthage/CarthageTest-macOS/Assets.xcassets/AppIcon.appiconset/Contents.json +58 -0
  363. package/script/test-carthage/CarthageTest-macOS/Assets.xcassets/Contents.json +6 -0
  364. package/script/test-carthage/CarthageTest-macOS/Base.lproj/Main.storyboard +717 -0
  365. package/script/test-carthage/CarthageTest-macOS/CarthageTest_macOS.entitlements +10 -0
  366. package/script/test-carthage/CarthageTest-macOS/ViewController.swift +15 -0
  367. package/script/test-carthage/CarthageTest.xcodeproj/project.pbxproj +532 -0
  368. package/script/test-carthage/CarthageTest.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
  369. package/script/test-carthage/CarthageTest.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
  370. package/script/test-carthage/CarthageTest.xcodeproj/project.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  371. package/script/test-carthage/CarthageTest.xcodeproj/project.xcworkspace/xcuserdata/calstephens.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  372. package/script/test-carthage/CarthageTest.xcodeproj/xcuserdata/cal.xcuserdatad/xcschemes/xcschememanagement.plist +14 -0
  373. package/script/test-carthage/CarthageTest.xcodeproj/xcuserdata/calstephens.xcuserdatad/xcschemes/xcschememanagement.plist +19 -0
  374. package/script/test-carthage/Mintfile +1 -0
  375. package/script/test-spm/LottieSPM.xcworkspace/contents.xcworkspacedata +7 -0
  376. package/script/test-spm/LottieSPM.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  377. package/script/test-spm/Mintfile +1 -0
  378. package/.swiftpm/xcode/package.xcworkspace/xcuserdata/brandonwithrow.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  379. package/Lottie/Info.plist +0 -22
  380. package/Lottie.xcodeproj/project.xcworkspace/xcuserdata/brandonwithrow.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  381. package/Lottie.xcodeproj/xcuserdata/brandonwithrow.xcuserdatad/xcschemes/LottieLibraryMacOS.xcscheme +0 -80
  382. package/Lottie.xcodeproj/xcuserdata/brandonwithrow.xcuserdatad/xcschemes/xcschememanagement.plist +0 -57
  383. package/lottie-swift/Assets/.gitkeep +0 -0
  384. package/lottie-swift/src/Private/LayerContainers/Utility/LayerFontProvider.swift +0 -37
  385. package/lottie-swift/src/Private/LayerContainers/Utility/LayerTextProvider.swift +0 -36
  386. package/lottie-swift/src/Private/Model/Animation.swift +0 -107
  387. package/lottie-swift/src/Private/Model/Assets/Asset.swift +0 -27
  388. package/lottie-swift/src/Private/Model/Assets/ImageAsset.swift +0 -48
  389. package/lottie-swift/src/Private/Model/Keyframes/Keyframe.swift +0 -128
  390. package/lottie-swift/src/Private/Model/Keyframes/KeyframeGroup.swift +0 -108
  391. package/lottie-swift/src/Private/Model/Layers/LayerModel.swift +0 -150
  392. package/lottie-swift/src/Private/Model/Objects/DashPattern.swift +0 -24
  393. package/lottie-swift/src/Private/Model/Objects/Marker.swift +0 -23
  394. package/lottie-swift/src/Private/Model/Objects/Mask.swift +0 -48
  395. package/lottie-swift/src/Private/Model/Objects/Transform.swift +0 -105
  396. package/lottie-swift/src/Private/Model/ShapeItems/Ellipse.swift +0 -50
  397. package/lottie-swift/src/Private/Model/ShapeItems/FillI.swift +0 -49
  398. package/lottie-swift/src/Private/Model/ShapeItems/GradientFill.swift +0 -86
  399. package/lottie-swift/src/Private/Model/ShapeItems/GradientStroke.swift +0 -125
  400. package/lottie-swift/src/Private/Model/ShapeItems/Group.swift +0 -32
  401. package/lottie-swift/src/Private/Model/ShapeItems/Rectangle.swift +0 -50
  402. package/lottie-swift/src/Private/Model/ShapeItems/Repeater.swift +0 -80
  403. package/lottie-swift/src/Private/Model/ShapeItems/Shape.swift +0 -37
  404. package/lottie-swift/src/Private/Model/ShapeItems/ShapeItem.swift +0 -95
  405. package/lottie-swift/src/Private/Model/ShapeItems/ShapeTransform.swift +0 -68
  406. package/lottie-swift/src/Private/Model/ShapeItems/Star.swift +0 -86
  407. package/lottie-swift/src/Private/Model/ShapeItems/Stroke.swift +0 -67
  408. package/lottie-swift/src/Private/Model/ShapeItems/Trim.swift +0 -53
  409. package/lottie-swift/src/Private/Model/Text/Font.swift +0 -35
  410. package/lottie-swift/src/Private/Model/Text/TextAnimator.swift +0 -99
  411. package/lottie-swift/src/Private/Model/Text/TextDocument.swift +0 -70
  412. package/lottie-swift/src/Private/NodeRenderSystem/Nodes/PathNodes/EllipseNode.swift +0 -109
  413. package/lottie-swift/src/Private/NodeRenderSystem/Nodes/PathNodes/PolygonNode.swift +0 -132
  414. package/lottie-swift/src/Private/NodeRenderSystem/Nodes/RenderContainers/GroupNode.swift +0 -141
  415. package/lottie-swift/src/Private/NodeRenderSystem/Nodes/RenderNodes/StrokeNode.swift +0 -127
  416. package/lottie-swift/src/Private/Utility/Extensions/MathKit.swift +0 -539
  417. package/lottie-swift/src/Private/Utility/Extensions/StringExtensions.swift +0 -32
  418. package/lottie-swift/src/Private/Utility/Interpolatable/Interpolatable.swift +0 -18
  419. package/lottie-swift/src/Private/Utility/Interpolatable/InterpolatableExtensions.swift +0 -170
  420. package/lottie-swift/src/Private/Utility/Primitives/CurveVertex.swift +0 -177
  421. package/lottie-swift/src/Private/Utility/Primitives/PathElement.swift +0 -68
  422. package/lottie-swift/src/Private/Utility/Primitives/VectorsExtensions.swift +0 -218
  423. package/lottie-swift/src/Public/Animation/AnimationPublic.swift +0 -196
  424. package/lottie-swift/src/Public/Animation/AnimationView.swift +0 -1006
  425. package/lottie-swift/src/Public/Animation/AnimationViewInitializers.swift +0 -83
  426. package/lottie-swift/src/Public/AnimationCache/AnimationCacheProvider.swift +0 -24
  427. package/lottie-swift/src/Public/DynamicProperties/AnimationKeypath.swift +0 -46
  428. package/lottie-swift/src/Public/DynamicProperties/AnyValueProvider.swift +0 -29
  429. package/lottie-swift/src/Public/DynamicProperties/ValueProviders/GradientValueProvider.swift +0 -114
  430. package/lottie-swift/src/Public/ImageProvider/AnimationImageProvider.swift +0 -23
  431. package/lottie-swift/src/Public/MacOS/FilepathImageProvider.swift +0 -67
  432. package/lottie-swift/src/Public/TextProvider/AnimationTextProvider.swift +0 -39
  433. package/lottie-swift/src/Public/iOS/LottieView.swift +0 -62
  434. package/lottie-swift-testing.podspec +0 -32
@@ -5,60 +5,63 @@
5
5
  // Created by Brandon Withrow on 2/4/19.
6
6
  //
7
7
 
8
- import Foundation
9
8
  import CoreGraphics
9
+ import Foundation
10
10
  import QuartzCore
11
11
 
12
+ // MARK: - LayerTransformProperties
13
+
12
14
  final class LayerTransformProperties: NodePropertyMap, KeypathSearchable {
13
-
15
+
16
+ // MARK: Lifecycle
17
+
14
18
  init(transform: Transform) {
15
-
16
- self.anchor = NodeProperty(provider: KeyframeInterpolator(keyframes: transform.anchorPoint.keyframes))
17
- self.scale = NodeProperty(provider: KeyframeInterpolator(keyframes: transform.scale.keyframes))
18
- self.rotation = NodeProperty(provider: KeyframeInterpolator(keyframes: transform.rotation.keyframes))
19
- self.opacity = NodeProperty(provider: KeyframeInterpolator(keyframes: transform.opacity.keyframes))
20
-
19
+ anchor = NodeProperty(provider: KeyframeInterpolator(keyframes: transform.anchorPoint.keyframes))
20
+ scale = NodeProperty(provider: KeyframeInterpolator(keyframes: transform.scale.keyframes))
21
+ rotation = NodeProperty(provider: KeyframeInterpolator(keyframes: transform.rotation.keyframes))
22
+ opacity = NodeProperty(provider: KeyframeInterpolator(keyframes: transform.opacity.keyframes))
23
+
21
24
  var propertyMap: [String: AnyNodeProperty] = [
22
25
  "Anchor Point" : anchor,
23
26
  "Scale" : scale,
24
27
  "Rotation" : rotation,
25
- "Opacity" : opacity
28
+ "Opacity" : opacity,
26
29
  ]
27
-
28
- if let positionKeyframesX = transform.positionX?.keyframes,
29
- let positionKeyframesY = transform.positionY?.keyframes {
30
+
31
+ if
32
+ let positionKeyframesX = transform.positionX?.keyframes,
33
+ let positionKeyframesY = transform.positionY?.keyframes
34
+ {
30
35
  let xPosition: NodeProperty<Vector1D> = NodeProperty(provider: KeyframeInterpolator(keyframes: positionKeyframesX))
31
36
  let yPosition: NodeProperty<Vector1D> = NodeProperty(provider: KeyframeInterpolator(keyframes: positionKeyframesY))
32
37
  propertyMap["X Position"] = xPosition
33
38
  propertyMap["Y Position"] = yPosition
34
- self.positionX = xPosition
35
- self.positionY = yPosition
36
- self.position = nil
39
+ positionX = xPosition
40
+ positionY = yPosition
41
+ position = nil
37
42
  } else if let positionKeyframes = transform.position?.keyframes {
38
43
  let position: NodeProperty<Vector3D> = NodeProperty(provider: KeyframeInterpolator(keyframes: positionKeyframes))
39
44
  propertyMap["Position"] = position
40
45
  self.position = position
41
- self.positionX = nil
42
- self.positionY = nil
46
+ positionX = nil
47
+ positionY = nil
43
48
  } else {
44
- self.position = nil
45
- self.positionY = nil
46
- self.positionX = nil
49
+ position = nil
50
+ positionY = nil
51
+ positionX = nil
47
52
  }
48
-
49
- self.keypathProperties = propertyMap
50
- self.properties = Array(propertyMap.values)
51
- }
52
-
53
- let keypathProperties: [String : AnyNodeProperty]
54
- var keypathName: String = "Transform"
55
-
56
- var childKeypaths: [KeypathSearchable] {
57
- return []
53
+
54
+ keypathProperties = propertyMap
55
+ properties = Array(propertyMap.values)
58
56
  }
59
-
57
+
58
+ // MARK: Internal
59
+
60
+ let keypathProperties: [String: AnyNodeProperty]
61
+ var keypathName = "Transform"
62
+
60
63
  let properties: [AnyNodeProperty]
61
-
64
+
62
65
  let anchor: NodeProperty<Vector3D>
63
66
  let scale: NodeProperty<Vector3D>
64
67
  let rotation: NodeProperty<Vector1D>
@@ -66,63 +69,75 @@ final class LayerTransformProperties: NodePropertyMap, KeypathSearchable {
66
69
  let positionX: NodeProperty<Vector1D>?
67
70
  let positionY: NodeProperty<Vector1D>?
68
71
  let opacity: NodeProperty<Vector1D>
69
-
72
+
73
+ var childKeypaths: [KeypathSearchable] {
74
+ []
75
+ }
70
76
  }
71
77
 
78
+ // MARK: - LayerTransformNode
79
+
72
80
  class LayerTransformNode: AnimatorNode {
73
- let outputNode: NodeOutput = PassThroughOutputNode(parent: nil)
74
-
81
+
82
+ // MARK: Lifecycle
83
+
75
84
  init(transform: Transform) {
76
- self.transformProperties = LayerTransformProperties(transform: transform)
85
+ transformProperties = LayerTransformProperties(transform: transform)
77
86
  }
78
-
87
+
88
+ // MARK: Internal
89
+
90
+ let outputNode: NodeOutput = PassThroughOutputNode(parent: nil)
91
+
79
92
  let transformProperties: LayerTransformProperties
80
-
93
+
94
+ var parentNode: AnimatorNode?
95
+ var hasLocalUpdates = false
96
+ var hasUpstreamUpdates = false
97
+ var lastUpdateFrame: CGFloat? = nil
98
+ var isEnabled = true
99
+
100
+ var opacity: Float = 1
101
+ var localTransform: CATransform3D = CATransform3DIdentity
102
+ var globalTransform: CATransform3D = CATransform3DIdentity
103
+
81
104
  // MARK: Animator Node Protocol
82
-
105
+
83
106
  var propertyMap: NodePropertyMap & KeypathSearchable {
84
- return transformProperties
107
+ transformProperties
85
108
  }
86
-
87
- var parentNode: AnimatorNode?
88
- var hasLocalUpdates: Bool = false
89
- var hasUpstreamUpdates: Bool = false
90
- var lastUpdateFrame: CGFloat? = nil
91
- var isEnabled: Bool = true
92
-
93
- func shouldRebuildOutputs(frame: CGFloat) -> Bool {
94
- return hasLocalUpdates || hasUpstreamUpdates
109
+
110
+ func shouldRebuildOutputs(frame _: CGFloat) -> Bool {
111
+ hasLocalUpdates || hasUpstreamUpdates
95
112
  }
96
-
97
- func rebuildOutputs(frame: CGFloat) {
113
+
114
+ func rebuildOutputs(frame _: CGFloat) {
98
115
  opacity = Float(transformProperties.opacity.value.cgFloatValue) * 0.01
99
-
116
+
100
117
  let position: CGPoint
101
118
  if let point = transformProperties.position?.value.pointValue {
102
119
  position = point
103
- } else if let xPos = transformProperties.positionX?.value.cgFloatValue,
104
- let yPos = transformProperties.positionY?.value.cgFloatValue {
120
+ } else if
121
+ let xPos = transformProperties.positionX?.value.cgFloatValue,
122
+ let yPos = transformProperties.positionY?.value.cgFloatValue
123
+ {
105
124
  position = CGPoint(x: xPos, y: yPos)
106
125
  } else {
107
126
  position = .zero
108
127
  }
109
-
110
- localTransform = CATransform3D.makeTransform(anchor: transformProperties.anchor.value.pointValue,
111
- position: position,
112
- scale: transformProperties.scale.value.sizeValue,
113
- rotation: transformProperties.rotation.value.cgFloatValue,
114
- skew: nil,
115
- skewAxis: nil)
116
-
128
+
129
+ localTransform = CATransform3D.makeTransform(
130
+ anchor: transformProperties.anchor.value.pointValue,
131
+ position: position,
132
+ scale: transformProperties.scale.value.sizeValue,
133
+ rotation: transformProperties.rotation.value.cgFloatValue,
134
+ skew: nil,
135
+ skewAxis: nil)
136
+
117
137
  if let parentNode = parentNode as? LayerTransformNode {
118
138
  globalTransform = CATransform3DConcat(localTransform, parentNode.globalTransform)
119
139
  } else {
120
140
  globalTransform = localTransform
121
141
  }
122
142
  }
123
-
124
- var opacity: Float = 1
125
- var localTransform: CATransform3D = CATransform3DIdentity
126
- var globalTransform: CATransform3D = CATransform3DIdentity
127
-
128
143
  }
@@ -7,6 +7,8 @@
7
7
 
8
8
  import Foundation
9
9
 
10
+ // MARK: - NodeTree
11
+
10
12
  final class NodeTree {
11
13
  var rootNode: AnimatorNode? = nil
12
14
  var transform: ShapeTransform? = nil
@@ -17,7 +19,6 @@ final class NodeTree {
17
19
 
18
20
  extension Array where Element == ShapeItem {
19
21
  func initializeNodeTree() -> NodeTree {
20
-
21
22
  let nodeTree = NodeTree()
22
23
 
23
24
  for item in self {
@@ -71,7 +72,6 @@ extension Array where Element == ShapeItem {
71
72
  nodeTree.transform = xform
72
73
  continue
73
74
  } else if let group = item as? Group {
74
-
75
75
  let tree = group.items.initializeNodeTree()
76
76
  let node = GroupNode(name: group.name, parentNode: nodeTree.rootNode, tree: tree)
77
77
  nodeTree.rootNode = node
@@ -79,13 +79,18 @@ extension Array where Element == ShapeItem {
79
79
  /// Now add all child paths to current tree
80
80
  nodeTree.paths.append(contentsOf: tree.paths)
81
81
  nodeTree.renderContainers.append(node.container)
82
+ } else if item is Repeater {
83
+ LottieLogger.shared.assertionFailure("""
84
+ The Main Thread rendering engine doesn't currently support repeaters.
85
+ To play an animation with repeaters, you can use the Core Animation rendering engine instead.
86
+ """)
82
87
  }
83
-
88
+
84
89
  if let pathNode = nodeTree.rootNode as? PathNode {
85
90
  //// Add path container to the node tree
86
91
  nodeTree.paths.append(pathNode.pathOutput)
87
92
  }
88
-
93
+
89
94
  if let renderNode = nodeTree.rootNode as? RenderNode {
90
95
  nodeTree.renderContainers.append(ShapeRenderLayer(renderer: renderNode.renderer))
91
96
  }
@@ -5,43 +5,51 @@
5
5
  // Created by Brandon Withrow on 1/30/19.
6
6
  //
7
7
 
8
- import Foundation
9
8
  import CoreGraphics
9
+ import Foundation
10
10
 
11
11
  /// A node property that holds a reference to a T ValueProvider and a T ValueContainer.
12
12
  class NodeProperty<T>: AnyNodeProperty {
13
-
14
- var valueType: Any.Type { return T.self }
15
-
13
+
14
+ // MARK: Lifecycle
15
+
16
+ init(provider: AnyValueProvider) {
17
+ valueProvider = provider
18
+ originalValueProvider = valueProvider
19
+ typedContainer = ValueContainer<T>(provider.value(frame: 0) as! T)
20
+ typedContainer.setNeedsUpdate()
21
+ }
22
+
23
+ // MARK: Internal
24
+
25
+ var valueProvider: AnyValueProvider
26
+ var originalValueProvider: AnyValueProvider
27
+
28
+ var valueType: Any.Type { T.self }
29
+
16
30
  var value: T {
17
- return typedContainer.outputValue
31
+ typedContainer.outputValue
18
32
  }
19
-
33
+
20
34
  var valueContainer: AnyValueContainer {
21
- return typedContainer
22
- }
23
-
24
- var valueProvider: AnyValueProvider
25
-
26
- init(provider: AnyValueProvider) {
27
- self.valueProvider = provider
28
- self.typedContainer = ValueContainer<T>(provider.value(frame: 0) as! T)
29
- self.typedContainer.setNeedsUpdate()
35
+ typedContainer
30
36
  }
31
-
37
+
32
38
  func needsUpdate(frame: CGFloat) -> Bool {
33
- return valueContainer.needsUpdate || valueProvider.hasUpdate(frame: frame)
39
+ valueContainer.needsUpdate || valueProvider.hasUpdate(frame: frame)
34
40
  }
35
-
41
+
36
42
  func setProvider(provider: AnyValueProvider) {
37
43
  guard provider.valueType == valueType else { return }
38
- self.valueProvider = provider
44
+ valueProvider = provider
39
45
  valueContainer.setNeedsUpdate()
40
46
  }
41
-
47
+
42
48
  func update(frame: CGFloat) {
43
49
  typedContainer.setValue(valueProvider.value(frame: frame), forFrame: frame)
44
50
  }
45
-
51
+
52
+ // MARK: Fileprivate
53
+
46
54
  fileprivate var typedContainer: ValueContainer<T>
47
55
  }
@@ -5,26 +5,32 @@
5
5
  // Created by Brandon Withrow on 1/30/19.
6
6
  //
7
7
 
8
- import Foundation
9
8
  import CoreGraphics
9
+ import Foundation
10
+
11
+ // MARK: - AnyNodeProperty
12
+
10
13
  /// A property of a node. The node property holds a provider and a container
11
14
  protocol AnyNodeProperty {
12
-
15
+
13
16
  /// Returns true if the property needs to recompute its stored value
14
17
  func needsUpdate(frame: CGFloat) -> Bool
15
-
18
+
16
19
  /// Updates the property for the frame
17
20
  func update(frame: CGFloat)
18
-
21
+
19
22
  /// The stored value container for the property
20
23
  var valueContainer: AnyValueContainer { get }
21
-
24
+
22
25
  /// The value provider for the property
23
26
  var valueProvider: AnyValueProvider { get }
24
-
27
+
28
+ /// The original value provider for the property
29
+ var originalValueProvider: AnyValueProvider { get }
30
+
25
31
  /// The Type of the value provider
26
32
  var valueType: Any.Type { get }
27
-
33
+
28
34
  /// Sets the value provider for the property.
29
35
  func setProvider(provider: AnyValueProvider)
30
36
  }
@@ -33,12 +39,12 @@ extension AnyNodeProperty {
33
39
 
34
40
  /// Returns the most recently computed value for the keypath, returns nil if property wasn't found
35
41
  func getValueOfType<T>() -> T? {
36
- return valueContainer.value as? T
42
+ valueContainer.value as? T
37
43
  }
38
-
44
+
39
45
  /// Returns the most recently computed value for the keypath, returns nil if property wasn't found
40
46
  func getValue() -> Any? {
41
- return valueContainer.value
47
+ valueContainer.value
42
48
  }
43
49
 
44
50
  }
@@ -5,22 +5,22 @@
5
5
  // Created by Brandon Withrow on 1/30/19.
6
6
  //
7
7
 
8
- import Foundation
9
8
  import CoreGraphics
9
+ import Foundation
10
10
 
11
11
  /// The container for the value of a property.
12
12
  protocol AnyValueContainer: AnyObject {
13
-
13
+
14
14
  /// The stored value of the container
15
15
  var value: Any { get }
16
-
16
+
17
17
  /// Notifies the provider that it should update its container
18
18
  func setNeedsUpdate()
19
-
19
+
20
20
  /// When true the container needs to have its value updated by its provider
21
21
  var needsUpdate: Bool { get }
22
-
22
+
23
23
  /// The frame time of the last provided update
24
24
  var lastUpdateFrame: CGFloat { get }
25
-
25
+
26
26
  }
@@ -10,15 +10,15 @@ import QuartzCore
10
10
 
11
11
  /// Protocol that provides keypath search functionality. Returns all node properties associated with a keypath.
12
12
  protocol KeypathSearchable {
13
-
13
+
14
14
  /// The name of the Keypath
15
15
  var keypathName: String { get }
16
-
16
+
17
17
  /// A list of properties belonging to the keypath.
18
- var keypathProperties: [String : AnyNodeProperty] { get }
19
-
18
+ var keypathProperties: [String: AnyNodeProperty] { get }
19
+
20
20
  /// Children Keypaths
21
21
  var childKeypaths: [KeypathSearchable] { get }
22
-
22
+
23
23
  var keypathLayer: CALayer? { get }
24
24
  }
@@ -8,20 +8,22 @@
8
8
  import Foundation
9
9
  import QuartzCore
10
10
 
11
+ // MARK: - NodePropertyMap
12
+
11
13
  protocol NodePropertyMap {
12
14
  var properties: [AnyNodeProperty] { get }
13
15
  }
14
16
 
15
17
  extension NodePropertyMap {
16
-
18
+
17
19
  var childKeypaths: [KeypathSearchable] {
18
- return []
20
+ []
19
21
  }
20
-
22
+
21
23
  var keypathLayer: CALayer? {
22
- return nil
24
+ nil
23
25
  }
24
-
26
+
25
27
  /// Checks if the node's local contents need to be rebuilt.
26
28
  func needsLocalUpdate(frame: CGFloat) -> Bool {
27
29
  for property in properties {
@@ -31,12 +33,12 @@ extension NodePropertyMap {
31
33
  }
32
34
  return false
33
35
  }
34
-
36
+
35
37
  /// Rebuilds only the local nodes that have an update for the frame
36
38
  func updateNodeProperties(frame: CGFloat) {
37
- properties.forEach { (property) in
39
+ properties.forEach { property in
38
40
  property.update(frame: frame)
39
41
  }
40
42
  }
41
-
43
+
42
44
  }
@@ -5,14 +5,34 @@
5
5
  // Created by Brandon Withrow on 1/30/19.
6
6
  //
7
7
 
8
- import Foundation
9
8
  import CoreGraphics
9
+ import Foundation
10
10
 
11
11
  /// A container for a node value that is Typed to T.
12
12
  class ValueContainer<T>: AnyValueContainer {
13
-
14
- private(set) var lastUpdateFrame: CGFloat = CGFloat.infinity
15
-
13
+
14
+ // MARK: Lifecycle
15
+
16
+ init(_ value: T) {
17
+ outputValue = value
18
+ }
19
+
20
+ // MARK: Internal
21
+
22
+ private(set) var lastUpdateFrame = CGFloat.infinity
23
+
24
+ fileprivate(set) var needsUpdate = true
25
+
26
+ var value: Any {
27
+ outputValue as Any
28
+ }
29
+
30
+ var outputValue: T {
31
+ didSet {
32
+ needsUpdate = false
33
+ }
34
+ }
35
+
16
36
  func setValue(_ value: Any, forFrame: CGFloat) {
17
37
  if let typedValue = value as? T {
18
38
  needsUpdate = false
@@ -20,24 +40,8 @@ class ValueContainer<T>: AnyValueContainer {
20
40
  outputValue = typedValue
21
41
  }
22
42
  }
23
-
43
+
24
44
  func setNeedsUpdate() {
25
45
  needsUpdate = true
26
46
  }
27
-
28
- var value: Any {
29
- return outputValue as Any
30
- }
31
-
32
- var outputValue: T {
33
- didSet {
34
- needsUpdate = false
35
- }
36
- }
37
-
38
- init(_ value: T) {
39
- self.outputValue = value
40
- }
41
-
42
- fileprivate(set) var needsUpdate: Bool = true
43
47
  }
@@ -5,29 +5,35 @@
5
5
  // Created by Brandon Withrow on 1/22/19.
6
6
  //
7
7
 
8
- import Foundation
9
8
  import CoreGraphics
9
+ import Foundation
10
10
 
11
11
  /// A value provider that produces an array of values from an array of Keyframe Interpolators
12
- final class GroupInterpolator<ValueType>: AnyValueProvider where ValueType: Interpolatable {
12
+ final class GroupInterpolator<ValueType>: ValueProvider where ValueType: Interpolatable {
13
+
14
+ // MARK: Lifecycle
15
+
16
+ /// Initialize with an array of array of keyframes.
17
+ init(keyframeGroups: ContiguousArray<ContiguousArray<Keyframe<ValueType>>>) {
18
+ keyframeInterpolators = ContiguousArray(keyframeGroups.map({ KeyframeInterpolator(keyframes: $0) }))
19
+ }
20
+
21
+ // MARK: Internal
22
+
23
+ let keyframeInterpolators: ContiguousArray<KeyframeInterpolator<ValueType>>
24
+
13
25
  var valueType: Any.Type {
14
- return [ValueType].self
26
+ [ValueType].self
27
+ }
28
+
29
+ var storage: ValueProviderStorage<[ValueType]> {
30
+ .closure { frame in
31
+ self.keyframeInterpolators.map({ $0.value(frame: frame) as! ValueType })
32
+ }
15
33
  }
16
-
34
+
17
35
  func hasUpdate(frame: CGFloat) -> Bool {
18
- let updated = keyframeInterpolators.first(where: {$0.hasUpdate(frame: frame)})
36
+ let updated = keyframeInterpolators.first(where: { $0.hasUpdate(frame: frame) })
19
37
  return updated != nil
20
38
  }
21
-
22
- func value(frame: CGFloat) -> Any {
23
- let output = keyframeInterpolators.map({$0.value(frame: frame) as! ValueType})
24
- return output
25
- }
26
-
27
- /// Initialize with an array of array of keyframes.
28
- init(keyframeGroups: ContiguousArray<ContiguousArray<Keyframe<ValueType>>>) {
29
- self.keyframeInterpolators = ContiguousArray(keyframeGroups.map({KeyframeInterpolator(keyframes: $0)}))
30
- }
31
- let keyframeInterpolators: ContiguousArray<KeyframeInterpolator<ValueType>>
32
-
33
39
  }
@@ -9,30 +9,35 @@ import Foundation
9
9
  import QuartzCore
10
10
 
11
11
  /// Returns a value for every frame.
12
- final class SingleValueProvider<ValueType>: AnyValueProvider {
13
-
12
+ final class SingleValueProvider<ValueType: AnyInterpolatable>: ValueProvider {
13
+
14
+ // MARK: Lifecycle
15
+
16
+ init(_ value: ValueType) {
17
+ self.value = value
18
+ }
19
+
20
+ // MARK: Internal
21
+
14
22
  var value: ValueType {
15
23
  didSet {
16
24
  hasUpdate = true
17
25
  }
18
26
  }
19
-
20
- init(_ value: ValueType) {
21
- self.value = value
27
+
28
+ var storage: ValueProviderStorage<ValueType> {
29
+ .singleValue(value)
22
30
  }
23
-
31
+
24
32
  var valueType: Any.Type {
25
- return ValueType.self
26
- }
27
-
28
- func hasUpdate(frame: CGFloat) -> Bool {
29
- return hasUpdate
33
+ ValueType.self
30
34
  }
31
-
32
- func value(frame: CGFloat) -> Any {
33
- hasUpdate = false
34
- return value
35
+
36
+ func hasUpdate(frame _: CGFloat) -> Bool {
37
+ hasUpdate
35
38
  }
36
-
37
- private var hasUpdate: Bool = true
39
+
40
+ // MARK: Private
41
+
42
+ private var hasUpdate = true
38
43
  }