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
@@ -0,0 +1,341 @@
1
+ //
2
+ // Vector.swift
3
+ // lottie-swift
4
+ //
5
+ // Created by Brandon Withrow on 1/7/19.
6
+ //
7
+
8
+ import CoreGraphics
9
+ import Foundation
10
+ import QuartzCore
11
+
12
+ // MARK: - Vector1D + Codable
13
+
14
+ /// Single value container. Needed because lottie sometimes wraps a Double in an array.
15
+ extension Vector1D: Codable {
16
+
17
+ // MARK: Lifecycle
18
+
19
+ public init(from decoder: Decoder) throws {
20
+ /// Try to decode an array of doubles
21
+ do {
22
+ var container = try decoder.unkeyedContainer()
23
+ value = try container.decode(Double.self)
24
+ } catch {
25
+ value = try decoder.singleValueContainer().decode(Double.self)
26
+ }
27
+ }
28
+
29
+ // MARK: Public
30
+
31
+ public func encode(to encoder: Encoder) throws {
32
+ var container = encoder.singleValueContainer()
33
+ try container.encode(value)
34
+ }
35
+
36
+ // MARK: Internal
37
+
38
+ var cgFloatValue: CGFloat {
39
+ CGFloat(value)
40
+ }
41
+
42
+ }
43
+
44
+ // MARK: - Vector1D + AnyInitializable
45
+
46
+ extension Vector1D: AnyInitializable {
47
+
48
+ init(value: Any) throws {
49
+ if
50
+ let array = value as? [Double],
51
+ let double = array.first
52
+ {
53
+ self.value = double
54
+ } else if let double = value as? Double {
55
+ self.value = double
56
+ } else {
57
+ throw InitializableError.invalidInput
58
+ }
59
+ }
60
+
61
+ }
62
+
63
+ extension Double {
64
+ var vectorValue: Vector1D {
65
+ Vector1D(self)
66
+ }
67
+ }
68
+
69
+ // MARK: - Vector2D
70
+
71
+ /// Needed for decoding json {x: y:} to a CGPoint
72
+ public struct Vector2D: Codable, Hashable {
73
+
74
+ // MARK: Lifecycle
75
+
76
+ init(x: Double, y: Double) {
77
+ self.x = x
78
+ self.y = y
79
+ }
80
+
81
+ public init(from decoder: Decoder) throws {
82
+ let container = try decoder.container(keyedBy: Vector2D.CodingKeys.self)
83
+
84
+ do {
85
+ let xValue: [Double] = try container.decode([Double].self, forKey: .x)
86
+ x = xValue[0]
87
+ } catch {
88
+ x = try container.decode(Double.self, forKey: .x)
89
+ }
90
+
91
+ do {
92
+ let yValue: [Double] = try container.decode([Double].self, forKey: .y)
93
+ y = yValue[0]
94
+ } catch {
95
+ y = try container.decode(Double.self, forKey: .y)
96
+ }
97
+ }
98
+
99
+ // MARK: Public
100
+
101
+ public func encode(to encoder: Encoder) throws {
102
+ var container = encoder.container(keyedBy: Vector2D.CodingKeys.self)
103
+ try container.encode(x, forKey: .x)
104
+ try container.encode(y, forKey: .y)
105
+ }
106
+
107
+ // MARK: Internal
108
+
109
+ var x: Double
110
+ var y: Double
111
+
112
+ var pointValue: CGPoint {
113
+ CGPoint(x: x, y: y)
114
+ }
115
+
116
+ // MARK: Private
117
+
118
+ private enum CodingKeys: String, CodingKey {
119
+ case x
120
+ case y
121
+ }
122
+ }
123
+
124
+ // MARK: AnyInitializable
125
+
126
+ extension Vector2D: AnyInitializable {
127
+
128
+ init(value: Any) throws {
129
+ guard let dictionary = value as? [String: Any] else {
130
+ throw InitializableError.invalidInput
131
+ }
132
+
133
+ if
134
+ let array = dictionary[CodingKeys.x.rawValue] as? [Double],
135
+ let double = array.first
136
+ {
137
+ x = double
138
+ } else if let double = dictionary[CodingKeys.x.rawValue] as? Double {
139
+ x = double
140
+ } else {
141
+ throw InitializableError.invalidInput
142
+ }
143
+ if
144
+ let array = dictionary[CodingKeys.y.rawValue] as? [Double],
145
+ let double = array.first
146
+ {
147
+ y = double
148
+ } else if let double = dictionary[CodingKeys.y.rawValue] as? Double {
149
+ y = double
150
+ } else {
151
+ throw InitializableError.invalidInput
152
+ }
153
+ }
154
+ }
155
+
156
+ extension CGPoint {
157
+ var vector2dValue: Vector2D {
158
+ Vector2D(x: Double(x), y: Double(y))
159
+ }
160
+ }
161
+
162
+ // MARK: - Vector3D + Codable
163
+
164
+ /// A three dimensional vector.
165
+ /// These vectors are encoded and decoded from [Double]
166
+
167
+ extension Vector3D: Codable {
168
+
169
+ // MARK: Lifecycle
170
+
171
+ init(x: CGFloat, y: CGFloat, z: CGFloat) {
172
+ self.x = Double(x)
173
+ self.y = Double(y)
174
+ self.z = Double(z)
175
+ }
176
+
177
+ public init(from decoder: Decoder) throws {
178
+ var container = try decoder.unkeyedContainer()
179
+
180
+ if !container.isAtEnd {
181
+ x = try container.decode(Double.self)
182
+ } else {
183
+ x = 0
184
+ }
185
+
186
+ if !container.isAtEnd {
187
+ y = try container.decode(Double.self)
188
+ } else {
189
+ y = 0
190
+ }
191
+
192
+ if !container.isAtEnd {
193
+ z = try container.decode(Double.self)
194
+ } else {
195
+ z = 0
196
+ }
197
+ }
198
+
199
+ // MARK: Public
200
+
201
+ public func encode(to encoder: Encoder) throws {
202
+ var container = encoder.unkeyedContainer()
203
+ try container.encode(x)
204
+ try container.encode(y)
205
+ try container.encode(z)
206
+ }
207
+
208
+ }
209
+
210
+ // MARK: - Vector3D + AnyInitializable
211
+
212
+ extension Vector3D: AnyInitializable {
213
+
214
+ init(value: Any) throws {
215
+ guard var array = value as? [Double] else {
216
+ throw InitializableError.invalidInput
217
+ }
218
+ x = array.count > 0 ? array.removeFirst() : 0
219
+ y = array.count > 0 ? array.removeFirst() : 0
220
+ z = array.count > 0 ? array.removeFirst() : 0
221
+ }
222
+
223
+ }
224
+
225
+ extension Vector3D {
226
+ public var pointValue: CGPoint {
227
+ CGPoint(x: x, y: y)
228
+ }
229
+
230
+ public var sizeValue: CGSize {
231
+ CGSize(width: x, height: y)
232
+ }
233
+ }
234
+
235
+ extension CGPoint {
236
+ var vector3dValue: Vector3D {
237
+ Vector3D(x: x, y: y, z: 0)
238
+ }
239
+ }
240
+
241
+ extension CGSize {
242
+ var vector3dValue: Vector3D {
243
+ Vector3D(x: width, y: height, z: 1)
244
+ }
245
+ }
246
+
247
+ extension CATransform3D {
248
+
249
+ static func makeSkew(skew: CGFloat, skewAxis: CGFloat) -> CATransform3D {
250
+ let mCos = cos(skewAxis.toRadians())
251
+ let mSin = sin(skewAxis.toRadians())
252
+ let aTan = tan(skew.toRadians())
253
+
254
+ let transform1 = CATransform3D(
255
+ m11: mCos,
256
+ m12: mSin,
257
+ m13: 0,
258
+ m14: 0,
259
+ m21: -mSin,
260
+ m22: mCos,
261
+ m23: 0,
262
+ m24: 0,
263
+ m31: 0,
264
+ m32: 0,
265
+ m33: 1,
266
+ m34: 0,
267
+ m41: 0,
268
+ m42: 0,
269
+ m43: 0,
270
+ m44: 1)
271
+
272
+ let transform2 = CATransform3D(
273
+ m11: 1,
274
+ m12: 0,
275
+ m13: 0,
276
+ m14: 0,
277
+ m21: aTan,
278
+ m22: 1,
279
+ m23: 0,
280
+ m24: 0,
281
+ m31: 0,
282
+ m32: 0,
283
+ m33: 1,
284
+ m34: 0,
285
+ m41: 0,
286
+ m42: 0,
287
+ m43: 0,
288
+ m44: 1)
289
+
290
+ let transform3 = CATransform3D(
291
+ m11: mCos,
292
+ m12: -mSin,
293
+ m13: 0,
294
+ m14: 0,
295
+ m21: mSin,
296
+ m22: mCos,
297
+ m23: 0,
298
+ m24: 0,
299
+ m31: 0,
300
+ m32: 0,
301
+ m33: 1,
302
+ m34: 0,
303
+ m41: 0,
304
+ m42: 0,
305
+ m43: 0,
306
+ m44: 1)
307
+ return CATransform3DConcat(transform3, CATransform3DConcat(transform2, transform1))
308
+ }
309
+
310
+ static func makeTransform(
311
+ anchor: CGPoint,
312
+ position: CGPoint,
313
+ scale: CGSize,
314
+ rotation: CGFloat,
315
+ skew: CGFloat?,
316
+ skewAxis: CGFloat?)
317
+ -> CATransform3D
318
+ {
319
+ if let skew = skew, let skewAxis = skewAxis {
320
+ return CATransform3DMakeTranslation(position.x, position.y, 0).rotated(rotation).skewed(skew: -skew, skewAxis: skewAxis)
321
+ .scaled(scale * 0.01).translated(anchor * -1)
322
+ }
323
+ return CATransform3DMakeTranslation(position.x, position.y, 0).rotated(rotation).scaled(scale * 0.01).translated(anchor * -1)
324
+ }
325
+
326
+ func rotated(_ degrees: CGFloat) -> CATransform3D {
327
+ CATransform3DRotate(self, degrees.toRadians(), 0, 0, 1)
328
+ }
329
+
330
+ func translated(_ translation: CGPoint) -> CATransform3D {
331
+ CATransform3DTranslate(self, translation.x, translation.y, 0)
332
+ }
333
+
334
+ func scaled(_ scale: CGSize) -> CATransform3D {
335
+ CATransform3DScale(self, scale.width, scale.height, 1)
336
+ }
337
+
338
+ func skewed(skew: CGFloat, skewAxis: CGFloat) -> CATransform3D {
339
+ CATransform3DConcat(CATransform3D.makeSkew(skew: skew, skewAxis: skewAxis), self)
340
+ }
341
+ }
@@ -0,0 +1,266 @@
1
+ //
2
+ // AnimationPublic.swift
3
+ // lottie-swift
4
+ //
5
+ // Created by Brandon Withrow on 2/5/19.
6
+ //
7
+
8
+ import CoreGraphics
9
+ import Foundation
10
+
11
+ extension Animation {
12
+
13
+ /// A closure for an Animation download. The closure is passed `nil` if there was an error.
14
+ public typealias DownloadClosure = (Animation?) -> Void
15
+
16
+ /// The duration in seconds of the animation.
17
+ public var duration: TimeInterval {
18
+ Double(endFrame - startFrame) / framerate
19
+ }
20
+
21
+ /// The natural bounds in points of the animation.
22
+ public var bounds: CGRect {
23
+ CGRect(x: 0, y: 0, width: width, height: height)
24
+ }
25
+
26
+ /// The natural size in points of the animation.
27
+ public var size: CGSize {
28
+ CGSize(width: width, height: height)
29
+ }
30
+
31
+ // MARK: Animation (Loading)
32
+
33
+ /// Loads an animation model from a bundle by its name. Returns `nil` if an animation is not found.
34
+ ///
35
+ /// - Parameter name: The name of the json file without the json extension. EG "StarAnimation"
36
+ /// - Parameter bundle: The bundle in which the animation is located. Defaults to `Bundle.main`
37
+ /// - Parameter subdirectory: A subdirectory in the bundle in which the animation is located. Optional.
38
+ /// - Parameter animationCache: A cache for holding loaded animations. Optional.
39
+ ///
40
+ /// - Returns: Deserialized `Animation`. Optional.
41
+ public static func named(
42
+ _ name: String,
43
+ bundle: Bundle = Bundle.main,
44
+ subdirectory: String? = nil,
45
+ animationCache: AnimationCacheProvider? = nil)
46
+ -> Animation?
47
+ {
48
+ /// Create a cache key for the animation.
49
+ let cacheKey = bundle.bundlePath + (subdirectory ?? "") + "/" + name
50
+
51
+ /// Check cache for animation
52
+ if
53
+ let animationCache = animationCache,
54
+ let animation = animationCache.animation(forKey: cacheKey)
55
+ {
56
+ /// If found, return the animation.
57
+ return animation
58
+ }
59
+
60
+ do {
61
+ /// Decode animation.
62
+ guard let json = try bundle.getAnimationData(name, subdirectory: subdirectory) else {
63
+ return nil
64
+ }
65
+ let animation = try Animation.from(data: json)
66
+ animationCache?.setAnimation(animation, forKey: cacheKey)
67
+ return animation
68
+ } catch {
69
+ /// Decoding error.
70
+ LottieLogger.shared.warn("Error when decoding animation \"\(name)\": \(error)")
71
+ return nil
72
+ }
73
+ }
74
+
75
+ /// Loads an animation from a specific filepath.
76
+ /// - Parameter filepath: The absolute filepath of the animation to load. EG "/User/Me/starAnimation.json"
77
+ /// - Parameter animationCache: A cache for holding loaded animations. Optional.
78
+ ///
79
+ /// - Returns: Deserialized `Animation`. Optional.
80
+ public static func filepath(
81
+ _ filepath: String,
82
+ animationCache: AnimationCacheProvider? = nil)
83
+ -> Animation?
84
+ {
85
+ /// Check cache for animation
86
+ if
87
+ let animationCache = animationCache,
88
+ let animation = animationCache.animation(forKey: filepath)
89
+ {
90
+ return animation
91
+ }
92
+
93
+ do {
94
+ /// Decode the animation.
95
+ let json = try Data(contentsOf: URL(fileURLWithPath: filepath))
96
+ let animation = try Animation.from(data: json)
97
+ animationCache?.setAnimation(animation, forKey: filepath)
98
+ return animation
99
+ } catch {
100
+ /// Decoding Error.
101
+ return nil
102
+ }
103
+ }
104
+
105
+ /// Loads an animation model from the asset catalog by its name. Returns `nil` if an animation is not found.
106
+ /// - Parameter name: The name of the json file in the asset catalog. EG "StarAnimation"
107
+ /// - Parameter bundle: The bundle in which the animation is located. Defaults to `Bundle.main`
108
+ /// - Parameter animationCache: A cache for holding loaded animations. Optional.
109
+ /// - Returns: Deserialized `Animation`. Optional.
110
+ public static func asset(
111
+ _ name: String,
112
+ bundle: Bundle = Bundle.main,
113
+ animationCache: AnimationCacheProvider? = nil)
114
+ -> Animation?
115
+ {
116
+ /// Create a cache key for the animation.
117
+ let cacheKey = bundle.bundlePath + "/" + name
118
+
119
+ /// Check cache for animation
120
+ if
121
+ let animationCache = animationCache,
122
+ let animation = animationCache.animation(forKey: cacheKey)
123
+ {
124
+ /// If found, return the animation.
125
+ return animation
126
+ }
127
+
128
+ /// Load jsonData from Asset
129
+ guard let json = Data.jsonData(from: name, in: bundle) else {
130
+ return nil
131
+ }
132
+
133
+ do {
134
+ /// Decode animation.
135
+ let animation = try Animation.from(data: json)
136
+ animationCache?.setAnimation(animation, forKey: cacheKey)
137
+ return animation
138
+ } catch {
139
+ /// Decoding error.
140
+ return nil
141
+ }
142
+ }
143
+
144
+ /// Loads a Lottie animation from a `Data` object containing a JSON animation.
145
+ ///
146
+ /// - Parameter data: The object to load the animation from.
147
+ /// - Parameter strategy: How the data should be decoded. Defaults to using the strategy set in `LottieConfiguration.shared`.
148
+ /// - Returns: Deserialized `Animation`. Optional.
149
+ ///
150
+ public static func from(
151
+ data: Data,
152
+ strategy: DecodingStrategy = LottieConfiguration.shared.decodingStrategy) throws
153
+ -> Animation
154
+ {
155
+ switch strategy {
156
+ case .codable:
157
+ return try JSONDecoder().decode(Animation.self, from: data)
158
+ case .dictionaryBased:
159
+ let json = try JSONSerialization.jsonObject(with: data)
160
+ guard let dict = json as? [String: Any] else {
161
+ throw InitializableError.invalidInput
162
+ }
163
+ return try Animation(dictionary: dict)
164
+ }
165
+ }
166
+
167
+ /// Loads a Lottie animation asynchronously from the URL.
168
+ ///
169
+ /// - Parameter url: The url to load the animation from.
170
+ /// - Parameter closure: A closure to be called when the animation has loaded.
171
+ /// - Parameter animationCache: A cache for holding loaded animations.
172
+ ///
173
+ public static func loadedFrom(
174
+ url: URL,
175
+ closure: @escaping Animation.DownloadClosure,
176
+ animationCache: AnimationCacheProvider?)
177
+ {
178
+ if let animationCache = animationCache, let animation = animationCache.animation(forKey: url.absoluteString) {
179
+ closure(animation)
180
+ } else {
181
+ let task = URLSession.shared.dataTask(with: url) { data, _, error in
182
+ guard error == nil, let jsonData = data else {
183
+ DispatchQueue.main.async {
184
+ closure(nil)
185
+ }
186
+ return
187
+ }
188
+ do {
189
+ let animation = try Animation.from(data: jsonData)
190
+ DispatchQueue.main.async {
191
+ animationCache?.setAnimation(animation, forKey: url.absoluteString)
192
+ closure(animation)
193
+ }
194
+ } catch {
195
+ DispatchQueue.main.async {
196
+ closure(nil)
197
+ }
198
+ }
199
+ }
200
+ task.resume()
201
+ }
202
+ }
203
+
204
+ // MARK: Animation (Helpers)
205
+
206
+ /// Markers are a way to describe a point in time by a key name.
207
+ ///
208
+ /// Markers are encoded into animation JSON. By using markers a designer can mark
209
+ /// playback points for a developer to use without having to worry about keeping
210
+ /// track of animation frames. If the animation file is updated, the developer
211
+ /// does not need to update playback code.
212
+ ///
213
+ /// Returns the Progress Time for the marker named. Returns nil if no marker found.
214
+ public func progressTime(forMarker named: String) -> AnimationProgressTime? {
215
+ guard let markers = markerMap, let marker = markers[named] else {
216
+ return nil
217
+ }
218
+ return progressTime(forFrame: marker.frameTime)
219
+ }
220
+
221
+ /// Markers are a way to describe a point in time by a key name.
222
+ ///
223
+ /// Markers are encoded into animation JSON. By using markers a designer can mark
224
+ /// playback points for a developer to use without having to worry about keeping
225
+ /// track of animation frames. If the animation file is updated, the developer
226
+ /// does not need to update playback code.
227
+ ///
228
+ /// Returns the Frame Time for the marker named. Returns nil if no marker found.
229
+ public func frameTime(forMarker named: String) -> AnimationFrameTime? {
230
+ guard let markers = markerMap, let marker = markers[named] else {
231
+ return nil
232
+ }
233
+ return marker.frameTime
234
+ }
235
+
236
+ /// Converts Frame Time (Seconds * Framerate) into Progress Time
237
+ /// (optionally clamped to between 0 and 1).
238
+ public func progressTime(
239
+ forFrame frameTime: AnimationFrameTime,
240
+ clamped: Bool = true)
241
+ -> AnimationProgressTime
242
+ {
243
+ let progressTime = ((frameTime - startFrame) / (endFrame - startFrame))
244
+
245
+ if clamped {
246
+ return progressTime.clamp(0, 1)
247
+ } else {
248
+ return progressTime
249
+ }
250
+ }
251
+
252
+ /// Converts Progress Time (0 to 1) into Frame Time (Seconds * Framerate)
253
+ public func frameTime(forProgress progressTime: AnimationProgressTime) -> AnimationFrameTime {
254
+ ((endFrame - startFrame) * progressTime) + startFrame
255
+ }
256
+
257
+ /// Converts Frame Time (Seconds * Framerate) into Time (Seconds)
258
+ public func time(forFrame frameTime: AnimationFrameTime) -> TimeInterval {
259
+ Double(frameTime - startFrame) / framerate
260
+ }
261
+
262
+ /// Converts Time (Seconds) into Frame Time (Seconds * Framerate)
263
+ public func frameTime(forTime time: TimeInterval) -> AnimationFrameTime {
264
+ CGFloat(time * framerate) + startFrame
265
+ }
266
+ }