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,450 @@
1
+ //
2
+ // MathKit.swift
3
+ // UIToolBox
4
+ //
5
+ // Created by Brandon Withrow on 10/10/18.
6
+ //
7
+ // From https://github.com/buba447/UIToolBox
8
+
9
+ import CoreGraphics
10
+ import Foundation
11
+
12
+ extension Int {
13
+ var cgFloat: CGFloat {
14
+ CGFloat(self)
15
+ }
16
+ }
17
+
18
+ extension Double {
19
+ var cgFloat: CGFloat {
20
+ CGFloat(self)
21
+ }
22
+ }
23
+
24
+ // MARK: - CGFloat + Interpolatable
25
+
26
+ extension CGFloat {
27
+
28
+ func remap(fromLow: CGFloat, fromHigh: CGFloat, toLow: CGFloat, toHigh: CGFloat) -> CGFloat {
29
+ guard (fromHigh - fromLow) != 0 else {
30
+ // Would produce NAN
31
+ return 0
32
+ }
33
+ return toLow + (self - fromLow) * (toHigh - toLow) / (fromHigh - fromLow)
34
+ }
35
+
36
+ /// Returns a value that is clamped between the two numbers
37
+ ///
38
+ /// 1. The order of arguments does not matter.
39
+ func clamp(_ a: CGFloat, _ b: CGFloat) -> CGFloat {
40
+ CGFloat(Double(self).clamp(Double(a), Double(b)))
41
+ }
42
+
43
+ /// Returns the difference between the receiver and the given number.
44
+ /// - Parameter absolute: If *true* (Default) the returned value will always be positive.
45
+ func diff(_ a: CGFloat, absolute: Bool = true) -> CGFloat {
46
+ absolute ? abs(a - self) : a - self
47
+ }
48
+
49
+ func toRadians() -> CGFloat { self * .pi / 180 }
50
+ func toDegrees() -> CGFloat { self * 180 / .pi }
51
+
52
+ }
53
+
54
+ // MARK: - Double
55
+
56
+ extension Double {
57
+
58
+ func remap(fromLow: Double, fromHigh: Double, toLow: Double, toHigh: Double) -> Double {
59
+ toLow + (self - fromLow) * (toHigh - toLow) / (fromHigh - fromLow)
60
+ }
61
+
62
+ /// Returns a value that is clamped between the two numbers
63
+ ///
64
+ /// 1. The order of arguments does not matter.
65
+ func clamp(_ a: Double, _ b: Double) -> Double {
66
+ let minValue = a <= b ? a : b
67
+ let maxValue = a <= b ? b : a
68
+ return max(min(self, maxValue), minValue)
69
+ }
70
+
71
+ }
72
+
73
+ extension CGRect {
74
+
75
+ // MARK: Lifecycle
76
+
77
+ /// Initializes a new CGRect with a center point and size.
78
+ init(center: CGPoint, size: CGSize) {
79
+ self.init(
80
+ x: center.x - (size.width * 0.5),
81
+ y: center.y - (size.height * 0.5),
82
+ width: size.width,
83
+ height: size.height)
84
+ }
85
+
86
+ // MARK: Internal
87
+
88
+ /// Returns the total area of the rect.
89
+ var area: CGFloat {
90
+ width * height
91
+ }
92
+
93
+ /// The center point of the rect. Settable.
94
+ var center: CGPoint {
95
+ get {
96
+ CGPoint(x: midX, y: midY)
97
+ }
98
+ set {
99
+ origin = CGPoint(
100
+ x: newValue.x - (size.width * 0.5),
101
+ y: newValue.y - (size.height * 0.5))
102
+ }
103
+ }
104
+
105
+ /// The top left point of the rect. Settable.
106
+ var topLeft: CGPoint {
107
+ get {
108
+ CGPoint(x: minX, y: minY)
109
+ }
110
+ set {
111
+ origin = CGPoint(
112
+ x: newValue.x,
113
+ y: newValue.y)
114
+ }
115
+ }
116
+
117
+ /// The bottom left point of the rect. Settable.
118
+ var bottomLeft: CGPoint {
119
+ get {
120
+ CGPoint(x: minX, y: maxY)
121
+ }
122
+ set {
123
+ origin = CGPoint(
124
+ x: newValue.x,
125
+ y: newValue.y - size.height)
126
+ }
127
+ }
128
+
129
+ /// The top right point of the rect. Settable.
130
+ var topRight: CGPoint {
131
+ get {
132
+ CGPoint(x: maxX, y: minY)
133
+ }
134
+ set {
135
+ origin = CGPoint(
136
+ x: newValue.x - size.width,
137
+ y: newValue.y)
138
+ }
139
+ }
140
+
141
+ /// The bottom right point of the rect. Settable.
142
+ var bottomRight: CGPoint {
143
+ get {
144
+ CGPoint(x: maxX, y: maxY)
145
+ }
146
+ set {
147
+ origin = CGPoint(
148
+ x: newValue.x - size.width,
149
+ y: newValue.y - size.height)
150
+ }
151
+ }
152
+
153
+ }
154
+
155
+ extension CGSize {
156
+
157
+ /// Operator convenience to add sizes with +
158
+ static func +(left: CGSize, right: CGSize) -> CGSize {
159
+ left.add(right)
160
+ }
161
+
162
+ /// Operator convenience to subtract sizes with -
163
+ static func -(left: CGSize, right: CGSize) -> CGSize {
164
+ left.subtract(right)
165
+ }
166
+
167
+ /// Operator convenience to multiply sizes with *
168
+ static func *(left: CGSize, right: CGFloat) -> CGSize {
169
+ CGSize(width: left.width * right, height: left.height * right)
170
+ }
171
+
172
+ /// Returns the scale float that will fit the receive inside of the given size.
173
+ func scaleThatFits(_ size: CGSize) -> CGFloat {
174
+ CGFloat.minimum(width / size.width, height / size.height)
175
+ }
176
+
177
+ /// Adds receiver size to give size.
178
+ func add(_ size: CGSize) -> CGSize {
179
+ CGSize(width: width + size.width, height: height + size.height)
180
+ }
181
+
182
+ /// Subtracts given size from receiver size.
183
+ func subtract(_ size: CGSize) -> CGSize {
184
+ CGSize(width: width - size.width, height: height - size.height)
185
+ }
186
+
187
+ /// Multiplies receiver size by the given size.
188
+ func multiply(_ size: CGSize) -> CGSize {
189
+ CGSize(width: width * size.width, height: height * size.height)
190
+ }
191
+ }
192
+
193
+ // MARK: - CGLine
194
+
195
+ /// A struct that defines a line segment with two CGPoints
196
+ struct CGLine {
197
+
198
+ // MARK: Lifecycle
199
+
200
+ /// Initializes a line segment with start and end points
201
+ init(start: CGPoint, end: CGPoint) {
202
+ self.start = start
203
+ self.end = end
204
+ }
205
+
206
+ // MARK: Internal
207
+
208
+ /// The Start of the line segment.
209
+ var start: CGPoint
210
+ /// The End of the line segment.
211
+ var end: CGPoint
212
+
213
+ /// The length of the line segment.
214
+ var length: CGFloat {
215
+ end.distanceTo(start)
216
+ }
217
+
218
+ /// Returns a line segment that is normalized to a length of 1
219
+ func normalize() -> CGLine {
220
+ let len = length
221
+ guard len > 0 else {
222
+ return self
223
+ }
224
+ let relativeEnd = end - start
225
+ let relativeVector = CGPoint(x: relativeEnd.x / len, y: relativeEnd.y / len)
226
+ let absoluteVector = relativeVector + start
227
+ return CGLine(start: start, end: absoluteVector)
228
+ }
229
+
230
+ /// Trims a line segment to the given length
231
+ func trimmedToLength(_ toLength: CGFloat) -> CGLine {
232
+ let len = length
233
+ guard len > 0 else {
234
+ return self
235
+ }
236
+ let relativeEnd = end - start
237
+ let relativeVector = CGPoint(x: relativeEnd.x / len, y: relativeEnd.y / len)
238
+ let sizedVector = CGPoint(x: relativeVector.x * toLength, y: relativeVector.y * toLength)
239
+ let absoluteVector = sizedVector + start
240
+ return CGLine(start: start, end: absoluteVector)
241
+ }
242
+
243
+ /// Flips a line vertically and horizontally from the start point.
244
+ func flipped() -> CGLine {
245
+ let relativeEnd = end - start
246
+ let flippedEnd = CGPoint(x: relativeEnd.x * -1, y: relativeEnd.y * -1)
247
+ return CGLine(start: start, end: flippedEnd + start)
248
+ }
249
+
250
+ /// Move the line to the new start point.
251
+ func transpose(_ toPoint: CGPoint) -> CGLine {
252
+ let diff = toPoint - start
253
+ let newEnd = end + diff
254
+ return CGLine(start: toPoint, end: newEnd)
255
+ }
256
+
257
+ }
258
+
259
+ infix operator +|
260
+ infix operator +-
261
+
262
+ extension CGPoint {
263
+
264
+ /// Returns the length between the receiver and *CGPoint.zero*
265
+ var vectorLength: CGFloat {
266
+ distanceTo(.zero)
267
+ }
268
+
269
+ var isZero: Bool {
270
+ x == 0 && y == 0
271
+ }
272
+
273
+ /// Operator convenience to divide points with /
274
+ static func / (lhs: CGPoint, rhs: CGFloat) -> CGPoint {
275
+ CGPoint(x: lhs.x / CGFloat(rhs), y: lhs.y / CGFloat(rhs))
276
+ }
277
+
278
+ /// Operator convenience to multiply points with *
279
+ static func * (lhs: CGPoint, rhs: CGFloat) -> CGPoint {
280
+ CGPoint(x: lhs.x * CGFloat(rhs), y: lhs.y * CGFloat(rhs))
281
+ }
282
+
283
+ /// Operator convenience to add points with +
284
+ static func +(left: CGPoint, right: CGPoint) -> CGPoint {
285
+ left.add(right)
286
+ }
287
+
288
+ /// Operator convenience to subtract points with -
289
+ static func -(left: CGPoint, right: CGPoint) -> CGPoint {
290
+ left.subtract(right)
291
+ }
292
+
293
+ static func +|(left: CGPoint, right: CGFloat) -> CGPoint {
294
+ CGPoint(x: left.x, y: left.y + right)
295
+ }
296
+
297
+ static func +-(left: CGPoint, right: CGFloat) -> CGPoint {
298
+ CGPoint(x: left.x + right, y: left.y)
299
+ }
300
+
301
+ /// Returns the distance between the receiver and the given point.
302
+ func distanceTo(_ a: CGPoint) -> CGFloat {
303
+ let xDist = a.x - x
304
+ let yDist = a.y - y
305
+ return CGFloat(sqrt((xDist * xDist) + (yDist * yDist)))
306
+ }
307
+
308
+ func rounded(decimal: CGFloat) -> CGPoint {
309
+ CGPoint(x: round(decimal * x) / decimal, y: round(decimal * y) / decimal)
310
+ }
311
+
312
+ func interpolate(
313
+ _ to: CGPoint,
314
+ outTangent: CGPoint,
315
+ inTangent: CGPoint,
316
+ amount: CGFloat,
317
+ maxIterations: Int = 3,
318
+ samples: Int = 20,
319
+ accuracy: CGFloat = 1)
320
+ -> CGPoint
321
+ {
322
+ if amount == 0 {
323
+ return self
324
+ }
325
+ if amount == 1 {
326
+ return to
327
+ }
328
+
329
+ if
330
+ colinear(outTangent, inTangent) == true,
331
+ outTangent.colinear(inTangent, to) == true
332
+ {
333
+ return interpolate(to: to, amount: amount)
334
+ }
335
+
336
+ let step = 1 / CGFloat(samples)
337
+
338
+ var points: [(point: CGPoint, distance: CGFloat)] = [(point: self, distance: 0)]
339
+ var totalLength: CGFloat = 0
340
+
341
+ var previousPoint = self
342
+ var previousAmount = CGFloat(0)
343
+
344
+ var closestPoint = 0
345
+
346
+ while previousAmount < 1 {
347
+ previousAmount = previousAmount + step
348
+
349
+ if previousAmount < amount {
350
+ closestPoint = closestPoint + 1
351
+ }
352
+
353
+ let newPoint = pointOnPath(to, outTangent: outTangent, inTangent: inTangent, amount: previousAmount)
354
+ let distance = previousPoint.distanceTo(newPoint)
355
+ totalLength = totalLength + distance
356
+ points.append((point: newPoint, distance: totalLength))
357
+ previousPoint = newPoint
358
+ }
359
+
360
+ let accurateDistance = amount * totalLength
361
+ var point = points[closestPoint]
362
+
363
+ var foundPoint = false
364
+
365
+ var pointAmount = CGFloat(closestPoint) * step
366
+ var nextPointAmount: CGFloat = pointAmount + step
367
+
368
+ var refineIterations = 0
369
+ while foundPoint == false {
370
+ refineIterations = refineIterations + 1
371
+ /// First see if the next point is still less than the projected length.
372
+ let nextPoint = points[closestPoint + 1]
373
+ if nextPoint.distance < accurateDistance {
374
+ point = nextPoint
375
+ closestPoint = closestPoint + 1
376
+ pointAmount = CGFloat(closestPoint) * step
377
+ nextPointAmount = pointAmount + step
378
+ if closestPoint == points.count {
379
+ foundPoint = true
380
+ }
381
+ continue
382
+ }
383
+ if accurateDistance < point.distance {
384
+ closestPoint = closestPoint - 1
385
+ if closestPoint < 0 {
386
+ foundPoint = true
387
+ continue
388
+ }
389
+ point = points[closestPoint]
390
+ pointAmount = CGFloat(closestPoint) * step
391
+ nextPointAmount = pointAmount + step
392
+ continue
393
+ }
394
+
395
+ /// Now we are certain the point is the closest point under the distance
396
+ let pointDiff = nextPoint.distance - point.distance
397
+ let proposedPointAmount = ((accurateDistance - point.distance) / pointDiff)
398
+ .remap(fromLow: 0, fromHigh: 1, toLow: pointAmount, toHigh: nextPointAmount)
399
+
400
+ let newPoint = pointOnPath(to, outTangent: outTangent, inTangent: inTangent, amount: proposedPointAmount)
401
+ let newDistance = point.distance + point.point.distanceTo(newPoint)
402
+ pointAmount = proposedPointAmount
403
+ point = (point: newPoint, distance: newDistance)
404
+ if
405
+ accurateDistance - newDistance <= accuracy ||
406
+ newDistance - accurateDistance <= accuracy
407
+ {
408
+ foundPoint = true
409
+ }
410
+
411
+ if refineIterations == maxIterations {
412
+ foundPoint = true
413
+ }
414
+ }
415
+ return point.point
416
+ }
417
+
418
+ func pointOnPath(_ to: CGPoint, outTangent: CGPoint, inTangent: CGPoint, amount: CGFloat) -> CGPoint {
419
+ let a = interpolate(to: outTangent, amount: amount)
420
+ let b = outTangent.interpolate(to: inTangent, amount: amount)
421
+ let c = inTangent.interpolate(to: to, amount: amount)
422
+ let d = a.interpolate(to: b, amount: amount)
423
+ let e = b.interpolate(to: c, amount: amount)
424
+ let f = d.interpolate(to: e, amount: amount)
425
+ return f
426
+ }
427
+
428
+ func colinear(_ a: CGPoint, _ b: CGPoint) -> Bool {
429
+ let area = x * (a.y - b.y) + a.x * (b.y - y) + b.x * (y - a.y);
430
+ let accuracy: CGFloat = 0.05
431
+ if area < accuracy, area > -accuracy {
432
+ return true
433
+ }
434
+ return false
435
+ }
436
+
437
+ /// Subtracts the given point from the receiving point.
438
+ func subtract(_ point: CGPoint) -> CGPoint {
439
+ CGPoint(
440
+ x: x - point.x,
441
+ y: y - point.y)
442
+ }
443
+
444
+ /// Adds the given point from the receiving point.
445
+ func add(_ point: CGPoint) -> CGPoint {
446
+ CGPoint(
447
+ x: x + point.x,
448
+ y: y + point.y)
449
+ }
450
+ }
@@ -0,0 +1,38 @@
1
+ //
2
+ // StringExtensions.swift
3
+ // lottie-swift
4
+ //
5
+ // Created by Brandon Withrow on 1/25/19.
6
+ //
7
+
8
+ import CoreGraphics
9
+ import Foundation
10
+
11
+ extension String {
12
+
13
+ var cgColor: CGColor {
14
+ let (red, green, blue) = hexColorComponents()
15
+ return .rgb(red, green, blue)
16
+ }
17
+
18
+ func hexColorComponents() -> (red: CGFloat, green: CGFloat, blue: CGFloat) {
19
+ var cString: String = trimmingCharacters(in: .whitespacesAndNewlines).uppercased()
20
+
21
+ if cString.hasPrefix("#") {
22
+ cString.remove(at: cString.startIndex)
23
+ }
24
+
25
+ if (cString.count) != 6 {
26
+ return (red: 0, green: 0, blue: 0)
27
+ }
28
+
29
+ var rgbValue: UInt64 = 0
30
+ Scanner(string: cString).scanHexInt64(&rgbValue)
31
+
32
+ return (
33
+ red: CGFloat((rgbValue & 0xFF0000) >> 16) / 255.0,
34
+ green: CGFloat((rgbValue & 0x00FF00) >> 8) / 255.0,
35
+ blue: CGFloat(rgbValue & 0x0000FF) / 255.0)
36
+ }
37
+
38
+ }
@@ -5,49 +5,67 @@
5
5
  // Created by Brandon Withrow on 2/1/19.
6
6
  //
7
7
 
8
- import Foundation
9
8
  import CoreGraphics
9
+ import Foundation
10
10
  import QuartzCore
11
11
 
12
12
  /// A completion block for animations. `true` is passed in if the animation completed playing.
13
13
  public typealias LottieCompletionBlock = (Bool) -> Void
14
14
 
15
+ // MARK: - AnimationContext
16
+
15
17
  struct AnimationContext {
16
18
 
17
- init(playFrom: CGFloat,
18
- playTo: CGFloat,
19
- closure: LottieCompletionBlock?) {
19
+ init(
20
+ playFrom: AnimationFrameTime,
21
+ playTo: AnimationFrameTime,
22
+ closure: LottieCompletionBlock?)
23
+ {
20
24
  self.playTo = playTo
21
25
  self.playFrom = playFrom
22
26
  self.closure = AnimationCompletionDelegate(completionBlock: closure)
23
27
  }
24
28
 
25
- var playFrom: CGFloat
26
- var playTo: CGFloat
29
+ var playFrom: AnimationFrameTime
30
+ var playTo: AnimationFrameTime
27
31
  var closure: AnimationCompletionDelegate
28
32
 
29
33
  }
30
34
 
35
+ // MARK: Equatable
36
+
37
+ extension AnimationContext: Equatable {
38
+ /// Whether or not the two given `AnimationContext`s are functionally equivalent
39
+ /// - This checks whether or not a completion handler was provided,
40
+ /// but does not check whether or not the two completion handlers are equivalent.
41
+ static func == (_ lhs: AnimationContext, _ rhs: AnimationContext) -> Bool {
42
+ lhs.playTo == rhs.playTo
43
+ && lhs.playFrom == rhs.playFrom
44
+ && (lhs.closure.completionBlock == nil) == (rhs.closure.completionBlock == nil)
45
+ }
46
+ }
47
+
48
+ // MARK: - AnimationContextState
49
+
31
50
  enum AnimationContextState {
32
51
  case playing
33
52
  case cancelled
34
53
  case complete
35
54
  }
36
55
 
56
+ // MARK: - AnimationCompletionDelegate
57
+
37
58
  class AnimationCompletionDelegate: NSObject, CAAnimationDelegate {
38
-
59
+
60
+ // MARK: Lifecycle
61
+
39
62
  init(completionBlock: LottieCompletionBlock?) {
40
63
  self.completionBlock = completionBlock
41
64
  super.init()
42
65
  }
43
-
44
- var animationLayer: AnimationContainer?
45
- var animationKey: String?
46
- var ignoreDelegate: Bool = false
47
- var animationState: AnimationContextState = .playing
48
-
49
- let completionBlock: LottieCompletionBlock?
50
-
66
+
67
+ // MARK: Public
68
+
51
69
  public func animationDidStop(_ anim: CAAnimation, finished flag: Bool) {
52
70
  guard ignoreDelegate == false else { return }
53
71
  animationState = flag ? .complete : .cancelled
@@ -61,5 +79,13 @@ class AnimationCompletionDelegate: NSObject, CAAnimationDelegate {
61
79
  completionBlock(flag)
62
80
  }
63
81
  }
64
-
82
+
83
+ // MARK: Internal
84
+
85
+ var animationLayer: RootAnimationLayer?
86
+ var animationKey: String?
87
+ var ignoreDelegate = false
88
+ var animationState: AnimationContextState = .playing
89
+
90
+ let completionBlock: LottieCompletionBlock?
65
91
  }
@@ -0,0 +1,134 @@
1
+ //
2
+ // InterpolatableExtensions.swift
3
+ // lottie-swift
4
+ //
5
+ // Created by Brandon Withrow on 1/14/19.
6
+ //
7
+
8
+ import CoreGraphics
9
+ import Foundation
10
+
11
+ extension Color {
12
+
13
+ // MARK: Lifecycle
14
+
15
+ /// Initialize a new color with Hue Saturation and Value
16
+ init(h: Double, s: Double, v: Double, a: Double) {
17
+ let i = floor(h * 6)
18
+ let f = h * 6 - i
19
+ let p = v * (1 - s);
20
+ let q = v * (1 - f * s)
21
+ let t = v * (1 - (1 - f) * s)
22
+
23
+ switch i.truncatingRemainder(dividingBy: 6) {
24
+ case 0:
25
+ r = v
26
+ g = t
27
+ b = p
28
+ case 1:
29
+ r = q
30
+ g = v
31
+ b = p
32
+ case 2:
33
+ r = p
34
+ g = v
35
+ b = t
36
+ case 3:
37
+ r = p
38
+ g = q
39
+ b = v
40
+ case 4:
41
+ r = t
42
+ g = p
43
+ b = v
44
+ case 5:
45
+ r = v
46
+ g = p
47
+ b = q
48
+ default:
49
+ r = 0
50
+ g = 0
51
+ b = 0
52
+ }
53
+ self.a = a
54
+ }
55
+
56
+ init(y: Double, u: Double, v: Double, a: Double) {
57
+ // From https://www.fourcc.org/fccyvrgb.php
58
+ r = y + 1.403 * v
59
+ g = y - 0.344 * u
60
+ b = y + 1.770 * u
61
+ self.a = a
62
+ }
63
+
64
+ // MARK: Internal
65
+
66
+ /// Hue Saturation Value of the color.
67
+ var hsva: (h: Double, s: Double, v: Double, a: Double) {
68
+ let maxValue = max(r, g, b)
69
+ let minValue = min(r, g, b)
70
+
71
+ var h: Double, s: Double, v: Double = maxValue
72
+
73
+ let d = maxValue - minValue
74
+ s = maxValue == 0 ? 0 : d / maxValue;
75
+
76
+ if maxValue == minValue {
77
+ h = 0; // achromatic
78
+ } else {
79
+ switch maxValue {
80
+ case r: h = (g - b) / d + (g < b ? 6 : 0)
81
+ case g: h = (b - r) / d + 2
82
+ case b: h = (r - g) / d + 4
83
+ default: h = maxValue
84
+ }
85
+ h = h / 6
86
+ }
87
+ return (h: h, s: s, v: v, a: a)
88
+ }
89
+
90
+ var yuv: (y: Double, u: Double, v: Double, a: Double) {
91
+ /// From https://www.fourcc.org/fccyvrgb.php
92
+ let y = 0.299 * r + 0.587 * g + 0.114 * b
93
+ let u = -0.14713 * r - 0.28886 * g + 0.436 * b
94
+ let v = 0.615 * r - 0.51499 * g - 0.10001 * b
95
+ return (y: y, u: u, v: v, a: a)
96
+ }
97
+
98
+ }
99
+
100
+ // MARK: - CurveVertex + Interpolatable
101
+
102
+ extension CurveVertex: Interpolatable {
103
+ func interpolate(to: CurveVertex, amount: CGFloat) -> CurveVertex {
104
+ CurveVertex(
105
+ point: point.interpolate(to: to.point, amount: amount),
106
+ inTangent: inTangent.interpolate(to: to.inTangent, amount: amount),
107
+ outTangent: outTangent.interpolate(to: to.outTangent, amount: amount))
108
+ }
109
+ }
110
+
111
+ // MARK: - BezierPath + Interpolatable
112
+
113
+ extension BezierPath: Interpolatable {
114
+ func interpolate(to: BezierPath, amount: CGFloat) -> BezierPath {
115
+ var newPath = BezierPath()
116
+ for i in 0..<min(elements.count, to.elements.count) {
117
+ let fromVertex = elements[i].vertex
118
+ let toVertex = to.elements[i].vertex
119
+ newPath.addVertex(fromVertex.interpolate(to: toVertex, amount: amount))
120
+ }
121
+ return newPath
122
+ }
123
+ }
124
+
125
+ // MARK: - TextDocument + Interpolatable
126
+
127
+ extension TextDocument: Interpolatable {
128
+ func interpolate(to: TextDocument, amount: CGFloat) -> TextDocument {
129
+ if amount == 1 {
130
+ return to
131
+ }
132
+ return self
133
+ }
134
+ }