lottie-ios 3.2.2 → 3.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (316) hide show
  1. package/.github/actions/setup/action.yml +32 -0
  2. package/.github/issue_template.md +6 -23
  3. package/.github/workflows/main.yml +98 -0
  4. package/.spi.yml +6 -0
  5. package/.swift-version +1 -0
  6. package/.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata +7 -0
  7. package/.swiftpm/xcode/package.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  8. package/.swiftpm/xcode/xcuserdata/{brandonwithrow.xcuserdatad → cal.xcuserdatad}/xcschemes/xcschememanagement.plist +25 -15
  9. package/.swiftpm/xcode/xcuserdata/calstephens.xcuserdatad/xcschemes/xcschememanagement.plist +14 -0
  10. package/Gemfile +4 -0
  11. package/Gemfile.lock +102 -0
  12. package/Lottie.xcodeproj/project.pbxproj +2003 -1972
  13. package/Lottie.xcodeproj/project.xcworkspace/contents.xcworkspacedata +1 -1
  14. package/Lottie.xcodeproj/project.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  15. package/Lottie.xcodeproj/xcshareddata/xcschemes/{Lottie_iOS.xcscheme → Lottie (iOS).xcscheme } +15 -18
  16. package/Lottie.xcodeproj/xcshareddata/xcschemes/{Lottie_macOS.xcscheme → Lottie (macOS).xcscheme } +7 -20
  17. package/Lottie.xcodeproj/xcshareddata/xcschemes/{Lottie_tvOS.xcscheme → Lottie (tvOS).xcscheme } +5 -18
  18. package/Lottie.xcodeproj/xcuserdata/cal.xcuserdatad/xcschemes/xcschememanagement.plist +37 -0
  19. package/Lottie.xcodeproj/xcuserdata/calstephens.xcuserdatad/xcschemes/xcschememanagement.plist +24 -0
  20. package/Lottie.xcworkspace/contents.xcworkspacedata +10 -0
  21. package/Lottie.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
  22. package/Lottie.xcworkspace/xcshareddata/swiftpm/Package.resolved +115 -0
  23. package/Lottie.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  24. package/{Lottie.xcodeproj/xcuserdata/brandonwithrow.xcuserdatad → Lottie.xcworkspace/xcuserdata/cal.xcuserdatad}/xcdebugger/Breakpoints_v2.xcbkptlist +2 -2
  25. package/Lottie.xcworkspace/xcuserdata/cal.xcuserdatad/xcdebugger/Expressions.xcexplist +153 -0
  26. package/Lottie.xcworkspace/xcuserdata/calstephens.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  27. package/Lottie.xcworkspace/xcuserdata/calstephens.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +39 -0
  28. package/Lottie.xcworkspace/xcuserdata/calstephens.xcuserdatad/xcdebugger/Expressions.xcexplist +25 -0
  29. package/Lottie.xcworkspace/xcuserdata/calstephens.xcuserdatad/xcschemes/xcschememanagement.plist +30 -0
  30. package/Package.resolved +88 -0
  31. package/Package.swift +10 -15
  32. package/README.md +40 -60
  33. package/Rakefile +121 -0
  34. package/Sources/Private/CoreAnimation/Animations/CAAnimation+TimingConfiguration.swift +81 -0
  35. package/Sources/Private/CoreAnimation/Animations/CALayer+addAnimation.swift +448 -0
  36. package/Sources/Private/CoreAnimation/Animations/CombinedShapeAnimation.swift +53 -0
  37. package/Sources/Private/CoreAnimation/Animations/CustomPathAnimation.swift +41 -0
  38. package/Sources/Private/CoreAnimation/Animations/EllipseAnimation.swift +28 -0
  39. package/Sources/Private/CoreAnimation/Animations/GradientAnimations.swift +210 -0
  40. package/Sources/Private/CoreAnimation/Animations/LayerProperty.swift +229 -0
  41. package/Sources/Private/CoreAnimation/Animations/OpacityAnimation.swift +52 -0
  42. package/Sources/Private/CoreAnimation/Animations/RectangleAnimation.swift +31 -0
  43. package/Sources/Private/CoreAnimation/Animations/ShapeAnimation.swift +246 -0
  44. package/Sources/Private/CoreAnimation/Animations/StarAnimation.swift +95 -0
  45. package/Sources/Private/CoreAnimation/Animations/StrokeAnimation.swift +70 -0
  46. package/Sources/Private/CoreAnimation/Animations/TransformAnimations.swift +205 -0
  47. package/Sources/Private/CoreAnimation/Animations/VisibilityAnimation.swift +37 -0
  48. package/Sources/Private/CoreAnimation/CompatibilityTracker.swift +130 -0
  49. package/Sources/Private/CoreAnimation/CoreAnimationLayer.swift +492 -0
  50. package/Sources/Private/CoreAnimation/Extensions/CALayer+fillBounds.swift +35 -0
  51. package/Sources/Private/CoreAnimation/Extensions/KeyframeGroup+exactlyOneKeyframe.swift +37 -0
  52. package/Sources/Private/CoreAnimation/Extensions/Keyframes+combinedIfPossible.swift +73 -0
  53. package/Sources/Private/CoreAnimation/Layers/AnimationLayer.swift +83 -0
  54. package/Sources/Private/CoreAnimation/Layers/BaseAnimationLayer.swift +33 -0
  55. package/Sources/Private/CoreAnimation/Layers/BaseCompositionLayer.swift +87 -0
  56. package/Sources/Private/CoreAnimation/Layers/CALayer+setupLayerHierarchy.swift +131 -0
  57. package/Sources/Private/CoreAnimation/Layers/GradientRenderLayer.swift +94 -0
  58. package/Sources/Private/CoreAnimation/Layers/ImageLayer.swift +79 -0
  59. package/Sources/Private/CoreAnimation/Layers/LayerModel+makeAnimationLayer.swift +60 -0
  60. package/Sources/Private/CoreAnimation/Layers/MaskCompositionLayer.swift +138 -0
  61. package/Sources/Private/CoreAnimation/Layers/PreCompLayer.swift +140 -0
  62. package/Sources/Private/CoreAnimation/Layers/ShapeItemLayer.swift +302 -0
  63. package/Sources/Private/CoreAnimation/Layers/ShapeLayer.swift +319 -0
  64. package/Sources/Private/CoreAnimation/Layers/SolidLayer.swift +47 -0
  65. package/Sources/Private/CoreAnimation/Layers/TextLayer.swift +91 -0
  66. package/Sources/Private/CoreAnimation/Layers/TransformLayer.swift +11 -0
  67. package/Sources/Private/CoreAnimation/ValueProviderStore.swift +139 -0
  68. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/CompositionLayer.swift +93 -85
  69. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/ImageCompositionLayer.swift +24 -21
  70. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/MaskContainerLayer.swift +75 -54
  71. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/NullCompositionLayer.swift +5 -5
  72. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/PreCompositionLayer.swift +61 -44
  73. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/ShapeCompositionLayer.swift +22 -20
  74. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/SolidCompositionLayer.swift +26 -17
  75. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/TextCompositionLayer.swift +42 -36
  76. package/{lottie-swift/src/Private/LayerContainers/AnimationContainer.swift → Sources/Private/MainThread/LayerContainers/MainThreadAnimationLayer.swift} +200 -140
  77. package/Sources/Private/MainThread/LayerContainers/Utility/CachedImageProvider.swift +47 -0
  78. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/Utility/CompositionLayersInitializer.swift +33 -24
  79. package/{lottie-swift/src/Private/LayerContainers/Utility/TextLayer.swift → Sources/Private/MainThread/LayerContainers/Utility/CoreTextRenderLayer.swift} +120 -106
  80. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/Utility/InvertedMatteLayer.swift +25 -24
  81. package/Sources/Private/MainThread/LayerContainers/Utility/LayerFontProvider.swift +41 -0
  82. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/Utility/LayerImageProvider.swift +20 -16
  83. package/Sources/Private/MainThread/LayerContainers/Utility/LayerTextProvider.swift +40 -0
  84. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/Utility/LayerTransformNode.swift +82 -67
  85. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Extensions/ItemsExtension.swift +4 -4
  86. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/NodeProperty.swift +29 -21
  87. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/Protocols/AnyNodeProperty.swift +16 -10
  88. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/Protocols/AnyValueContainer.swift +6 -6
  89. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/Protocols/KeypathSearchable.swift +5 -5
  90. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/Protocols/NodePropertyMap.swift +10 -8
  91. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/ValueContainer.swift +25 -21
  92. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/ValueProviders/GroupInterpolator.swift +23 -17
  93. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/ValueProviders/KeyframeInterpolator.swift +125 -108
  94. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/ValueProviders/SingleValueProvider.swift +22 -17
  95. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/ModifierNodes/TrimPathNode.swift +110 -79
  96. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/OutputNodes/GroupOutputNode.swift +22 -16
  97. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/OutputNodes/PassThroughOutputNode.swift +19 -15
  98. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/OutputNodes/PathOutputNode.swift +22 -20
  99. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/OutputNodes/Renderables/FillRenderer.swift +22 -23
  100. package/Sources/Private/MainThread/NodeRenderSystem/Nodes/OutputNodes/Renderables/GradientFillRenderer.swift +242 -0
  101. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/OutputNodes/Renderables/GradientStrokeRenderer.swift +30 -24
  102. package/{lottie-swift/src/Private/NodeRenderSystem/Nodes/OutputNodes/Renderables/GradientFillRenderer.swift → Sources/Private/MainThread/NodeRenderSystem/Nodes/OutputNodes/Renderables/LegacyGradientFillRenderer.swift} +93 -66
  103. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/OutputNodes/Renderables/StrokeRenderer.swift +23 -19
  104. package/Sources/Private/MainThread/NodeRenderSystem/Nodes/PathNodes/EllipseNode.swift +139 -0
  105. package/Sources/Private/MainThread/NodeRenderSystem/Nodes/PathNodes/PolygonNode.swift +170 -0
  106. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/PathNodes/RectNode.swift +95 -58
  107. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/PathNodes/ShapeNode.swift +42 -29
  108. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/PathNodes/StarNode.swift +108 -69
  109. package/Sources/Private/MainThread/NodeRenderSystem/Nodes/RenderContainers/GroupNode.swift +155 -0
  110. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/RenderNodes/FillNode.swift +51 -37
  111. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/RenderNodes/GradientFillNode.swift +54 -42
  112. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/RenderNodes/GradientStrokeNode.swift +65 -57
  113. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/RenderNodes/StrokeNode.swift +84 -58
  114. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/Text/TextAnimatorNode.swift +138 -119
  115. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Protocols/AnimatorNode.swift +80 -79
  116. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Protocols/PathNode.swift +5 -3
  117. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Protocols/RenderNode.swift +22 -17
  118. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/RenderLayers/ShapeContainerLayer.swift +27 -24
  119. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/RenderLayers/ShapeRenderLayer.swift +34 -25
  120. package/Sources/Private/Model/Animation.swift +160 -0
  121. package/Sources/Private/Model/Assets/Asset.swift +43 -0
  122. package/{lottie-swift/src → Sources}/Private/Model/Assets/AssetLibrary.swift +40 -13
  123. package/Sources/Private/Model/Assets/ImageAsset.swift +112 -0
  124. package/{lottie-swift/src → Sources}/Private/Model/Assets/PrecompAsset.swift +20 -10
  125. package/Sources/Private/Model/DictionaryInitializable.swift +67 -0
  126. package/Sources/Private/Model/Extensions/Bundle.swift +34 -0
  127. package/{lottie-swift/src → Sources}/Private/Model/Extensions/KeyedDecodingContainerExtensions.swift +8 -4
  128. package/Sources/Private/Model/Keyframes/KeyframeData.swift +113 -0
  129. package/Sources/Private/Model/Keyframes/KeyframeGroup.swift +197 -0
  130. package/{lottie-swift/src → Sources}/Private/Model/Layers/ImageLayerModel.swift +21 -11
  131. package/Sources/Private/Model/Layers/LayerModel.swift +228 -0
  132. package/{lottie-swift/src → Sources}/Private/Model/Layers/PreCompLayerModel.swift +39 -22
  133. package/{lottie-swift/src → Sources}/Private/Model/Layers/ShapeLayerModel.swift +23 -12
  134. package/{lottie-swift/src → Sources}/Private/Model/Layers/SolidLayerModel.swift +31 -19
  135. package/{lottie-swift/src → Sources}/Private/Model/Layers/TextLayerModel.swift +33 -19
  136. package/Sources/Private/Model/Objects/DashPattern.swift +44 -0
  137. package/Sources/Private/Model/Objects/Marker.swift +33 -0
  138. package/Sources/Private/Model/Objects/Mask.swift +80 -0
  139. package/Sources/Private/Model/Objects/Transform.swift +179 -0
  140. package/Sources/Private/Model/ShapeItems/Ellipse.swift +75 -0
  141. package/Sources/Private/Model/ShapeItems/Fill.swift +74 -0
  142. package/Sources/Private/Model/ShapeItems/GradientFill.swift +124 -0
  143. package/Sources/Private/Model/ShapeItems/GradientStroke.swift +186 -0
  144. package/Sources/Private/Model/ShapeItems/Group.swift +48 -0
  145. package/{lottie-swift/src → Sources}/Private/Model/ShapeItems/Merge.swift +29 -11
  146. package/Sources/Private/Model/ShapeItems/Rectangle.swift +73 -0
  147. package/Sources/Private/Model/ShapeItems/Repeater.swift +136 -0
  148. package/Sources/Private/Model/ShapeItems/Shape.swift +56 -0
  149. package/Sources/Private/Model/ShapeItems/ShapeItem.swift +163 -0
  150. package/Sources/Private/Model/ShapeItems/ShapeTransform.swift +136 -0
  151. package/Sources/Private/Model/ShapeItems/Star.swift +132 -0
  152. package/Sources/Private/Model/ShapeItems/Stroke.swift +102 -0
  153. package/Sources/Private/Model/ShapeItems/Trim.swift +78 -0
  154. package/Sources/Private/Model/Text/Font.swift +61 -0
  155. package/{lottie-swift/src → Sources}/Private/Model/Text/Glyph.swift +63 -39
  156. package/Sources/Private/Model/Text/TextAnimator.swift +164 -0
  157. package/Sources/Private/Model/Text/TextDocument.swift +123 -0
  158. package/Sources/Private/RootAnimationLayer.swift +51 -0
  159. package/{lottie-swift/src → Sources}/Private/Utility/Debugging/AnimatorNodeDebugging.swift +7 -7
  160. package/{lottie-swift/src → Sources}/Private/Utility/Debugging/LayerDebugging.swift +72 -48
  161. package/Sources/Private/Utility/Debugging/TestHelpers.swift +10 -0
  162. package/{lottie-swift/src → Sources}/Private/Utility/Extensions/AnimationKeypathExtension.swift +69 -59
  163. package/Sources/Private/Utility/Extensions/BlendMode+Filter.swift +31 -0
  164. package/Sources/Private/Utility/Extensions/CGColor+RGB.swift +22 -0
  165. package/{lottie-swift/src → Sources}/Private/Utility/Extensions/CGFloatExtensions.swift +70 -67
  166. package/Sources/Private/Utility/Extensions/DataExtension.swift +27 -0
  167. package/Sources/Private/Utility/Extensions/MathKit.swift +450 -0
  168. package/Sources/Private/Utility/Extensions/StringExtensions.swift +38 -0
  169. package/{lottie-swift/src → Sources}/Private/Utility/Helpers/AnimationContext.swift +42 -16
  170. package/Sources/Private/Utility/Interpolatable/InterpolatableExtensions.swift +134 -0
  171. package/{lottie-swift/src → Sources}/Private/Utility/Interpolatable/KeyframeExtensions.swift +13 -10
  172. package/Sources/Private/Utility/Interpolatable/KeyframeGroup+Extensions.swift +59 -0
  173. package/{lottie-swift/src → Sources}/Private/Utility/Primitives/BezierPath.swift +229 -143
  174. package/Sources/Private/Utility/Primitives/CGPointExtension.swift +35 -0
  175. package/{lottie-swift/src → Sources}/Private/Utility/Primitives/ColorExtension.swift +46 -14
  176. package/{lottie-swift/src → Sources}/Private/Utility/Primitives/CompoundBezierPath.swift +58 -49
  177. package/Sources/Private/Utility/Primitives/CurveVertex.swift +184 -0
  178. package/Sources/Private/Utility/Primitives/PathElement.swift +75 -0
  179. package/Sources/Private/Utility/Primitives/UnitBezier.swift +115 -0
  180. package/Sources/Private/Utility/Primitives/VectorsExtensions.swift +341 -0
  181. package/Sources/Public/Animation/AnimationPublic.swift +266 -0
  182. package/Sources/Public/Animation/AnimationView.swift +1335 -0
  183. package/Sources/Public/Animation/AnimationViewInitializers.swift +109 -0
  184. package/Sources/Public/AnimationCache/AnimationCacheProvider.swift +22 -0
  185. package/{lottie-swift/src → Sources}/Public/AnimationCache/LRUAnimationCache.swift +22 -18
  186. package/Sources/Public/DynamicProperties/AnimationKeypath.swift +49 -0
  187. package/Sources/Public/DynamicProperties/AnyValueProvider.swift +132 -0
  188. package/{lottie-swift/src → Sources}/Public/DynamicProperties/ValueProviders/ColorValueProvider.swift +54 -36
  189. package/{lottie-swift/src → Sources}/Public/DynamicProperties/ValueProviders/FloatValueProvider.swift +40 -36
  190. package/Sources/Public/DynamicProperties/ValueProviders/GradientValueProvider.swift +123 -0
  191. package/{lottie-swift/src → Sources}/Public/DynamicProperties/ValueProviders/PointValueProvider.swift +40 -35
  192. package/{lottie-swift/src → Sources}/Public/DynamicProperties/ValueProviders/SizeValueProvider.swift +40 -35
  193. package/{lottie-swift/src → Sources}/Public/FontProvider/AnimationFontProvider.swift +15 -8
  194. package/Sources/Public/ImageProvider/AnimationImageProvider.swift +21 -0
  195. package/Sources/Public/Keyframes/Interpolatable.swift +253 -0
  196. package/Sources/Public/Keyframes/Keyframe.swift +92 -0
  197. package/Sources/Public/Logging/LottieLogger.swift +137 -0
  198. package/Sources/Public/LottieConfiguration.swift +143 -0
  199. package/{lottie-swift/src → Sources}/Public/Primitives/AnimationTime.swift +1 -1
  200. package/{lottie-swift/src → Sources}/Public/Primitives/Color.swift +10 -6
  201. package/{lottie-swift/src → Sources}/Public/Primitives/Vectors.swift +13 -12
  202. package/Sources/Public/TextProvider/AnimationTextProvider.swift +53 -0
  203. package/{lottie-swift/src → Sources}/Public/iOS/AnimatedButton.swift +42 -26
  204. package/{lottie-swift/src → Sources}/Public/iOS/AnimatedControl.swift +100 -91
  205. package/{lottie-swift/src → Sources}/Public/iOS/AnimatedSwitch.swift +128 -94
  206. package/{lottie-swift/src → Sources}/Public/iOS/AnimationSubview.swift +3 -3
  207. package/Sources/Public/iOS/AnimationViewBase.swift +78 -0
  208. package/{lottie-swift/src → Sources}/Public/iOS/BundleImageProvider.swift +36 -34
  209. package/{lottie-swift/src → Sources}/Public/iOS/Compatibility/CompatibleAnimationKeypath.swift +4 -0
  210. package/{lottie-swift/src → Sources}/Public/iOS/Compatibility/CompatibleAnimationView.swift +38 -29
  211. package/{lottie-swift/src → Sources}/Public/iOS/FilepathImageProvider.swift +24 -21
  212. package/{lottie-swift/src → Sources}/Public/iOS/UIColorExtension.swift +4 -4
  213. package/{lottie-swift/src/Public/MacOS/AnimationSubview.swift → Sources/Public/macOS/AnimationSubview.macOS.swift} +4 -5
  214. package/{lottie-swift/src/Public/MacOS/LottieView.swift → Sources/Public/macOS/AnimationViewBase.macOS.swift} +58 -50
  215. package/{lottie-swift/src/Public/MacOS/BundleImageProvider.swift → Sources/Public/macOS/BundleImageProvider.macOS.swift} +31 -32
  216. package/Sources/Public/macOS/FilepathImageProvider.macOS.swift +67 -0
  217. package/Tests/AnimationKeypathTests.swift +94 -0
  218. package/Tests/AutomaticEngineTests.swift +57 -0
  219. package/Tests/BundleTests.swift +25 -0
  220. package/Tests/DataURLTests.swift +64 -0
  221. package/Tests/ParsingTests.swift +43 -0
  222. package/Tests/PerformanceTests.swift +215 -0
  223. package/Tests/SnapshotConfiguration.swift +153 -0
  224. package/Tests/SnapshotTests.swift +265 -0
  225. package/Tests/Utils/Bundle+Module.swift +30 -0
  226. package/Tests/Utils/HardcodedFontProvider.swift +19 -0
  227. package/Tests/Utils/HardcodedImageProvider.swift +23 -0
  228. package/Tests/Utils/Snapshotting+presentationLayer.swift +47 -0
  229. package/Tests/ValueProvidersTests.swift +27 -0
  230. package/lottie-ios.podspec +11 -12
  231. package/package.json +1 -1
  232. package/script/test-carthage/Cartfile +1 -0
  233. package/script/test-carthage/Cartfile.resolved +1 -0
  234. package/script/test-carthage/CarthageTest/AppDelegate.swift +26 -0
  235. package/script/test-carthage/CarthageTest/Assets.xcassets/AccentColor.colorset/Contents.json +11 -0
  236. package/script/test-carthage/CarthageTest/Assets.xcassets/AppIcon.appiconset/Contents.json +98 -0
  237. package/script/test-carthage/CarthageTest/Assets.xcassets/Contents.json +6 -0
  238. package/script/test-carthage/CarthageTest/Base.lproj/LaunchScreen.storyboard +25 -0
  239. package/script/test-carthage/CarthageTest/Base.lproj/Main.storyboard +24 -0
  240. package/script/test-carthage/CarthageTest/Info.plist +66 -0
  241. package/script/test-carthage/CarthageTest/SceneDelegate.swift +10 -0
  242. package/script/test-carthage/CarthageTest/ViewController.swift +15 -0
  243. package/script/test-carthage/CarthageTest-macOS/AppDelegate.swift +7 -0
  244. package/script/test-carthage/CarthageTest-macOS/Assets.xcassets/AccentColor.colorset/Contents.json +11 -0
  245. package/script/test-carthage/CarthageTest-macOS/Assets.xcassets/AppIcon.appiconset/Contents.json +58 -0
  246. package/script/test-carthage/CarthageTest-macOS/Assets.xcassets/Contents.json +6 -0
  247. package/script/test-carthage/CarthageTest-macOS/Base.lproj/Main.storyboard +717 -0
  248. package/script/test-carthage/CarthageTest-macOS/CarthageTest_macOS.entitlements +10 -0
  249. package/script/test-carthage/CarthageTest-macOS/ViewController.swift +15 -0
  250. package/script/test-carthage/CarthageTest.xcodeproj/project.pbxproj +532 -0
  251. package/script/test-carthage/CarthageTest.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
  252. package/script/test-carthage/CarthageTest.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
  253. package/script/test-carthage/CarthageTest.xcodeproj/project.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  254. package/script/test-carthage/CarthageTest.xcodeproj/project.xcworkspace/xcuserdata/calstephens.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  255. package/script/test-carthage/CarthageTest.xcodeproj/xcuserdata/cal.xcuserdatad/xcschemes/xcschememanagement.plist +14 -0
  256. package/script/test-carthage/CarthageTest.xcodeproj/xcuserdata/calstephens.xcuserdatad/xcschemes/xcschememanagement.plist +19 -0
  257. package/script/test-carthage/Mintfile +1 -0
  258. package/script/test-spm/LottieSPM.xcworkspace/contents.xcworkspacedata +7 -0
  259. package/script/test-spm/LottieSPM.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  260. package/script/test-spm/Mintfile +1 -0
  261. package/.swiftpm/xcode/package.xcworkspace/xcuserdata/brandonwithrow.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  262. package/Lottie/Info.plist +0 -22
  263. package/Lottie.xcodeproj/project.xcworkspace/xcuserdata/brandonwithrow.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  264. package/Lottie.xcodeproj/xcuserdata/brandonwithrow.xcuserdatad/xcschemes/LottieLibraryMacOS.xcscheme +0 -80
  265. package/Lottie.xcodeproj/xcuserdata/brandonwithrow.xcuserdatad/xcschemes/xcschememanagement.plist +0 -57
  266. package/lottie-swift/Assets/.gitkeep +0 -0
  267. package/lottie-swift/src/Private/LayerContainers/Utility/LayerFontProvider.swift +0 -37
  268. package/lottie-swift/src/Private/LayerContainers/Utility/LayerTextProvider.swift +0 -36
  269. package/lottie-swift/src/Private/Model/Animation.swift +0 -107
  270. package/lottie-swift/src/Private/Model/Assets/Asset.swift +0 -27
  271. package/lottie-swift/src/Private/Model/Assets/ImageAsset.swift +0 -48
  272. package/lottie-swift/src/Private/Model/Keyframes/Keyframe.swift +0 -128
  273. package/lottie-swift/src/Private/Model/Keyframes/KeyframeGroup.swift +0 -108
  274. package/lottie-swift/src/Private/Model/Layers/LayerModel.swift +0 -150
  275. package/lottie-swift/src/Private/Model/Objects/DashPattern.swift +0 -24
  276. package/lottie-swift/src/Private/Model/Objects/Marker.swift +0 -23
  277. package/lottie-swift/src/Private/Model/Objects/Mask.swift +0 -48
  278. package/lottie-swift/src/Private/Model/Objects/Transform.swift +0 -105
  279. package/lottie-swift/src/Private/Model/ShapeItems/Ellipse.swift +0 -50
  280. package/lottie-swift/src/Private/Model/ShapeItems/FillI.swift +0 -49
  281. package/lottie-swift/src/Private/Model/ShapeItems/GradientFill.swift +0 -86
  282. package/lottie-swift/src/Private/Model/ShapeItems/GradientStroke.swift +0 -125
  283. package/lottie-swift/src/Private/Model/ShapeItems/Group.swift +0 -32
  284. package/lottie-swift/src/Private/Model/ShapeItems/Rectangle.swift +0 -50
  285. package/lottie-swift/src/Private/Model/ShapeItems/Repeater.swift +0 -80
  286. package/lottie-swift/src/Private/Model/ShapeItems/Shape.swift +0 -37
  287. package/lottie-swift/src/Private/Model/ShapeItems/ShapeItem.swift +0 -95
  288. package/lottie-swift/src/Private/Model/ShapeItems/ShapeTransform.swift +0 -68
  289. package/lottie-swift/src/Private/Model/ShapeItems/Star.swift +0 -86
  290. package/lottie-swift/src/Private/Model/ShapeItems/Stroke.swift +0 -67
  291. package/lottie-swift/src/Private/Model/ShapeItems/Trim.swift +0 -53
  292. package/lottie-swift/src/Private/Model/Text/Font.swift +0 -35
  293. package/lottie-swift/src/Private/Model/Text/TextAnimator.swift +0 -99
  294. package/lottie-swift/src/Private/Model/Text/TextDocument.swift +0 -70
  295. package/lottie-swift/src/Private/NodeRenderSystem/Nodes/PathNodes/EllipseNode.swift +0 -109
  296. package/lottie-swift/src/Private/NodeRenderSystem/Nodes/PathNodes/PolygonNode.swift +0 -132
  297. package/lottie-swift/src/Private/NodeRenderSystem/Nodes/RenderContainers/GroupNode.swift +0 -141
  298. package/lottie-swift/src/Private/Utility/Extensions/MathKit.swift +0 -539
  299. package/lottie-swift/src/Private/Utility/Extensions/StringExtensions.swift +0 -32
  300. package/lottie-swift/src/Private/Utility/Interpolatable/Interpolatable.swift +0 -18
  301. package/lottie-swift/src/Private/Utility/Interpolatable/InterpolatableExtensions.swift +0 -170
  302. package/lottie-swift/src/Private/Utility/Primitives/CurveVertex.swift +0 -177
  303. package/lottie-swift/src/Private/Utility/Primitives/PathElement.swift +0 -68
  304. package/lottie-swift/src/Private/Utility/Primitives/VectorsExtensions.swift +0 -218
  305. package/lottie-swift/src/Public/Animation/AnimationPublic.swift +0 -196
  306. package/lottie-swift/src/Public/Animation/AnimationView.swift +0 -1006
  307. package/lottie-swift/src/Public/Animation/AnimationViewInitializers.swift +0 -83
  308. package/lottie-swift/src/Public/AnimationCache/AnimationCacheProvider.swift +0 -24
  309. package/lottie-swift/src/Public/DynamicProperties/AnimationKeypath.swift +0 -46
  310. package/lottie-swift/src/Public/DynamicProperties/AnyValueProvider.swift +0 -29
  311. package/lottie-swift/src/Public/DynamicProperties/ValueProviders/GradientValueProvider.swift +0 -114
  312. package/lottie-swift/src/Public/ImageProvider/AnimationImageProvider.swift +0 -23
  313. package/lottie-swift/src/Public/MacOS/FilepathImageProvider.swift +0 -67
  314. package/lottie-swift/src/Public/TextProvider/AnimationTextProvider.swift +0 -39
  315. package/lottie-swift/src/Public/iOS/LottieView.swift +0 -62
  316. package/lottie-swift-testing.podspec +0 -32
@@ -0,0 +1,109 @@
1
+ //
2
+ // AnimationViewInitializers.swift
3
+ // lottie-swift-iOS
4
+ //
5
+ // Created by Brandon Withrow on 2/6/19.
6
+ //
7
+
8
+ import Foundation
9
+
10
+ extension AnimationView {
11
+
12
+ // MARK: Lifecycle
13
+
14
+ /// Loads a Lottie animation from a JSON file in the supplied bundle.
15
+ ///
16
+ /// - Parameter name: The string name of the lottie animation with no file
17
+ /// extension provided.
18
+ /// - Parameter bundle: The bundle in which the animation is located.
19
+ /// Defaults to the Main bundle.
20
+ /// - Parameter imageProvider: An image provider for the animation's image data.
21
+ /// If none is supplied Lottie will search in the supplied bundle for images.
22
+ public convenience init(
23
+ name: String,
24
+ bundle: Bundle = Bundle.main,
25
+ imageProvider: AnimationImageProvider? = nil,
26
+ animationCache: AnimationCacheProvider? = LRUAnimationCache.sharedCache,
27
+ configuration: LottieConfiguration = .shared)
28
+ {
29
+ let animation = Animation.named(name, bundle: bundle, subdirectory: nil, animationCache: animationCache)
30
+ let provider = imageProvider ?? BundleImageProvider(bundle: bundle, searchPath: nil)
31
+ self.init(animation: animation, imageProvider: provider, configuration: configuration)
32
+ }
33
+
34
+ /// Loads a Lottie animation from a JSON file in a specific path on disk.
35
+ ///
36
+ /// - Parameter name: The absolute path of the Lottie Animation.
37
+ /// - Parameter imageProvider: An image provider for the animation's image data.
38
+ /// If none is supplied Lottie will search in the supplied filepath for images.
39
+ public convenience init(
40
+ filePath: String,
41
+ imageProvider: AnimationImageProvider? = nil,
42
+ animationCache: AnimationCacheProvider? = LRUAnimationCache.sharedCache,
43
+ configuration: LottieConfiguration = .shared)
44
+ {
45
+ let animation = Animation.filepath(filePath, animationCache: animationCache)
46
+ let provider = imageProvider ??
47
+ FilepathImageProvider(filepath: URL(fileURLWithPath: filePath).deletingLastPathComponent().path)
48
+ self.init(animation: animation, imageProvider: provider, configuration: configuration)
49
+ }
50
+
51
+ /// Loads a Lottie animation asynchronously from the URL
52
+ ///
53
+ /// - Parameter url: The url to load the animation from.
54
+ /// - Parameter imageProvider: An image provider for the animation's image data.
55
+ /// If none is supplied Lottie will search in the main bundle for images.
56
+ /// - Parameter closure: A closure to be called when the animation has loaded.
57
+ public convenience init(
58
+ url: URL,
59
+ imageProvider: AnimationImageProvider? = nil,
60
+ closure: @escaping AnimationView.DownloadClosure,
61
+ animationCache: AnimationCacheProvider? = LRUAnimationCache.sharedCache,
62
+ configuration: LottieConfiguration = .shared)
63
+ {
64
+ if let animationCache = animationCache, let animation = animationCache.animation(forKey: url.absoluteString) {
65
+ self.init(animation: animation, imageProvider: imageProvider, configuration: configuration)
66
+ closure(nil)
67
+ } else {
68
+ self.init(animation: nil, imageProvider: imageProvider, configuration: configuration)
69
+
70
+ Animation.loadedFrom(url: url, closure: { animation in
71
+ if let animation = animation {
72
+ self.animation = animation
73
+ closure(nil)
74
+ } else {
75
+ closure(LottieDownloadError.downloadFailed)
76
+ }
77
+ }, animationCache: animationCache)
78
+ }
79
+ }
80
+
81
+ /// Loads a Lottie animation from a JSON file located in the Asset catalog of the supplied bundle.
82
+ /// - Parameter name: The string name of the lottie animation in the asset catalog.
83
+ /// - Parameter bundle: The bundle in which the animation is located.
84
+ /// Defaults to the Main bundle.
85
+ /// - Parameter imageProvider: An image provider for the animation's image data.
86
+ /// If none is supplied Lottie will search in the supplied bundle for images.
87
+ public convenience init(
88
+ asset name: String,
89
+ bundle: Bundle = Bundle.main,
90
+ imageProvider: AnimationImageProvider? = nil,
91
+ animationCache: AnimationCacheProvider? = LRUAnimationCache.sharedCache,
92
+ configuration: LottieConfiguration = .shared)
93
+ {
94
+ let animation = Animation.asset(name, bundle: bundle, animationCache: animationCache)
95
+ let provider = imageProvider ?? BundleImageProvider(bundle: bundle, searchPath: nil)
96
+ self.init(animation: animation, imageProvider: provider, configuration: configuration)
97
+ }
98
+
99
+ // MARK: Public
100
+
101
+ public typealias DownloadClosure = (Error?) -> Void
102
+
103
+ }
104
+
105
+ // MARK: - LottieDownloadError
106
+
107
+ enum LottieDownloadError: Error {
108
+ case downloadFailed
109
+ }
@@ -0,0 +1,22 @@
1
+ //
2
+ // AnimationCacheProvider.swift
3
+ // lottie-swift
4
+ //
5
+ // Created by Brandon Withrow on 2/5/19.
6
+ //
7
+
8
+ import Foundation
9
+ /// `AnimationCacheProvider` is a protocol that describes an Animation Cache.
10
+ /// Animation Cache is used when loading `Animation` models. Using an Animation Cache
11
+ /// can increase performance when loading an animation multiple times.
12
+ ///
13
+ /// Lottie comes with a prebuilt LRU Animation Cache.
14
+ public protocol AnimationCacheProvider {
15
+
16
+ func animation(forKey: String) -> Animation?
17
+
18
+ func setAnimation(_ animation: Animation, forKey: String)
19
+
20
+ func clearCache()
21
+
22
+ }
@@ -7,28 +7,30 @@
7
7
 
8
8
  import Foundation
9
9
 
10
- /**
11
- An Animation Cache that will store animations up to `cacheSize`.
12
-
13
- Once `cacheSize` is reached, the least recently used animation will be ejected.
14
- The default size of the cache is 100.
15
- */
10
+ /// An Animation Cache that will store animations up to `cacheSize`.
11
+ ///
12
+ /// Once `cacheSize` is reached, the least recently used animation will be ejected.
13
+ /// The default size of the cache is 100.
16
14
  public class LRUAnimationCache: AnimationCacheProvider {
17
15
 
16
+ // MARK: Lifecycle
17
+
18
18
  public init() { }
19
-
19
+
20
+ // MARK: Public
21
+
22
+ /// The global shared Cache.
23
+ public static let sharedCache = LRUAnimationCache()
24
+
25
+ /// The size of the cache.
26
+ public var cacheSize = 100
27
+
20
28
  /// Clears the Cache.
21
29
  public func clearCache() {
22
30
  cacheMap.removeAll()
23
31
  lruList.removeAll()
24
32
  }
25
-
26
- /// The global shared Cache.
27
- public static let sharedCache = LRUAnimationCache()
28
-
29
- /// The size of the cache.
30
- public var cacheSize: Int = 100
31
-
33
+
32
34
  public func animation(forKey: String) -> Animation? {
33
35
  guard let animation = cacheMap[forKey] else {
34
36
  return nil
@@ -39,7 +41,7 @@ public class LRUAnimationCache: AnimationCacheProvider {
39
41
  }
40
42
  return animation
41
43
  }
42
-
44
+
43
45
  public func setAnimation(_ animation: Animation, forKey: String) {
44
46
  cacheMap[forKey] = animation
45
47
  lruList.append(forKey)
@@ -50,8 +52,10 @@ public class LRUAnimationCache: AnimationCacheProvider {
50
52
  }
51
53
  }
52
54
  }
53
-
54
- fileprivate var cacheMap: [String : Animation] = [:]
55
+
56
+ // MARK: Fileprivate
57
+
58
+ fileprivate var cacheMap: [String: Animation] = [:]
55
59
  fileprivate var lruList: [String] = []
56
-
60
+
57
61
  }
@@ -0,0 +1,49 @@
1
+ //
2
+ // AnimationKeypath.swift
3
+ // lottie-swift
4
+ //
5
+ // Created by Brandon Withrow on 2/4/19.
6
+ //
7
+
8
+ import Foundation
9
+
10
+ /// `AnimationKeypath` is an object that describes a keypath search for nodes in the
11
+ /// animation JSON. `AnimationKeypath` matches views and properties inside of `AnimationView`
12
+ /// to their backing `Animation` model by name.
13
+ ///
14
+ /// A keypath can be used to set properties on an existing animation, or can be validated
15
+ /// with an existing `Animation`.
16
+ ///
17
+ /// `AnimationKeypath` can describe a specific object, or can use wildcards for fuzzy matching
18
+ /// of objects. Acceptable wildcards are either "*" (star) or "**" (double star).
19
+ /// Single star will search a single depth for the next object.
20
+ /// Double star will search any depth.
21
+ ///
22
+ /// Read More at https://airbnb.io/lottie/#/ios?id=dynamic-animation-properties
23
+ ///
24
+ /// EG:
25
+ /// @"Layer.Shape Group.Stroke 1.Color"
26
+ /// Represents a specific color node on a specific stroke.
27
+ ///
28
+ /// @"**.Stroke 1.Color"
29
+ /// Represents the color node for every Stroke named "Stroke 1" in the animation.
30
+ public struct AnimationKeypath: Hashable, ExpressibleByStringLiteral {
31
+
32
+ /// Creates a keypath from a dot-separated string. The string is separated by "."
33
+ public init(keypath: String) {
34
+ keys = keypath.components(separatedBy: ".")
35
+ }
36
+
37
+ /// Creates a keypath from a dot-separated string
38
+ public init(stringLiteral: String) {
39
+ self.init(keypath: stringLiteral)
40
+ }
41
+
42
+ /// Creates a keypath from a list of strings.
43
+ public init(keys: [String]) {
44
+ self.keys = keys
45
+ }
46
+
47
+ var keys: [String]
48
+
49
+ }
@@ -0,0 +1,132 @@
1
+ //
2
+ // AnyValueProvider.swift
3
+ // lottie-swift
4
+ //
5
+ // Created by Brandon Withrow on 1/30/19.
6
+ //
7
+
8
+ import CoreGraphics
9
+ import Foundation
10
+
11
+ // MARK: - AnyValueProvider
12
+
13
+ /// `AnyValueProvider` is a protocol that return animation data for a property at a
14
+ /// given time. Every frame an `AnimationView` queries all of its properties and asks
15
+ /// if their ValueProvider has an update. If it does the AnimationView will read the
16
+ /// property and update that portion of the animation.
17
+ ///
18
+ /// Value Providers can be used to dynamically set animation properties at run time.
19
+ public protocol AnyValueProvider {
20
+
21
+ /// The Type of the value provider
22
+ var valueType: Any.Type { get }
23
+
24
+ /// The type-erased storage for this Value Provider
25
+ var typeErasedStorage: AnyValueProviderStorage { get }
26
+
27
+ /// Asks the provider if it has an update for the given frame.
28
+ func hasUpdate(frame: AnimationFrameTime) -> Bool
29
+
30
+ }
31
+
32
+ extension AnyValueProvider {
33
+ /// Asks the provider to update the container with its value for the frame.
34
+ public func value(frame: AnimationFrameTime) -> Any {
35
+ typeErasedStorage.value(frame: frame)
36
+ }
37
+ }
38
+
39
+ // MARK: - ValueProvider
40
+
41
+ /// A base protocol for strongly-typed Value Providers
42
+ protocol ValueProvider: AnyValueProvider {
43
+ associatedtype Value: AnyInterpolatable
44
+
45
+ /// The strongly-typed storage for this Value Provider
46
+ var storage: ValueProviderStorage<Value> { get }
47
+ }
48
+
49
+ extension ValueProvider {
50
+ public var typeErasedStorage: AnyValueProviderStorage {
51
+ switch storage {
52
+ case .closure(let typedClosure):
53
+ return .closure(typedClosure)
54
+
55
+ case .singleValue(let typedValue):
56
+ return .singleValue(typedValue)
57
+
58
+ case .keyframes(let keyframes):
59
+ return .keyframes(
60
+ keyframes.map { keyframe in
61
+ keyframe.withValue(keyframe.value as Any)
62
+ },
63
+ interpolate: storage.value(frame:))
64
+ }
65
+ }
66
+ }
67
+
68
+ // MARK: - ValueProviderStorage
69
+
70
+ /// The underlying storage of a `ValueProvider`
71
+ public enum ValueProviderStorage<T: AnyInterpolatable> {
72
+ /// The value provider stores a single value that is used on all frames
73
+ case singleValue(T)
74
+
75
+ /// The value provider stores a group of keyframes
76
+ /// - The main-thread rendering engine interpolates values in these keyframes
77
+ /// using `T`'s `Interpolatable` implementation.
78
+ /// - The Core Animation rendering engine constructs a `CAKeyframeAnimation`
79
+ /// using these keyframes. The Core Animation render server performs
80
+ /// the interpolation, without calling `T`'s `Interpolatable` implementation.
81
+ case keyframes([Keyframe<T>])
82
+
83
+ /// The value provider stores a closure that is invoked on every frame
84
+ /// - This is only supported by the main-thread rendering engine
85
+ case closure((AnimationFrameTime) -> T)
86
+
87
+ // MARK: Internal
88
+
89
+ func value(frame: AnimationFrameTime) -> T {
90
+ switch self {
91
+ case .singleValue(let value):
92
+ return value
93
+
94
+ case .closure(let closure):
95
+ return closure(frame)
96
+
97
+ case .keyframes(let keyframes):
98
+ return KeyframeInterpolator(keyframes: ContiguousArray(keyframes)).storage.value(frame: frame)
99
+ }
100
+ }
101
+ }
102
+
103
+ // MARK: - AnyValueProviderStorage
104
+
105
+ /// A type-erased representation of `ValueProviderStorage`
106
+ public enum AnyValueProviderStorage {
107
+ /// The value provider stores a single value that is used on all frames
108
+ case singleValue(Any)
109
+
110
+ /// The value provider stores a group of keyframes
111
+ /// - Since we can't interpolate a type-erased `KeyframeGroup`,
112
+ /// the interpolation has to be performed in the `interpolate` closure.
113
+ case keyframes([Keyframe<Any>], interpolate: (AnimationFrameTime) -> Any)
114
+
115
+ /// The value provider stores a closure that is invoked on every frame
116
+ case closure((AnimationFrameTime) -> Any)
117
+
118
+ // MARK: Internal
119
+
120
+ func value(frame: AnimationFrameTime) -> Any {
121
+ switch self {
122
+ case .singleValue(let value):
123
+ return value
124
+
125
+ case .closure(let closure):
126
+ return closure(frame)
127
+
128
+ case .keyframes(_, let valueForFrame):
129
+ return valueForFrame(frame)
130
+ }
131
+ }
132
+ }
@@ -5,62 +5,80 @@
5
5
  // Created by Brandon Withrow on 2/4/19.
6
6
  //
7
7
 
8
- import Foundation
9
8
  import CoreGraphics
9
+ import Foundation
10
10
 
11
11
  /// A `ValueProvider` that returns a CGColor Value
12
- public final class ColorValueProvider: AnyValueProvider {
13
-
14
- /// Returns a Color for a CGColor(Frame Time)
15
- public typealias ColorValueBlock = (CGFloat) -> Color
16
-
17
- /// The color value of the provider.
18
- public var color: Color {
19
- didSet {
20
- hasUpdate = true
21
- }
22
- }
23
-
12
+ public final class ColorValueProvider: ValueProvider {
13
+
14
+ // MARK: Lifecycle
15
+
24
16
  /// Initializes with a block provider
25
17
  public init(block: @escaping ColorValueBlock) {
26
18
  self.block = block
27
- self.color = Color(r: 0, g: 0, b: 0, a: 1)
19
+ color = Color(r: 0, g: 0, b: 0, a: 1)
20
+ keyframes = nil
28
21
  }
29
-
22
+
30
23
  /// Initializes with a single color.
31
24
  public init(_ color: Color) {
32
25
  self.color = color
33
- self.block = nil
26
+ block = nil
27
+ keyframes = nil
28
+ hasUpdate = true
29
+ }
30
+
31
+ /// Initializes with multiple colors, with timing information
32
+ public init(_ keyframes: [Keyframe<Color>]) {
33
+ self.keyframes = keyframes
34
+ color = Color(r: 0, g: 0, b: 0, a: 1)
35
+ block = nil
34
36
  hasUpdate = true
35
37
  }
36
-
38
+
39
+ // MARK: Public
40
+
41
+ /// Returns a Color for a CGColor(Frame Time)
42
+ public typealias ColorValueBlock = (CGFloat) -> Color
43
+
44
+ /// The color value of the provider.
45
+ public var color: Color {
46
+ didSet {
47
+ hasUpdate = true
48
+ }
49
+ }
50
+
37
51
  // MARK: ValueProvider Protocol
38
-
52
+
39
53
  public var valueType: Any.Type {
40
- return Color.self
54
+ Color.self
41
55
  }
42
-
43
- public func hasUpdate(frame: CGFloat) -> Bool {
56
+
57
+ public var storage: ValueProviderStorage<Color> {
58
+ if let block = block {
59
+ return .closure { frame in
60
+ self.hasUpdate = false
61
+ return block(frame)
62
+ }
63
+ } else if let keyframes = keyframes {
64
+ return .keyframes(keyframes)
65
+ } else {
66
+ hasUpdate = false
67
+ return .singleValue(color)
68
+ }
69
+ }
70
+
71
+ public func hasUpdate(frame _: CGFloat) -> Bool {
44
72
  if block != nil {
45
73
  return true
46
74
  }
47
75
  return hasUpdate
48
76
  }
49
-
50
- public func value(frame: CGFloat) -> Any {
51
- hasUpdate = false
52
- let newColor: Color
53
- if let block = block {
54
- newColor = block(frame)
55
- } else {
56
- newColor = color
57
- }
58
- return newColor
59
- }
60
-
77
+
61
78
  // MARK: Private
62
-
63
- private var hasUpdate: Bool = true
64
-
79
+
80
+ private var hasUpdate = true
81
+
65
82
  private var block: ColorValueBlock?
83
+ private var keyframes: [Keyframe<Color>]?
66
84
  }
@@ -5,62 +5,66 @@
5
5
  // Created by Brandon Withrow on 2/4/19.
6
6
  //
7
7
 
8
- import Foundation
9
8
  import CoreGraphics
9
+ import Foundation
10
10
 
11
11
  /// A `ValueProvider` that returns a CGFloat Value
12
- public final class FloatValueProvider: AnyValueProvider {
13
-
14
- /// Returns a CGFloat for a CGFloat(Frame Time)
15
- public typealias CGFloatValueBlock = (CGFloat) -> CGFloat
16
-
17
- public var float: CGFloat {
18
- didSet {
19
- hasUpdate = true
20
- }
21
- }
22
-
12
+ public final class FloatValueProvider: ValueProvider {
13
+
14
+ // MARK: Lifecycle
15
+
23
16
  /// Initializes with a block provider
24
17
  public init(block: @escaping CGFloatValueBlock) {
25
18
  self.block = block
26
- self.float = 0
19
+ float = 0
27
20
  }
28
-
21
+
29
22
  /// Initializes with a single float.
30
23
  public init(_ float: CGFloat) {
31
24
  self.float = float
32
- self.block = nil
25
+ block = nil
33
26
  hasUpdate = true
34
27
  }
35
-
28
+
29
+ // MARK: Public
30
+
31
+ /// Returns a CGFloat for a CGFloat(Frame Time)
32
+ public typealias CGFloatValueBlock = (CGFloat) -> CGFloat
33
+
34
+ public var float: CGFloat {
35
+ didSet {
36
+ hasUpdate = true
37
+ }
38
+ }
39
+
36
40
  // MARK: ValueProvider Protocol
37
-
41
+
38
42
  public var valueType: Any.Type {
39
- return Vector1D.self
43
+ Vector1D.self
44
+ }
45
+
46
+ public var storage: ValueProviderStorage<Vector1D> {
47
+ if let block = block {
48
+ return .closure { frame in
49
+ self.hasUpdate = false
50
+ return Vector1D(Double(block(frame)))
51
+ }
52
+ } else {
53
+ hasUpdate = false
54
+ return .singleValue(Vector1D(Double(float)))
55
+ }
40
56
  }
41
-
42
- public func hasUpdate(frame: CGFloat) -> Bool {
57
+
58
+ public func hasUpdate(frame _: CGFloat) -> Bool {
43
59
  if block != nil {
44
60
  return true
45
61
  }
46
62
  return hasUpdate
47
63
  }
48
-
49
- public func value(frame: CGFloat) -> Any {
50
- hasUpdate = false
51
- let newCGFloat: CGFloat
52
- if let block = block {
53
- newCGFloat = block(frame)
54
- } else {
55
- newCGFloat = float
56
- }
57
- return Vector1D(Double(newCGFloat))
58
- }
59
-
64
+
60
65
  // MARK: Private
61
-
62
- private var hasUpdate: Bool = true
63
-
66
+
67
+ private var hasUpdate = true
68
+
64
69
  private var block: CGFloatValueBlock?
65
70
  }
66
-