lottie-ios 3.2.2 → 3.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (316) hide show
  1. package/.github/actions/setup/action.yml +32 -0
  2. package/.github/issue_template.md +6 -23
  3. package/.github/workflows/main.yml +98 -0
  4. package/.spi.yml +6 -0
  5. package/.swift-version +1 -0
  6. package/.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata +7 -0
  7. package/.swiftpm/xcode/package.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  8. package/.swiftpm/xcode/xcuserdata/{brandonwithrow.xcuserdatad → cal.xcuserdatad}/xcschemes/xcschememanagement.plist +25 -15
  9. package/.swiftpm/xcode/xcuserdata/calstephens.xcuserdatad/xcschemes/xcschememanagement.plist +14 -0
  10. package/Gemfile +4 -0
  11. package/Gemfile.lock +102 -0
  12. package/Lottie.xcodeproj/project.pbxproj +2003 -1972
  13. package/Lottie.xcodeproj/project.xcworkspace/contents.xcworkspacedata +1 -1
  14. package/Lottie.xcodeproj/project.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  15. package/Lottie.xcodeproj/xcshareddata/xcschemes/{Lottie_iOS.xcscheme → Lottie (iOS).xcscheme } +15 -18
  16. package/Lottie.xcodeproj/xcshareddata/xcschemes/{Lottie_macOS.xcscheme → Lottie (macOS).xcscheme } +7 -20
  17. package/Lottie.xcodeproj/xcshareddata/xcschemes/{Lottie_tvOS.xcscheme → Lottie (tvOS).xcscheme } +5 -18
  18. package/Lottie.xcodeproj/xcuserdata/cal.xcuserdatad/xcschemes/xcschememanagement.plist +37 -0
  19. package/Lottie.xcodeproj/xcuserdata/calstephens.xcuserdatad/xcschemes/xcschememanagement.plist +24 -0
  20. package/Lottie.xcworkspace/contents.xcworkspacedata +10 -0
  21. package/Lottie.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
  22. package/Lottie.xcworkspace/xcshareddata/swiftpm/Package.resolved +115 -0
  23. package/Lottie.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  24. package/{Lottie.xcodeproj/xcuserdata/brandonwithrow.xcuserdatad → Lottie.xcworkspace/xcuserdata/cal.xcuserdatad}/xcdebugger/Breakpoints_v2.xcbkptlist +2 -2
  25. package/Lottie.xcworkspace/xcuserdata/cal.xcuserdatad/xcdebugger/Expressions.xcexplist +153 -0
  26. package/Lottie.xcworkspace/xcuserdata/calstephens.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  27. package/Lottie.xcworkspace/xcuserdata/calstephens.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +39 -0
  28. package/Lottie.xcworkspace/xcuserdata/calstephens.xcuserdatad/xcdebugger/Expressions.xcexplist +25 -0
  29. package/Lottie.xcworkspace/xcuserdata/calstephens.xcuserdatad/xcschemes/xcschememanagement.plist +30 -0
  30. package/Package.resolved +88 -0
  31. package/Package.swift +10 -15
  32. package/README.md +40 -60
  33. package/Rakefile +121 -0
  34. package/Sources/Private/CoreAnimation/Animations/CAAnimation+TimingConfiguration.swift +81 -0
  35. package/Sources/Private/CoreAnimation/Animations/CALayer+addAnimation.swift +448 -0
  36. package/Sources/Private/CoreAnimation/Animations/CombinedShapeAnimation.swift +53 -0
  37. package/Sources/Private/CoreAnimation/Animations/CustomPathAnimation.swift +41 -0
  38. package/Sources/Private/CoreAnimation/Animations/EllipseAnimation.swift +28 -0
  39. package/Sources/Private/CoreAnimation/Animations/GradientAnimations.swift +210 -0
  40. package/Sources/Private/CoreAnimation/Animations/LayerProperty.swift +229 -0
  41. package/Sources/Private/CoreAnimation/Animations/OpacityAnimation.swift +52 -0
  42. package/Sources/Private/CoreAnimation/Animations/RectangleAnimation.swift +31 -0
  43. package/Sources/Private/CoreAnimation/Animations/ShapeAnimation.swift +246 -0
  44. package/Sources/Private/CoreAnimation/Animations/StarAnimation.swift +95 -0
  45. package/Sources/Private/CoreAnimation/Animations/StrokeAnimation.swift +70 -0
  46. package/Sources/Private/CoreAnimation/Animations/TransformAnimations.swift +205 -0
  47. package/Sources/Private/CoreAnimation/Animations/VisibilityAnimation.swift +37 -0
  48. package/Sources/Private/CoreAnimation/CompatibilityTracker.swift +130 -0
  49. package/Sources/Private/CoreAnimation/CoreAnimationLayer.swift +492 -0
  50. package/Sources/Private/CoreAnimation/Extensions/CALayer+fillBounds.swift +35 -0
  51. package/Sources/Private/CoreAnimation/Extensions/KeyframeGroup+exactlyOneKeyframe.swift +37 -0
  52. package/Sources/Private/CoreAnimation/Extensions/Keyframes+combinedIfPossible.swift +73 -0
  53. package/Sources/Private/CoreAnimation/Layers/AnimationLayer.swift +83 -0
  54. package/Sources/Private/CoreAnimation/Layers/BaseAnimationLayer.swift +33 -0
  55. package/Sources/Private/CoreAnimation/Layers/BaseCompositionLayer.swift +87 -0
  56. package/Sources/Private/CoreAnimation/Layers/CALayer+setupLayerHierarchy.swift +131 -0
  57. package/Sources/Private/CoreAnimation/Layers/GradientRenderLayer.swift +94 -0
  58. package/Sources/Private/CoreAnimation/Layers/ImageLayer.swift +79 -0
  59. package/Sources/Private/CoreAnimation/Layers/LayerModel+makeAnimationLayer.swift +60 -0
  60. package/Sources/Private/CoreAnimation/Layers/MaskCompositionLayer.swift +138 -0
  61. package/Sources/Private/CoreAnimation/Layers/PreCompLayer.swift +140 -0
  62. package/Sources/Private/CoreAnimation/Layers/ShapeItemLayer.swift +302 -0
  63. package/Sources/Private/CoreAnimation/Layers/ShapeLayer.swift +319 -0
  64. package/Sources/Private/CoreAnimation/Layers/SolidLayer.swift +47 -0
  65. package/Sources/Private/CoreAnimation/Layers/TextLayer.swift +91 -0
  66. package/Sources/Private/CoreAnimation/Layers/TransformLayer.swift +11 -0
  67. package/Sources/Private/CoreAnimation/ValueProviderStore.swift +139 -0
  68. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/CompositionLayer.swift +93 -85
  69. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/ImageCompositionLayer.swift +24 -21
  70. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/MaskContainerLayer.swift +75 -54
  71. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/NullCompositionLayer.swift +5 -5
  72. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/PreCompositionLayer.swift +61 -44
  73. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/ShapeCompositionLayer.swift +22 -20
  74. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/SolidCompositionLayer.swift +26 -17
  75. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/TextCompositionLayer.swift +42 -36
  76. package/{lottie-swift/src/Private/LayerContainers/AnimationContainer.swift → Sources/Private/MainThread/LayerContainers/MainThreadAnimationLayer.swift} +200 -140
  77. package/Sources/Private/MainThread/LayerContainers/Utility/CachedImageProvider.swift +47 -0
  78. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/Utility/CompositionLayersInitializer.swift +33 -24
  79. package/{lottie-swift/src/Private/LayerContainers/Utility/TextLayer.swift → Sources/Private/MainThread/LayerContainers/Utility/CoreTextRenderLayer.swift} +120 -106
  80. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/Utility/InvertedMatteLayer.swift +25 -24
  81. package/Sources/Private/MainThread/LayerContainers/Utility/LayerFontProvider.swift +41 -0
  82. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/Utility/LayerImageProvider.swift +20 -16
  83. package/Sources/Private/MainThread/LayerContainers/Utility/LayerTextProvider.swift +40 -0
  84. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/Utility/LayerTransformNode.swift +82 -67
  85. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Extensions/ItemsExtension.swift +4 -4
  86. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/NodeProperty.swift +29 -21
  87. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/Protocols/AnyNodeProperty.swift +16 -10
  88. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/Protocols/AnyValueContainer.swift +6 -6
  89. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/Protocols/KeypathSearchable.swift +5 -5
  90. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/Protocols/NodePropertyMap.swift +10 -8
  91. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/ValueContainer.swift +25 -21
  92. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/ValueProviders/GroupInterpolator.swift +23 -17
  93. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/ValueProviders/KeyframeInterpolator.swift +125 -108
  94. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/ValueProviders/SingleValueProvider.swift +22 -17
  95. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/ModifierNodes/TrimPathNode.swift +110 -79
  96. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/OutputNodes/GroupOutputNode.swift +22 -16
  97. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/OutputNodes/PassThroughOutputNode.swift +19 -15
  98. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/OutputNodes/PathOutputNode.swift +22 -20
  99. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/OutputNodes/Renderables/FillRenderer.swift +22 -23
  100. package/Sources/Private/MainThread/NodeRenderSystem/Nodes/OutputNodes/Renderables/GradientFillRenderer.swift +242 -0
  101. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/OutputNodes/Renderables/GradientStrokeRenderer.swift +30 -24
  102. package/{lottie-swift/src/Private/NodeRenderSystem/Nodes/OutputNodes/Renderables/GradientFillRenderer.swift → Sources/Private/MainThread/NodeRenderSystem/Nodes/OutputNodes/Renderables/LegacyGradientFillRenderer.swift} +93 -66
  103. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/OutputNodes/Renderables/StrokeRenderer.swift +23 -19
  104. package/Sources/Private/MainThread/NodeRenderSystem/Nodes/PathNodes/EllipseNode.swift +139 -0
  105. package/Sources/Private/MainThread/NodeRenderSystem/Nodes/PathNodes/PolygonNode.swift +170 -0
  106. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/PathNodes/RectNode.swift +95 -58
  107. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/PathNodes/ShapeNode.swift +42 -29
  108. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/PathNodes/StarNode.swift +108 -69
  109. package/Sources/Private/MainThread/NodeRenderSystem/Nodes/RenderContainers/GroupNode.swift +155 -0
  110. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/RenderNodes/FillNode.swift +51 -37
  111. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/RenderNodes/GradientFillNode.swift +54 -42
  112. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/RenderNodes/GradientStrokeNode.swift +65 -57
  113. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/RenderNodes/StrokeNode.swift +84 -58
  114. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/Text/TextAnimatorNode.swift +138 -119
  115. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Protocols/AnimatorNode.swift +80 -79
  116. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Protocols/PathNode.swift +5 -3
  117. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Protocols/RenderNode.swift +22 -17
  118. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/RenderLayers/ShapeContainerLayer.swift +27 -24
  119. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/RenderLayers/ShapeRenderLayer.swift +34 -25
  120. package/Sources/Private/Model/Animation.swift +160 -0
  121. package/Sources/Private/Model/Assets/Asset.swift +43 -0
  122. package/{lottie-swift/src → Sources}/Private/Model/Assets/AssetLibrary.swift +40 -13
  123. package/Sources/Private/Model/Assets/ImageAsset.swift +112 -0
  124. package/{lottie-swift/src → Sources}/Private/Model/Assets/PrecompAsset.swift +20 -10
  125. package/Sources/Private/Model/DictionaryInitializable.swift +67 -0
  126. package/Sources/Private/Model/Extensions/Bundle.swift +34 -0
  127. package/{lottie-swift/src → Sources}/Private/Model/Extensions/KeyedDecodingContainerExtensions.swift +8 -4
  128. package/Sources/Private/Model/Keyframes/KeyframeData.swift +113 -0
  129. package/Sources/Private/Model/Keyframes/KeyframeGroup.swift +197 -0
  130. package/{lottie-swift/src → Sources}/Private/Model/Layers/ImageLayerModel.swift +21 -11
  131. package/Sources/Private/Model/Layers/LayerModel.swift +228 -0
  132. package/{lottie-swift/src → Sources}/Private/Model/Layers/PreCompLayerModel.swift +39 -22
  133. package/{lottie-swift/src → Sources}/Private/Model/Layers/ShapeLayerModel.swift +23 -12
  134. package/{lottie-swift/src → Sources}/Private/Model/Layers/SolidLayerModel.swift +31 -19
  135. package/{lottie-swift/src → Sources}/Private/Model/Layers/TextLayerModel.swift +33 -19
  136. package/Sources/Private/Model/Objects/DashPattern.swift +44 -0
  137. package/Sources/Private/Model/Objects/Marker.swift +33 -0
  138. package/Sources/Private/Model/Objects/Mask.swift +80 -0
  139. package/Sources/Private/Model/Objects/Transform.swift +179 -0
  140. package/Sources/Private/Model/ShapeItems/Ellipse.swift +75 -0
  141. package/Sources/Private/Model/ShapeItems/Fill.swift +74 -0
  142. package/Sources/Private/Model/ShapeItems/GradientFill.swift +124 -0
  143. package/Sources/Private/Model/ShapeItems/GradientStroke.swift +186 -0
  144. package/Sources/Private/Model/ShapeItems/Group.swift +48 -0
  145. package/{lottie-swift/src → Sources}/Private/Model/ShapeItems/Merge.swift +29 -11
  146. package/Sources/Private/Model/ShapeItems/Rectangle.swift +73 -0
  147. package/Sources/Private/Model/ShapeItems/Repeater.swift +136 -0
  148. package/Sources/Private/Model/ShapeItems/Shape.swift +56 -0
  149. package/Sources/Private/Model/ShapeItems/ShapeItem.swift +163 -0
  150. package/Sources/Private/Model/ShapeItems/ShapeTransform.swift +136 -0
  151. package/Sources/Private/Model/ShapeItems/Star.swift +132 -0
  152. package/Sources/Private/Model/ShapeItems/Stroke.swift +102 -0
  153. package/Sources/Private/Model/ShapeItems/Trim.swift +78 -0
  154. package/Sources/Private/Model/Text/Font.swift +61 -0
  155. package/{lottie-swift/src → Sources}/Private/Model/Text/Glyph.swift +63 -39
  156. package/Sources/Private/Model/Text/TextAnimator.swift +164 -0
  157. package/Sources/Private/Model/Text/TextDocument.swift +123 -0
  158. package/Sources/Private/RootAnimationLayer.swift +51 -0
  159. package/{lottie-swift/src → Sources}/Private/Utility/Debugging/AnimatorNodeDebugging.swift +7 -7
  160. package/{lottie-swift/src → Sources}/Private/Utility/Debugging/LayerDebugging.swift +72 -48
  161. package/Sources/Private/Utility/Debugging/TestHelpers.swift +10 -0
  162. package/{lottie-swift/src → Sources}/Private/Utility/Extensions/AnimationKeypathExtension.swift +69 -59
  163. package/Sources/Private/Utility/Extensions/BlendMode+Filter.swift +31 -0
  164. package/Sources/Private/Utility/Extensions/CGColor+RGB.swift +22 -0
  165. package/{lottie-swift/src → Sources}/Private/Utility/Extensions/CGFloatExtensions.swift +70 -67
  166. package/Sources/Private/Utility/Extensions/DataExtension.swift +27 -0
  167. package/Sources/Private/Utility/Extensions/MathKit.swift +450 -0
  168. package/Sources/Private/Utility/Extensions/StringExtensions.swift +38 -0
  169. package/{lottie-swift/src → Sources}/Private/Utility/Helpers/AnimationContext.swift +42 -16
  170. package/Sources/Private/Utility/Interpolatable/InterpolatableExtensions.swift +134 -0
  171. package/{lottie-swift/src → Sources}/Private/Utility/Interpolatable/KeyframeExtensions.swift +13 -10
  172. package/Sources/Private/Utility/Interpolatable/KeyframeGroup+Extensions.swift +59 -0
  173. package/{lottie-swift/src → Sources}/Private/Utility/Primitives/BezierPath.swift +229 -143
  174. package/Sources/Private/Utility/Primitives/CGPointExtension.swift +35 -0
  175. package/{lottie-swift/src → Sources}/Private/Utility/Primitives/ColorExtension.swift +46 -14
  176. package/{lottie-swift/src → Sources}/Private/Utility/Primitives/CompoundBezierPath.swift +58 -49
  177. package/Sources/Private/Utility/Primitives/CurveVertex.swift +184 -0
  178. package/Sources/Private/Utility/Primitives/PathElement.swift +75 -0
  179. package/Sources/Private/Utility/Primitives/UnitBezier.swift +115 -0
  180. package/Sources/Private/Utility/Primitives/VectorsExtensions.swift +341 -0
  181. package/Sources/Public/Animation/AnimationPublic.swift +266 -0
  182. package/Sources/Public/Animation/AnimationView.swift +1335 -0
  183. package/Sources/Public/Animation/AnimationViewInitializers.swift +109 -0
  184. package/Sources/Public/AnimationCache/AnimationCacheProvider.swift +22 -0
  185. package/{lottie-swift/src → Sources}/Public/AnimationCache/LRUAnimationCache.swift +22 -18
  186. package/Sources/Public/DynamicProperties/AnimationKeypath.swift +49 -0
  187. package/Sources/Public/DynamicProperties/AnyValueProvider.swift +132 -0
  188. package/{lottie-swift/src → Sources}/Public/DynamicProperties/ValueProviders/ColorValueProvider.swift +54 -36
  189. package/{lottie-swift/src → Sources}/Public/DynamicProperties/ValueProviders/FloatValueProvider.swift +40 -36
  190. package/Sources/Public/DynamicProperties/ValueProviders/GradientValueProvider.swift +123 -0
  191. package/{lottie-swift/src → Sources}/Public/DynamicProperties/ValueProviders/PointValueProvider.swift +40 -35
  192. package/{lottie-swift/src → Sources}/Public/DynamicProperties/ValueProviders/SizeValueProvider.swift +40 -35
  193. package/{lottie-swift/src → Sources}/Public/FontProvider/AnimationFontProvider.swift +15 -8
  194. package/Sources/Public/ImageProvider/AnimationImageProvider.swift +21 -0
  195. package/Sources/Public/Keyframes/Interpolatable.swift +253 -0
  196. package/Sources/Public/Keyframes/Keyframe.swift +92 -0
  197. package/Sources/Public/Logging/LottieLogger.swift +137 -0
  198. package/Sources/Public/LottieConfiguration.swift +143 -0
  199. package/{lottie-swift/src → Sources}/Public/Primitives/AnimationTime.swift +1 -1
  200. package/{lottie-swift/src → Sources}/Public/Primitives/Color.swift +10 -6
  201. package/{lottie-swift/src → Sources}/Public/Primitives/Vectors.swift +13 -12
  202. package/Sources/Public/TextProvider/AnimationTextProvider.swift +53 -0
  203. package/{lottie-swift/src → Sources}/Public/iOS/AnimatedButton.swift +42 -26
  204. package/{lottie-swift/src → Sources}/Public/iOS/AnimatedControl.swift +100 -91
  205. package/{lottie-swift/src → Sources}/Public/iOS/AnimatedSwitch.swift +128 -94
  206. package/{lottie-swift/src → Sources}/Public/iOS/AnimationSubview.swift +3 -3
  207. package/Sources/Public/iOS/AnimationViewBase.swift +78 -0
  208. package/{lottie-swift/src → Sources}/Public/iOS/BundleImageProvider.swift +36 -34
  209. package/{lottie-swift/src → Sources}/Public/iOS/Compatibility/CompatibleAnimationKeypath.swift +4 -0
  210. package/{lottie-swift/src → Sources}/Public/iOS/Compatibility/CompatibleAnimationView.swift +38 -29
  211. package/{lottie-swift/src → Sources}/Public/iOS/FilepathImageProvider.swift +24 -21
  212. package/{lottie-swift/src → Sources}/Public/iOS/UIColorExtension.swift +4 -4
  213. package/{lottie-swift/src/Public/MacOS/AnimationSubview.swift → Sources/Public/macOS/AnimationSubview.macOS.swift} +4 -5
  214. package/{lottie-swift/src/Public/MacOS/LottieView.swift → Sources/Public/macOS/AnimationViewBase.macOS.swift} +58 -50
  215. package/{lottie-swift/src/Public/MacOS/BundleImageProvider.swift → Sources/Public/macOS/BundleImageProvider.macOS.swift} +31 -32
  216. package/Sources/Public/macOS/FilepathImageProvider.macOS.swift +67 -0
  217. package/Tests/AnimationKeypathTests.swift +94 -0
  218. package/Tests/AutomaticEngineTests.swift +57 -0
  219. package/Tests/BundleTests.swift +25 -0
  220. package/Tests/DataURLTests.swift +64 -0
  221. package/Tests/ParsingTests.swift +43 -0
  222. package/Tests/PerformanceTests.swift +215 -0
  223. package/Tests/SnapshotConfiguration.swift +153 -0
  224. package/Tests/SnapshotTests.swift +265 -0
  225. package/Tests/Utils/Bundle+Module.swift +30 -0
  226. package/Tests/Utils/HardcodedFontProvider.swift +19 -0
  227. package/Tests/Utils/HardcodedImageProvider.swift +23 -0
  228. package/Tests/Utils/Snapshotting+presentationLayer.swift +47 -0
  229. package/Tests/ValueProvidersTests.swift +27 -0
  230. package/lottie-ios.podspec +11 -12
  231. package/package.json +1 -1
  232. package/script/test-carthage/Cartfile +1 -0
  233. package/script/test-carthage/Cartfile.resolved +1 -0
  234. package/script/test-carthage/CarthageTest/AppDelegate.swift +26 -0
  235. package/script/test-carthage/CarthageTest/Assets.xcassets/AccentColor.colorset/Contents.json +11 -0
  236. package/script/test-carthage/CarthageTest/Assets.xcassets/AppIcon.appiconset/Contents.json +98 -0
  237. package/script/test-carthage/CarthageTest/Assets.xcassets/Contents.json +6 -0
  238. package/script/test-carthage/CarthageTest/Base.lproj/LaunchScreen.storyboard +25 -0
  239. package/script/test-carthage/CarthageTest/Base.lproj/Main.storyboard +24 -0
  240. package/script/test-carthage/CarthageTest/Info.plist +66 -0
  241. package/script/test-carthage/CarthageTest/SceneDelegate.swift +10 -0
  242. package/script/test-carthage/CarthageTest/ViewController.swift +15 -0
  243. package/script/test-carthage/CarthageTest-macOS/AppDelegate.swift +7 -0
  244. package/script/test-carthage/CarthageTest-macOS/Assets.xcassets/AccentColor.colorset/Contents.json +11 -0
  245. package/script/test-carthage/CarthageTest-macOS/Assets.xcassets/AppIcon.appiconset/Contents.json +58 -0
  246. package/script/test-carthage/CarthageTest-macOS/Assets.xcassets/Contents.json +6 -0
  247. package/script/test-carthage/CarthageTest-macOS/Base.lproj/Main.storyboard +717 -0
  248. package/script/test-carthage/CarthageTest-macOS/CarthageTest_macOS.entitlements +10 -0
  249. package/script/test-carthage/CarthageTest-macOS/ViewController.swift +15 -0
  250. package/script/test-carthage/CarthageTest.xcodeproj/project.pbxproj +532 -0
  251. package/script/test-carthage/CarthageTest.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
  252. package/script/test-carthage/CarthageTest.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
  253. package/script/test-carthage/CarthageTest.xcodeproj/project.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  254. package/script/test-carthage/CarthageTest.xcodeproj/project.xcworkspace/xcuserdata/calstephens.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  255. package/script/test-carthage/CarthageTest.xcodeproj/xcuserdata/cal.xcuserdatad/xcschemes/xcschememanagement.plist +14 -0
  256. package/script/test-carthage/CarthageTest.xcodeproj/xcuserdata/calstephens.xcuserdatad/xcschemes/xcschememanagement.plist +19 -0
  257. package/script/test-carthage/Mintfile +1 -0
  258. package/script/test-spm/LottieSPM.xcworkspace/contents.xcworkspacedata +7 -0
  259. package/script/test-spm/LottieSPM.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  260. package/script/test-spm/Mintfile +1 -0
  261. package/.swiftpm/xcode/package.xcworkspace/xcuserdata/brandonwithrow.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  262. package/Lottie/Info.plist +0 -22
  263. package/Lottie.xcodeproj/project.xcworkspace/xcuserdata/brandonwithrow.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  264. package/Lottie.xcodeproj/xcuserdata/brandonwithrow.xcuserdatad/xcschemes/LottieLibraryMacOS.xcscheme +0 -80
  265. package/Lottie.xcodeproj/xcuserdata/brandonwithrow.xcuserdatad/xcschemes/xcschememanagement.plist +0 -57
  266. package/lottie-swift/Assets/.gitkeep +0 -0
  267. package/lottie-swift/src/Private/LayerContainers/Utility/LayerFontProvider.swift +0 -37
  268. package/lottie-swift/src/Private/LayerContainers/Utility/LayerTextProvider.swift +0 -36
  269. package/lottie-swift/src/Private/Model/Animation.swift +0 -107
  270. package/lottie-swift/src/Private/Model/Assets/Asset.swift +0 -27
  271. package/lottie-swift/src/Private/Model/Assets/ImageAsset.swift +0 -48
  272. package/lottie-swift/src/Private/Model/Keyframes/Keyframe.swift +0 -128
  273. package/lottie-swift/src/Private/Model/Keyframes/KeyframeGroup.swift +0 -108
  274. package/lottie-swift/src/Private/Model/Layers/LayerModel.swift +0 -150
  275. package/lottie-swift/src/Private/Model/Objects/DashPattern.swift +0 -24
  276. package/lottie-swift/src/Private/Model/Objects/Marker.swift +0 -23
  277. package/lottie-swift/src/Private/Model/Objects/Mask.swift +0 -48
  278. package/lottie-swift/src/Private/Model/Objects/Transform.swift +0 -105
  279. package/lottie-swift/src/Private/Model/ShapeItems/Ellipse.swift +0 -50
  280. package/lottie-swift/src/Private/Model/ShapeItems/FillI.swift +0 -49
  281. package/lottie-swift/src/Private/Model/ShapeItems/GradientFill.swift +0 -86
  282. package/lottie-swift/src/Private/Model/ShapeItems/GradientStroke.swift +0 -125
  283. package/lottie-swift/src/Private/Model/ShapeItems/Group.swift +0 -32
  284. package/lottie-swift/src/Private/Model/ShapeItems/Rectangle.swift +0 -50
  285. package/lottie-swift/src/Private/Model/ShapeItems/Repeater.swift +0 -80
  286. package/lottie-swift/src/Private/Model/ShapeItems/Shape.swift +0 -37
  287. package/lottie-swift/src/Private/Model/ShapeItems/ShapeItem.swift +0 -95
  288. package/lottie-swift/src/Private/Model/ShapeItems/ShapeTransform.swift +0 -68
  289. package/lottie-swift/src/Private/Model/ShapeItems/Star.swift +0 -86
  290. package/lottie-swift/src/Private/Model/ShapeItems/Stroke.swift +0 -67
  291. package/lottie-swift/src/Private/Model/ShapeItems/Trim.swift +0 -53
  292. package/lottie-swift/src/Private/Model/Text/Font.swift +0 -35
  293. package/lottie-swift/src/Private/Model/Text/TextAnimator.swift +0 -99
  294. package/lottie-swift/src/Private/Model/Text/TextDocument.swift +0 -70
  295. package/lottie-swift/src/Private/NodeRenderSystem/Nodes/PathNodes/EllipseNode.swift +0 -109
  296. package/lottie-swift/src/Private/NodeRenderSystem/Nodes/PathNodes/PolygonNode.swift +0 -132
  297. package/lottie-swift/src/Private/NodeRenderSystem/Nodes/RenderContainers/GroupNode.swift +0 -141
  298. package/lottie-swift/src/Private/Utility/Extensions/MathKit.swift +0 -539
  299. package/lottie-swift/src/Private/Utility/Extensions/StringExtensions.swift +0 -32
  300. package/lottie-swift/src/Private/Utility/Interpolatable/Interpolatable.swift +0 -18
  301. package/lottie-swift/src/Private/Utility/Interpolatable/InterpolatableExtensions.swift +0 -170
  302. package/lottie-swift/src/Private/Utility/Primitives/CurveVertex.swift +0 -177
  303. package/lottie-swift/src/Private/Utility/Primitives/PathElement.swift +0 -68
  304. package/lottie-swift/src/Private/Utility/Primitives/VectorsExtensions.swift +0 -218
  305. package/lottie-swift/src/Public/Animation/AnimationPublic.swift +0 -196
  306. package/lottie-swift/src/Public/Animation/AnimationView.swift +0 -1006
  307. package/lottie-swift/src/Public/Animation/AnimationViewInitializers.swift +0 -83
  308. package/lottie-swift/src/Public/AnimationCache/AnimationCacheProvider.swift +0 -24
  309. package/lottie-swift/src/Public/DynamicProperties/AnimationKeypath.swift +0 -46
  310. package/lottie-swift/src/Public/DynamicProperties/AnyValueProvider.swift +0 -29
  311. package/lottie-swift/src/Public/DynamicProperties/ValueProviders/GradientValueProvider.swift +0 -114
  312. package/lottie-swift/src/Public/ImageProvider/AnimationImageProvider.swift +0 -23
  313. package/lottie-swift/src/Public/MacOS/FilepathImageProvider.swift +0 -67
  314. package/lottie-swift/src/Public/TextProvider/AnimationTextProvider.swift +0 -39
  315. package/lottie-swift/src/Public/iOS/LottieView.swift +0 -62
  316. package/lottie-swift-testing.podspec +0 -32
@@ -1,539 +0,0 @@
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 Foundation
10
- import CoreGraphics
11
-
12
- extension Int {
13
- var cgFloat: CGFloat {
14
- return CGFloat(self)
15
- }
16
- }
17
-
18
- extension Double {
19
- var cgFloat: CGFloat {
20
- return CGFloat(self)
21
- }
22
- }
23
-
24
- extension CGFloat: Interpolatable {
25
-
26
-
27
- /**
28
- Interpolates the receiver to the given number by Amount.
29
- - Parameter toNumber: The number to interpolate to.
30
- - Parameter amount: The amount to interpolate from 0-1
31
-
32
- ```
33
- let number = 5
34
- let interpolated = number.interpolateTo(10, amount: 0.5)
35
- print(interpolated)
36
- // Result: 7.5
37
- ```
38
-
39
- 1. The amount can be greater than one and less than zero. The interpolation will not be clipped.
40
- */
41
- func interpolateTo(_ to: CGFloat, amount: CGFloat) -> CGFloat {
42
- return self + ((to - self) * CGFloat(amount))
43
- }
44
-
45
- func interpolateTo(_ to: CGFloat, amount: CGFloat, spatialOutTangent: CGPoint?, spatialInTangent: CGPoint?) -> CGFloat {
46
- return interpolateTo(to, amount: amount)
47
- }
48
-
49
- func remap(fromLow: CGFloat, fromHigh: CGFloat, toLow: CGFloat, toHigh: CGFloat) -> CGFloat {
50
- guard (fromHigh - fromLow) != 0 else {
51
- // Would produce NAN
52
- return 0
53
- }
54
- return toLow + (self - fromLow) * (toHigh - toLow) / (fromHigh - fromLow)
55
- }
56
-
57
- /**
58
- Returns a value that is clamped between the two numbers
59
-
60
- 1. The order of arguments does not matter.
61
- */
62
- func clamp(_ a: CGFloat, _ b: CGFloat) -> CGFloat {
63
- return CGFloat(Double(self).clamp(Double(a), Double(b)))
64
- }
65
-
66
- /**
67
- Returns the difference between the receiver and the given number.
68
- - Parameter absolute: If *true* (Default) the returned value will always be positive.
69
- */
70
- func diff(_ a: CGFloat, absolute: Bool = true) -> CGFloat {
71
- return absolute ? abs(a - self) : a - self
72
- }
73
-
74
- func toRadians() -> CGFloat { return self * .pi / 180 }
75
- func toDegrees() -> CGFloat { return self * 180 / .pi }
76
-
77
- }
78
-
79
- extension Double: Interpolatable {
80
-
81
- /**
82
- Interpolates the receiver to the given number by Amount.
83
- - Parameter toNumber: The number to interpolate to.
84
- - Parameter amount: The amount to interpolate from 0-1
85
-
86
- ```
87
- let number = 5
88
- let interpolated = number.interpolateTo(10, amount: 0.5)
89
- print(interpolated)
90
- // Result: 7.5
91
- ```
92
-
93
- 1. The amount can be greater than one and less than zero. The interpolation will not be clipped.
94
- */
95
- func interpolateTo(_ to: Double, amount: CGFloat) -> Double {
96
- return self + ((to - self) * Double(amount))
97
- }
98
-
99
- func interpolateTo(_ to: Double, amount: CGFloat, spatialOutTangent: CGPoint?, spatialInTangent: CGPoint?) -> Double {
100
- return interpolateTo(to, amount: amount)
101
- }
102
-
103
- func remap(fromLow: Double, fromHigh: Double, toLow: Double, toHigh: Double) -> Double {
104
- return toLow + (self - fromLow) * (toHigh - toLow) / (fromHigh - fromLow)
105
- }
106
-
107
- /**
108
- Returns a value that is clamped between the two numbers
109
-
110
- 1. The order of arguments does not matter.
111
- */
112
- func clamp(_ a: Double, _ b: Double) -> Double {
113
- let minValue = a <= b ? a : b
114
- let maxValue = a <= b ? b : a
115
- return max(min(self, maxValue), minValue)
116
- }
117
-
118
- }
119
-
120
- extension CGRect {
121
-
122
- /// Initializes a new CGRect with a center point and size.
123
- init(center: CGPoint, size: CGSize) {
124
- self.init(x: center.x - (size.width * 0.5),
125
- y: center.y - (size.height * 0.5),
126
- width: size.width,
127
- height: size.height)
128
- }
129
-
130
- /// Returns the total area of the rect.
131
- var area: CGFloat {
132
- return width * height
133
- }
134
-
135
-
136
- /// The center point of the rect. Settable.
137
- var center: CGPoint {
138
- get {
139
- return CGPoint(x: midX, y: midY)
140
- }
141
- set {
142
- origin = CGPoint(x: newValue.x - (size.width * 0.5),
143
- y: newValue.y - (size.height * 0.5))
144
- }
145
- }
146
-
147
- /// The top left point of the rect. Settable.
148
- var topLeft: CGPoint {
149
- get {
150
- return CGPoint(x: minX, y: minY)
151
- }
152
- set {
153
- origin = CGPoint(x: newValue.x,
154
- y: newValue.y)
155
- }
156
- }
157
-
158
- /// The bottom left point of the rect. Settable.
159
- var bottomLeft: CGPoint {
160
- get {
161
- return CGPoint(x: minX, y: maxY)
162
- }
163
- set {
164
- origin = CGPoint(x: newValue.x,
165
- y: newValue.y - size.height)
166
- }
167
- }
168
-
169
- /// The top right point of the rect. Settable.
170
- var topRight: CGPoint {
171
- get {
172
- return CGPoint(x: maxX, y: minY)
173
- }
174
- set {
175
- origin = CGPoint(x: newValue.x - size.width,
176
- y: newValue.y)
177
- }
178
- }
179
-
180
- /// The bottom right point of the rect. Settable.
181
- var bottomRight: CGPoint {
182
- get {
183
- return CGPoint(x: maxX, y: maxY)
184
- }
185
- set {
186
- origin = CGPoint(x: newValue.x - size.width,
187
- y: newValue.y - size.height)
188
- }
189
- }
190
-
191
- /**
192
- Interpolates the receiver to the given rect by Amount.
193
- - Parameter to: The rect to interpolate to.
194
- - Parameter amount: The amount to interpolate from 0-1
195
-
196
- ```
197
- let rect = CGRect(x:0, y:0, width: 50, height: 50)
198
- let interpolated = rect.interpolateTo(CGRect(x:100, y:100, width: 100, height: 100), amount: 0.5)
199
- print(interpolated)
200
- // Result: (x: 50, y: 50, width: 75, height: 75)
201
- ```
202
-
203
- 1. The amount can be greater than one and less than zero. The interpolation will not be clipped.
204
- */
205
- func interpolateTo(_ to: CGRect, amount: CGFloat) -> CGRect {
206
- return CGRect(x: origin.x.interpolateTo(to.origin.x, amount: amount),
207
- y: origin.y.interpolateTo(to.origin.y, amount: amount),
208
- width: width.interpolateTo(to.width, amount: amount),
209
- height: height.interpolateTo(to.height, amount: amount))
210
- }
211
-
212
- }
213
-
214
- extension CGSize {
215
-
216
- /**
217
- Interpolates the receiver to the given size by Amount.
218
- - Parameter to: The size to interpolate to.
219
- - Parameter amount: The amount to interpolate from 0-1
220
-
221
- ```
222
- let size = CGSize(width: 50, height: 50)
223
- let interpolated = rect.interpolateTo(CGSize(width: 100, height: 100), amount: 0.5)
224
- print(interpolated)
225
- // Result: (width: 75, height: 75)
226
- ```
227
-
228
- 1. The amount can be greater than one and less than zero. The interpolation will not be clipped.
229
- */
230
- func interpolateTo(_ to: CGSize, amount: CGFloat) -> CGSize {
231
- return CGSize(width: width.interpolateTo(to.width, amount: amount),
232
- height: height.interpolateTo(to.height, amount: amount))
233
- }
234
-
235
- /// Returns the scale float that will fit the receive inside of the given size.
236
- func scaleThatFits(_ size: CGSize) -> CGFloat {
237
- return CGFloat.minimum(width / size.width, height / size.height)
238
- }
239
-
240
- /// Adds receiver size to give size.
241
- func add(_ size: CGSize) -> CGSize {
242
- return CGSize(width: width + size.width, height: height + size.height)
243
- }
244
-
245
- /// Subtracts given size from receiver size.
246
- func subtract(_ size: CGSize) -> CGSize {
247
- return CGSize(width: width - size.width, height: height - size.height)
248
- }
249
-
250
- /// Multiplies receiver size by the given size.
251
- func multiply(_ size: CGSize) -> CGSize {
252
- return CGSize(width: width * size.width, height: height * size.height)
253
- }
254
-
255
- /// Operator convenience to add sizes with +
256
- static func +(left: CGSize, right: CGSize) -> CGSize {
257
- return left.add(right)
258
- }
259
-
260
- /// Operator convenience to subtract sizes with -
261
- static func -(left: CGSize, right: CGSize) -> CGSize {
262
- return left.subtract(right)
263
- }
264
-
265
- /// Operator convenience to multiply sizes with *
266
- static func *(left: CGSize, right: CGFloat) -> CGSize {
267
- return CGSize(width: left.width * right, height: left.height * right)
268
- }
269
-
270
- }
271
-
272
- /// A struct that defines a line segment with two CGPoints
273
- struct CGLine {
274
-
275
- /// The Start of the line segment.
276
- var start: CGPoint
277
- /// The End of the line segment.
278
- var end: CGPoint
279
-
280
- /// Initializes a line segment with start and end points
281
- init(start: CGPoint, end: CGPoint) {
282
- self.start = start
283
- self.end = end
284
- }
285
-
286
- /// The length of the line segment.
287
- var length: CGFloat {
288
- return end.distanceTo(start)
289
- }
290
-
291
- /// Returns a line segment that is normalized to a length of 1
292
- func normalize() -> CGLine {
293
- let len = length
294
- guard len > 0 else {
295
- return self
296
- }
297
- let relativeEnd = end - start
298
- let relativeVector = CGPoint(x: relativeEnd.x / len, y: relativeEnd.y / len)
299
- let absoluteVector = relativeVector + start
300
- return CGLine(start: start, end: absoluteVector)
301
- }
302
-
303
- /// Trims a line segment to the given length
304
- func trimmedToLength(_ toLength: CGFloat) -> CGLine {
305
- let len = length
306
- guard len > 0 else {
307
- return self
308
- }
309
- let relativeEnd = end - start
310
- let relativeVector = CGPoint(x: relativeEnd.x / len, y: relativeEnd.y / len)
311
- let sizedVector = CGPoint(x: relativeVector.x * toLength, y: relativeVector.y * toLength)
312
- let absoluteVector = sizedVector + start
313
- return CGLine(start: start, end: absoluteVector)
314
- }
315
-
316
- /// Flips a line vertically and horizontally from the start point.
317
- func flipped() -> CGLine {
318
- let relativeEnd = end - start
319
- let flippedEnd = CGPoint(x: relativeEnd.x * -1, y: relativeEnd.y * -1)
320
- return CGLine(start: start, end: flippedEnd + start)
321
- }
322
-
323
- /// Move the line to the new start point.
324
- func transpose(_ toPoint: CGPoint) -> CGLine {
325
- let diff = toPoint - start
326
- let newEnd = end + diff
327
- return CGLine(start: toPoint, end: newEnd)
328
- }
329
-
330
- }
331
-
332
- infix operator +|
333
- infix operator +-
334
-
335
- extension CGPoint: Interpolatable {
336
-
337
- /// Returns the distance between the receiver and the given point.
338
- func distanceTo(_ a: CGPoint) -> CGFloat {
339
- let xDist = a.x - x
340
- let yDist = a.y - y
341
- return CGFloat(sqrt((xDist * xDist) + (yDist * yDist)))
342
- }
343
-
344
- /// Returns the length between the receiver and *CGPoint.zero*
345
- var vectorLength: CGFloat {
346
- return distanceTo(.zero)
347
- }
348
-
349
- func rounded(decimal: CGFloat) -> CGPoint {
350
- return CGPoint(x: (round(decimal * x) / decimal), y: (round(decimal * y) / decimal))
351
- }
352
-
353
- /**
354
- Interpolates the receiver to the given Point by Amount.
355
- - Parameter to: The Point to interpolate to.
356
- - Parameter amount: The amount to interpolate from 0-1
357
-
358
- ```
359
- let point = CGPoint(width: 50, height: 50)
360
- let interpolated = rect.interpolateTo(CGPoint(width: 100, height: 100), amount: 0.5)
361
- print(interpolated)
362
- // Result: (x: 75, y: 75)
363
- ```
364
-
365
- 1. The amount can be greater than one and less than zero. The interpolation will not be clipped.
366
- */
367
-
368
- func interpolate(_ to: CGPoint, amount: CGFloat) -> CGPoint {
369
- return CGPoint(x: x.interpolateTo(to.x, amount: amount),
370
- y: y.interpolateTo(to.y, amount: amount))
371
- }
372
-
373
- func interpolate(_ to: CGPoint, outTangent: CGPoint, inTangent: CGPoint, amount: CGFloat, maxIterations: Int = 3, samples: Int = 20, accuracy: CGFloat = 1) -> CGPoint {
374
- if amount == 0 {
375
- return self
376
- }
377
- if amount == 1 {
378
- return to
379
- }
380
-
381
- if self.colinear(outTangent, inTangent) == true,
382
- outTangent.colinear(inTangent, to) == true {
383
- return interpolate(to, amount: amount)
384
- }
385
-
386
- let step = 1 / CGFloat(samples)
387
-
388
- var points: [(point: CGPoint, distance: CGFloat)] = [(point: self, distance: 0)]
389
- var totalLength: CGFloat = 0
390
-
391
- var previousPoint = self
392
- var previousAmount = CGFloat(0)
393
-
394
- var closestPoint: Int = 0
395
-
396
- while previousAmount < 1 {
397
-
398
- previousAmount = previousAmount + step
399
-
400
- if previousAmount < amount {
401
- closestPoint = closestPoint + 1
402
- }
403
-
404
- let newPoint = self.pointOnPath(to, outTangent: outTangent, inTangent: inTangent, amount: previousAmount)
405
- let distance = previousPoint.distanceTo(newPoint)
406
- totalLength = totalLength + distance
407
- points.append((point: newPoint, distance: totalLength))
408
- previousPoint = newPoint
409
- }
410
-
411
- let accurateDistance = amount * totalLength
412
- var point = points[closestPoint]
413
-
414
- var foundPoint: Bool = false
415
-
416
- var pointAmount: CGFloat = CGFloat(closestPoint) * step
417
- var nextPointAmount: CGFloat = pointAmount + step
418
-
419
- var refineIterations = 0
420
- while foundPoint == false {
421
- refineIterations = refineIterations + 1
422
- /// First see if the next point is still less than the projected length.
423
- let nextPoint = points[closestPoint + 1]
424
- if nextPoint.distance < accurateDistance {
425
- point = nextPoint
426
- closestPoint = closestPoint + 1
427
- pointAmount = CGFloat(closestPoint) * step
428
- nextPointAmount = pointAmount + step
429
- if closestPoint == points.count {
430
- foundPoint = true
431
- }
432
- continue
433
- }
434
- if accurateDistance < point.distance {
435
- closestPoint = closestPoint - 1
436
- if closestPoint < 0 {
437
- foundPoint = true
438
- continue
439
- }
440
- point = points[closestPoint]
441
- pointAmount = CGFloat(closestPoint) * step
442
- nextPointAmount = pointAmount + step
443
- continue
444
- }
445
-
446
- /// Now we are certain the point is the closest point under the distance
447
- let pointDiff = nextPoint.distance - point.distance
448
- let proposedPointAmount = ((accurateDistance - point.distance) / pointDiff).remap(fromLow: 0, fromHigh: 1, toLow: pointAmount, toHigh: nextPointAmount)
449
-
450
- let newPoint = self.pointOnPath(to, outTangent: outTangent, inTangent: inTangent, amount: proposedPointAmount)
451
- let newDistance = point.distance + point.point.distanceTo(newPoint)
452
- pointAmount = proposedPointAmount
453
- point = (point: newPoint, distance: newDistance)
454
- if accurateDistance - newDistance <= accuracy ||
455
- newDistance - accurateDistance <= accuracy {
456
- foundPoint = true
457
- }
458
-
459
- if refineIterations == maxIterations {
460
- foundPoint = true
461
- }
462
- }
463
- return point.point
464
- }
465
-
466
- func pointOnPath(_ to: CGPoint, outTangent: CGPoint, inTangent: CGPoint, amount: CGFloat) -> CGPoint {
467
- let a = self.interpolate(outTangent, amount: amount)
468
- let b = outTangent.interpolate(inTangent, amount: amount)
469
- let c = inTangent.interpolate(to, amount: amount)
470
- let d = a.interpolate(b, amount: amount)
471
- let e = b.interpolate(c, amount: amount)
472
- let f = d.interpolate(e, amount: amount)
473
- return f
474
- }
475
-
476
- func colinear(_ a: CGPoint, _ b: CGPoint) -> Bool {
477
- let area = x * (a.y - b.y) + a.x * (b.y - y) + b.x * (y - a.y);
478
- let accuracy: CGFloat = 0.05
479
- if area < accuracy && area > -accuracy {
480
- return true
481
- }
482
- return false
483
- }
484
-
485
- func interpolateTo(_ to: CGPoint, amount: CGFloat, spatialOutTangent: CGPoint?, spatialInTangent: CGPoint?) -> CGPoint {
486
- guard let outTan = spatialOutTangent,
487
- let inTan = spatialInTangent else {
488
- return interpolate(to, amount: amount)
489
- }
490
- let cp1 = self + outTan
491
- let cp2 = to + inTan
492
-
493
- return interpolate(to, outTangent: cp1, inTangent: cp2, amount: amount)
494
- }
495
-
496
- /// Subtracts the given point from the receiving point.
497
- func subtract(_ point: CGPoint) -> CGPoint {
498
- return CGPoint(x: x - point.x,
499
- y: y - point.y)
500
- }
501
-
502
- /// Adds the given point from the receiving point.
503
- func add(_ point: CGPoint) -> CGPoint {
504
- return CGPoint(x: x + point.x,
505
- y: y + point.y)
506
- }
507
-
508
- var isZero: Bool {
509
- return (x == 0 && y == 0)
510
- }
511
-
512
- /// Operator convenience to divide points with /
513
- static func / (lhs: CGPoint, rhs: CGFloat) -> CGPoint {
514
- return CGPoint(x: lhs.x / CGFloat(rhs), y: lhs.y / CGFloat(rhs))
515
- }
516
-
517
- /// Operator convenience to multiply points with *
518
- static func * (lhs: CGPoint, rhs: CGFloat) -> CGPoint {
519
- return CGPoint(x: lhs.x * CGFloat(rhs), y: lhs.y * CGFloat(rhs))
520
- }
521
-
522
- /// Operator convenience to add points with +
523
- static func +(left: CGPoint, right: CGPoint) -> CGPoint {
524
- return left.add(right)
525
- }
526
-
527
- /// Operator convenience to subtract points with -
528
- static func -(left: CGPoint, right: CGPoint) -> CGPoint {
529
- return left.subtract(right)
530
- }
531
-
532
- static func +|(left: CGPoint, right: CGFloat) -> CGPoint {
533
- return CGPoint(x: left.x, y: left.y + right)
534
- }
535
-
536
- static func +-(left: CGPoint, right: CGFloat) -> CGPoint {
537
- return CGPoint(x: left.x + right, y: left.y)
538
- }
539
- }
@@ -1,32 +0,0 @@
1
- //
2
- // StringExtensions.swift
3
- // lottie-swift
4
- //
5
- // Created by Brandon Withrow on 1/25/19.
6
- //
7
-
8
- import Foundation
9
- import CoreGraphics
10
-
11
- extension String {
12
-
13
- func hexColorComponents() -> (red: CGFloat, green: CGFloat, blue: CGFloat) {
14
-
15
- var cString:String = trimmingCharacters(in: .whitespacesAndNewlines).uppercased()
16
-
17
- if (cString.hasPrefix("#")) {
18
- cString.remove(at: cString.startIndex)
19
- }
20
-
21
- if ((cString.count) != 6) {
22
- return (red: 0, green: 0, blue: 0)
23
- }
24
-
25
- var rgbValue:UInt32 = 0
26
- Scanner(string: cString).scanHexInt32(&rgbValue)
27
-
28
- return (red: CGFloat((rgbValue & 0xFF0000) >> 16) / 255.0,
29
- green: CGFloat((rgbValue & 0x00FF00) >> 8) / 255.0,
30
- blue: CGFloat(rgbValue & 0x0000FF) / 255.0)
31
- }
32
- }
@@ -1,18 +0,0 @@
1
- //
2
- // Interpolatable.swift
3
- // lottie-swift
4
- //
5
- // Created by Brandon Withrow on 1/14/19.
6
- //
7
-
8
- import Foundation
9
- import CoreGraphics
10
-
11
- protocol Interpolatable {
12
-
13
- func interpolateTo(_ to: Self,
14
- amount: CGFloat,
15
- spatialOutTangent: CGPoint?,
16
- spatialInTangent: CGPoint?) -> Self
17
-
18
- }