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
@@ -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
+ }