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,139 @@
1
+ //
2
+ // EllipseNode.swift
3
+ // lottie-swift
4
+ //
5
+ // Created by Brandon Withrow on 1/17/19.
6
+ //
7
+
8
+ import Foundation
9
+ import QuartzCore
10
+
11
+ // MARK: - EllipseNodeProperties
12
+
13
+ final class EllipseNodeProperties: NodePropertyMap, KeypathSearchable {
14
+
15
+ // MARK: Lifecycle
16
+
17
+ init(ellipse: Ellipse) {
18
+ keypathName = ellipse.name
19
+ direction = ellipse.direction
20
+ position = NodeProperty(provider: KeyframeInterpolator(keyframes: ellipse.position.keyframes))
21
+ size = NodeProperty(provider: KeyframeInterpolator(keyframes: ellipse.size.keyframes))
22
+ keypathProperties = [
23
+ "Position" : position,
24
+ "Size" : size,
25
+ ]
26
+ properties = Array(keypathProperties.values)
27
+ }
28
+
29
+ // MARK: Internal
30
+
31
+ var keypathName: String
32
+
33
+ let direction: PathDirection
34
+ let position: NodeProperty<Vector3D>
35
+ let size: NodeProperty<Vector3D>
36
+
37
+ let keypathProperties: [String: AnyNodeProperty]
38
+ let properties: [AnyNodeProperty]
39
+ }
40
+
41
+ // MARK: - EllipseNode
42
+
43
+ final class EllipseNode: AnimatorNode, PathNode {
44
+
45
+ // MARK: Lifecycle
46
+
47
+ init(parentNode: AnimatorNode?, ellipse: Ellipse) {
48
+ pathOutput = PathOutputNode(parent: parentNode?.outputNode)
49
+ properties = EllipseNodeProperties(ellipse: ellipse)
50
+ self.parentNode = parentNode
51
+ }
52
+
53
+ // MARK: Internal
54
+
55
+ static let ControlPointConstant: CGFloat = 0.55228
56
+
57
+ let pathOutput: PathOutputNode
58
+
59
+ let properties: EllipseNodeProperties
60
+
61
+ let parentNode: AnimatorNode?
62
+ var hasLocalUpdates = false
63
+ var hasUpstreamUpdates = false
64
+ var lastUpdateFrame: CGFloat? = nil
65
+
66
+ // MARK: Animator Node
67
+
68
+ var propertyMap: NodePropertyMap & KeypathSearchable {
69
+ properties
70
+ }
71
+
72
+ var isEnabled = true {
73
+ didSet {
74
+ pathOutput.isEnabled = isEnabled
75
+ }
76
+ }
77
+
78
+ func rebuildOutputs(frame: CGFloat) {
79
+ pathOutput.setPath(
80
+ .ellipse(
81
+ size: properties.size.value.sizeValue,
82
+ center: properties.position.value.pointValue,
83
+ direction: properties.direction),
84
+ updateFrame: frame)
85
+ }
86
+
87
+ }
88
+
89
+ extension BezierPath {
90
+ /// Constructs a `BezierPath` in the shape of an ellipse
91
+ static func ellipse(
92
+ size: CGSize,
93
+ center: CGPoint,
94
+ direction: PathDirection)
95
+ -> BezierPath
96
+ {
97
+ // Unfortunately we HAVE to manually build out the ellipse.
98
+ // Every Apple method constructs an ellipse from the 3 o-clock position
99
+ // After effects constructs from the Noon position.
100
+ // After effects does clockwise, but also has a flag for reversed.
101
+ var half = size * 0.5
102
+ if direction == .counterClockwise {
103
+ half.width = half.width * -1
104
+ }
105
+
106
+ let q1 = CGPoint(x: center.x, y: center.y - half.height)
107
+ let q2 = CGPoint(x: center.x + half.width, y: center.y)
108
+ let q3 = CGPoint(x: center.x, y: center.y + half.height)
109
+ let q4 = CGPoint(x: center.x - half.width, y: center.y)
110
+
111
+ let cp = half * EllipseNode.ControlPointConstant
112
+
113
+ var path = BezierPath(startPoint: CurveVertex(
114
+ point: q1,
115
+ inTangentRelative: CGPoint(x: -cp.width, y: 0),
116
+ outTangentRelative: CGPoint(x: cp.width, y: 0)))
117
+ path.addVertex(CurveVertex(
118
+ point: q2,
119
+ inTangentRelative: CGPoint(x: 0, y: -cp.height),
120
+ outTangentRelative: CGPoint(x: 0, y: cp.height)))
121
+
122
+ path.addVertex(CurveVertex(
123
+ point: q3,
124
+ inTangentRelative: CGPoint(x: cp.width, y: 0),
125
+ outTangentRelative: CGPoint(x: -cp.width, y: 0)))
126
+
127
+ path.addVertex(CurveVertex(
128
+ point: q4,
129
+ inTangentRelative: CGPoint(x: 0, y: cp.height),
130
+ outTangentRelative: CGPoint(x: 0, y: -cp.height)))
131
+
132
+ path.addVertex(CurveVertex(
133
+ point: q1,
134
+ inTangentRelative: CGPoint(x: -cp.width, y: 0),
135
+ outTangentRelative: CGPoint(x: cp.width, y: 0)))
136
+ path.close()
137
+ return path
138
+ }
139
+ }
@@ -0,0 +1,170 @@
1
+ //
2
+ // PolygonNode.swift
3
+ // lottie-swift
4
+ //
5
+ // Created by Brandon Withrow on 1/21/19.
6
+ //
7
+
8
+ import Foundation
9
+ import QuartzCore
10
+
11
+ // MARK: - PolygonNodeProperties
12
+
13
+ final class PolygonNodeProperties: NodePropertyMap, KeypathSearchable {
14
+
15
+ // MARK: Lifecycle
16
+
17
+ init(star: Star) {
18
+ keypathName = star.name
19
+ direction = star.direction
20
+ position = NodeProperty(provider: KeyframeInterpolator(keyframes: star.position.keyframes))
21
+ outerRadius = NodeProperty(provider: KeyframeInterpolator(keyframes: star.outerRadius.keyframes))
22
+ outerRoundedness = NodeProperty(provider: KeyframeInterpolator(keyframes: star.outerRoundness.keyframes))
23
+ rotation = NodeProperty(provider: KeyframeInterpolator(keyframes: star.rotation.keyframes))
24
+ points = NodeProperty(provider: KeyframeInterpolator(keyframes: star.points.keyframes))
25
+ keypathProperties = [
26
+ "Position" : position,
27
+ "Outer Radius" : outerRadius,
28
+ "Outer Roundedness" : outerRoundedness,
29
+ "Rotation" : rotation,
30
+ "Points" : points,
31
+ ]
32
+ properties = Array(keypathProperties.values)
33
+ }
34
+
35
+ // MARK: Internal
36
+
37
+ var keypathName: String
38
+
39
+ var childKeypaths: [KeypathSearchable] = []
40
+
41
+ let keypathProperties: [String: AnyNodeProperty]
42
+ let properties: [AnyNodeProperty]
43
+
44
+ let direction: PathDirection
45
+ let position: NodeProperty<Vector3D>
46
+ let outerRadius: NodeProperty<Vector1D>
47
+ let outerRoundedness: NodeProperty<Vector1D>
48
+ let rotation: NodeProperty<Vector1D>
49
+ let points: NodeProperty<Vector1D>
50
+ }
51
+
52
+ // MARK: - PolygonNode
53
+
54
+ final class PolygonNode: AnimatorNode, PathNode {
55
+
56
+ // MARK: Lifecycle
57
+
58
+ init(parentNode: AnimatorNode?, star: Star) {
59
+ pathOutput = PathOutputNode(parent: parentNode?.outputNode)
60
+ properties = PolygonNodeProperties(star: star)
61
+ self.parentNode = parentNode
62
+ }
63
+
64
+ // MARK: Internal
65
+
66
+ /// Magic number needed for constructing path.
67
+ static let PolygonConstant: CGFloat = 0.25
68
+
69
+ let properties: PolygonNodeProperties
70
+
71
+ let pathOutput: PathOutputNode
72
+
73
+ let parentNode: AnimatorNode?
74
+ var hasLocalUpdates = false
75
+ var hasUpstreamUpdates = false
76
+ var lastUpdateFrame: CGFloat? = nil
77
+
78
+ // MARK: Animator Node
79
+
80
+ var propertyMap: NodePropertyMap & KeypathSearchable {
81
+ properties
82
+ }
83
+
84
+ var isEnabled = true {
85
+ didSet {
86
+ pathOutput.isEnabled = isEnabled
87
+ }
88
+ }
89
+
90
+ func rebuildOutputs(frame: CGFloat) {
91
+ let path = BezierPath.polygon(
92
+ position: properties.position.value.pointValue,
93
+ numberOfPoints: properties.points.value.cgFloatValue,
94
+ outerRadius: properties.outerRadius.value.cgFloatValue,
95
+ outerRoundedness: properties.outerRoundedness.value.cgFloatValue,
96
+ rotation: properties.rotation.value.cgFloatValue,
97
+ direction: properties.direction)
98
+
99
+ pathOutput.setPath(path, updateFrame: frame)
100
+ }
101
+
102
+ }
103
+
104
+ extension BezierPath {
105
+ /// Creates a `BezierPath` in the shape of a polygon
106
+ static func polygon(
107
+ position: CGPoint,
108
+ numberOfPoints: CGFloat,
109
+ outerRadius: CGFloat,
110
+ outerRoundedness inputOuterRoundedness: CGFloat,
111
+ rotation: CGFloat,
112
+ direction: PathDirection)
113
+ -> BezierPath
114
+ {
115
+ var currentAngle = (rotation - 90).toRadians()
116
+ let anglePerPoint = ((2 * CGFloat.pi) / numberOfPoints)
117
+ let outerRoundedness = inputOuterRoundedness * 0.01
118
+
119
+ var point = CGPoint(
120
+ x: outerRadius * cos(currentAngle),
121
+ y: outerRadius * sin(currentAngle))
122
+ var vertices = [CurveVertex(point: point + position, inTangentRelative: .zero, outTangentRelative: .zero)]
123
+
124
+ var previousPoint = point
125
+ currentAngle += anglePerPoint;
126
+ for _ in 0..<Int(ceil(numberOfPoints)) {
127
+ previousPoint = point
128
+ point = CGPoint(
129
+ x: outerRadius * cos(currentAngle),
130
+ y: outerRadius * sin(currentAngle))
131
+
132
+ if outerRoundedness != 0 {
133
+ let cp1Theta = (atan2(previousPoint.y, previousPoint.x) - CGFloat.pi / 2)
134
+ let cp1Dx = cos(cp1Theta);
135
+ let cp1Dy = sin(cp1Theta);
136
+
137
+ let cp2Theta = (atan2(point.y, point.x) - CGFloat.pi / 2)
138
+ let cp2Dx = cos(cp2Theta)
139
+ let cp2Dy = sin(cp2Theta)
140
+
141
+ let cp1 = CGPoint(
142
+ x: outerRadius * outerRoundedness * PolygonNode.PolygonConstant * cp1Dx,
143
+ y: outerRadius * outerRoundedness * PolygonNode.PolygonConstant * cp1Dy)
144
+ let cp2 = CGPoint(
145
+ x: outerRadius * outerRoundedness * PolygonNode.PolygonConstant * cp2Dx,
146
+ y: outerRadius * outerRoundedness * PolygonNode.PolygonConstant * cp2Dy)
147
+
148
+ let previousVertex = vertices[vertices.endIndex - 1]
149
+ vertices[vertices.endIndex - 1] = CurveVertex(
150
+ previousVertex.inTangent,
151
+ previousVertex.point,
152
+ previousVertex.point - cp1)
153
+ vertices.append(CurveVertex(point: point + position, inTangentRelative: cp2, outTangentRelative: .zero))
154
+ } else {
155
+ vertices.append(CurveVertex(point: point + position, inTangentRelative: .zero, outTangentRelative: .zero))
156
+ }
157
+ currentAngle += anglePerPoint;
158
+ }
159
+ let reverse = direction == .counterClockwise
160
+ if reverse {
161
+ vertices = vertices.reversed()
162
+ }
163
+ var path = BezierPath()
164
+ for vertex in vertices {
165
+ path.addVertex(reverse ? vertex.reversed() : vertex)
166
+ }
167
+ path.close()
168
+ return path
169
+ }
170
+ }
@@ -5,102 +5,140 @@
5
5
  // Created by Brandon Withrow on 1/21/19.
6
6
  //
7
7
 
8
- import Foundation
9
8
  import CoreGraphics
9
+ import Foundation
10
+
11
+ // MARK: - RectNodeProperties
10
12
 
11
13
  final class RectNodeProperties: NodePropertyMap, KeypathSearchable {
12
-
13
- var keypathName: String
14
+
15
+ // MARK: Lifecycle
14
16
 
15
17
  init(rectangle: Rectangle) {
16
- self.keypathName = rectangle.name
17
- self.direction = rectangle.direction
18
- self.position = NodeProperty(provider: KeyframeInterpolator(keyframes: rectangle.position.keyframes))
19
- self.size = NodeProperty(provider: KeyframeInterpolator(keyframes: rectangle.size.keyframes))
20
- self.cornerRadius = NodeProperty(provider: KeyframeInterpolator(keyframes: rectangle.cornerRadius.keyframes))
21
-
22
- self.keypathProperties = [
18
+ keypathName = rectangle.name
19
+ direction = rectangle.direction
20
+ position = NodeProperty(provider: KeyframeInterpolator(keyframes: rectangle.position.keyframes))
21
+ size = NodeProperty(provider: KeyframeInterpolator(keyframes: rectangle.size.keyframes))
22
+ cornerRadius = NodeProperty(provider: KeyframeInterpolator(keyframes: rectangle.cornerRadius.keyframes))
23
+
24
+ keypathProperties = [
23
25
  "Position" : position,
24
26
  "Size" : size,
25
- "Roundness" : cornerRadius
27
+ "Roundness" : cornerRadius,
26
28
  ]
27
-
28
- self.properties = Array(keypathProperties.values)
29
+
30
+ properties = Array(keypathProperties.values)
29
31
  }
30
-
31
- let keypathProperties: [String : AnyNodeProperty]
32
+
33
+ // MARK: Internal
34
+
35
+ var keypathName: String
36
+
37
+ let keypathProperties: [String: AnyNodeProperty]
32
38
  let properties: [AnyNodeProperty]
33
-
39
+
34
40
  let direction: PathDirection
35
41
  let position: NodeProperty<Vector3D>
36
42
  let size: NodeProperty<Vector3D>
37
43
  let cornerRadius: NodeProperty<Vector1D>
38
-
44
+
39
45
  }
40
46
 
47
+ // MARK: - RectangleNode
48
+
41
49
  final class RectangleNode: AnimatorNode, PathNode {
42
-
43
- let properties: RectNodeProperties
44
-
45
- let pathOutput: PathOutputNode
46
-
50
+
51
+ // MARK: Lifecycle
52
+
47
53
  init(parentNode: AnimatorNode?, rectangle: Rectangle) {
48
- self.properties = RectNodeProperties(rectangle: rectangle)
49
- self.pathOutput = PathOutputNode(parent: parentNode?.outputNode)
54
+ properties = RectNodeProperties(rectangle: rectangle)
55
+ pathOutput = PathOutputNode(parent: parentNode?.outputNode)
50
56
  self.parentNode = parentNode
51
57
  }
52
58
 
59
+ // MARK: Internal
60
+
61
+ let properties: RectNodeProperties
62
+
63
+ let pathOutput: PathOutputNode
64
+ let parentNode: AnimatorNode?
65
+ var hasLocalUpdates = false
66
+ var hasUpstreamUpdates = false
67
+ var lastUpdateFrame: CGFloat? = nil
68
+
53
69
  // MARK: Animator Node
54
-
70
+
55
71
  var propertyMap: NodePropertyMap & KeypathSearchable {
56
- return properties
72
+ properties
57
73
  }
58
74
 
59
- let parentNode: AnimatorNode?
60
- var hasLocalUpdates: Bool = false
61
- var hasUpstreamUpdates: Bool = false
62
- var lastUpdateFrame: CGFloat? = nil
63
- var isEnabled: Bool = true {
64
- didSet{
65
- self.pathOutput.isEnabled = self.isEnabled
75
+ var isEnabled = true {
76
+ didSet {
77
+ pathOutput.isEnabled = isEnabled
66
78
  }
67
79
  }
68
-
80
+
69
81
  func rebuildOutputs(frame: CGFloat) {
70
-
71
- let size = properties.size.value.sizeValue * 0.5
72
- let radius = min(min(properties.cornerRadius.value.cgFloatValue, size.width) , size.height)
73
- let position = properties.position.value.pointValue
82
+ pathOutput.setPath(
83
+ .rectangle(
84
+ position: properties.position.value.pointValue,
85
+ size: properties.size.value.sizeValue,
86
+ cornerRadius: properties.cornerRadius.value.cgFloatValue,
87
+ direction: properties.direction),
88
+ updateFrame: frame)
89
+ }
90
+
91
+ }
92
+
93
+ // MARK: - BezierPath + rectangle
94
+
95
+ extension BezierPath {
96
+ /// Constructs a `BezierPath` in the shape of a rectangle, optionally with rounded corners
97
+ static func rectangle(
98
+ position: CGPoint,
99
+ size inputSize: CGSize,
100
+ cornerRadius: CGFloat,
101
+ direction: PathDirection)
102
+ -> BezierPath
103
+ {
104
+ let size = inputSize * 0.5
105
+ let radius = min(min(cornerRadius, size.width) , size.height)
106
+
74
107
  var bezierPath = BezierPath()
75
108
  let points: [CurveVertex]
76
-
109
+
77
110
  if radius <= 0 {
78
111
  /// No Corners
79
112
  points = [
80
113
  /// Lead In
81
- CurveVertex(point: CGPoint(x: size.width, y: -size.height),
82
- inTangentRelative: .zero,
83
- outTangentRelative: .zero)
114
+ CurveVertex(
115
+ point: CGPoint(x: size.width, y: -size.height),
116
+ inTangentRelative: .zero,
117
+ outTangentRelative: .zero)
84
118
  .translated(position),
85
119
  /// Corner 1
86
- CurveVertex(point: CGPoint(x: size.width, y: size.height),
87
- inTangentRelative: .zero,
88
- outTangentRelative: .zero)
120
+ CurveVertex(
121
+ point: CGPoint(x: size.width, y: size.height),
122
+ inTangentRelative: .zero,
123
+ outTangentRelative: .zero)
89
124
  .translated(position),
90
125
  /// Corner 2
91
- CurveVertex(point: CGPoint(x: -size.width, y: size.height),
92
- inTangentRelative: .zero,
93
- outTangentRelative: .zero)
126
+ CurveVertex(
127
+ point: CGPoint(x: -size.width, y: size.height),
128
+ inTangentRelative: .zero,
129
+ outTangentRelative: .zero)
94
130
  .translated(position),
95
131
  /// Corner 3
96
- CurveVertex(point: CGPoint(x: -size.width, y: -size.height),
97
- inTangentRelative: .zero,
98
- outTangentRelative: .zero)
132
+ CurveVertex(
133
+ point: CGPoint(x: -size.width, y: -size.height),
134
+ inTangentRelative: .zero,
135
+ outTangentRelative: .zero)
99
136
  .translated(position),
100
137
  /// Corner 4
101
- CurveVertex(point: CGPoint(x: size.width, y: -size.height),
102
- inTangentRelative: .zero,
103
- outTangentRelative: .zero)
138
+ CurveVertex(
139
+ point: CGPoint(x: size.width, y: -size.height),
140
+ inTangentRelative: .zero,
141
+ outTangentRelative: .zero)
104
142
  .translated(position),
105
143
  ]
106
144
  } else {
@@ -133,7 +171,7 @@ final class RectangleNode: AnimatorNode, PathNode {
133
171
  CurveVertex(
134
172
  CGPoint(x: 0, y: radius), // In tangent
135
173
  CGPoint(x: 0, y: radius), // Point
136
- CGPoint(x: -controlPoint, y: radius))// Out tangent
174
+ CGPoint(x: -controlPoint, y: radius)) // Out tangent
137
175
  .translated(CGPoint(x: radius, y: -radius))
138
176
  .translated(CGPoint(x: -size.width, y: size.height))
139
177
  .translated(position),
@@ -176,13 +214,12 @@ final class RectangleNode: AnimatorNode, PathNode {
176
214
  .translated(position),
177
215
  ]
178
216
  }
179
- let reversed = properties.direction == .counterClockwise
217
+ let reversed = direction == .counterClockwise
180
218
  let pathPoints = reversed ? points.reversed() : points
181
219
  for point in pathPoints {
182
220
  bezierPath.addVertex(reversed ? point.reversed() : point)
183
221
  }
184
222
  bezierPath.close()
185
- pathOutput.setPath(bezierPath, updateFrame: frame)
223
+ return bezierPath
186
224
  }
187
-
188
225
  }
@@ -5,57 +5,70 @@
5
5
  // Created by Brandon Withrow on 1/16/19.
6
6
  //
7
7
 
8
- import Foundation
9
8
  import CoreGraphics
9
+ import Foundation
10
+
11
+ // MARK: - ShapeNodeProperties
10
12
 
11
13
  final class ShapeNodeProperties: NodePropertyMap, KeypathSearchable {
12
-
13
- var keypathName: String
14
-
14
+
15
+ // MARK: Lifecycle
16
+
15
17
  init(shape: Shape) {
16
- self.keypathName = shape.name
17
- self.path = NodeProperty(provider: KeyframeInterpolator(keyframes: shape.path.keyframes))
18
- self.keypathProperties = [
19
- "Path" : path
18
+ keypathName = shape.name
19
+ path = NodeProperty(provider: KeyframeInterpolator(keyframes: shape.path.keyframes))
20
+ keypathProperties = [
21
+ "Path" : path,
20
22
  ]
21
- self.properties = Array(keypathProperties.values)
23
+ properties = Array(keypathProperties.values)
22
24
  }
23
-
25
+
26
+ // MARK: Internal
27
+
28
+ var keypathName: String
29
+
24
30
  let path: NodeProperty<BezierPath>
25
- let keypathProperties: [String : AnyNodeProperty]
31
+ let keypathProperties: [String: AnyNodeProperty]
26
32
  let properties: [AnyNodeProperty]
27
-
33
+
28
34
  }
29
35
 
36
+ // MARK: - ShapeNode
37
+
30
38
  final class ShapeNode: AnimatorNode, PathNode {
31
-
32
- let properties: ShapeNodeProperties
33
39
 
34
- let pathOutput: PathOutputNode
35
-
40
+ // MARK: Lifecycle
41
+
36
42
  init(parentNode: AnimatorNode?, shape: Shape) {
37
- self.pathOutput = PathOutputNode(parent: parentNode?.outputNode)
38
- self.properties = ShapeNodeProperties(shape: shape)
43
+ pathOutput = PathOutputNode(parent: parentNode?.outputNode)
44
+ properties = ShapeNodeProperties(shape: shape)
39
45
  self.parentNode = parentNode
40
46
  }
41
47
 
48
+ // MARK: Internal
49
+
50
+ let properties: ShapeNodeProperties
51
+
52
+ let pathOutput: PathOutputNode
53
+
54
+ let parentNode: AnimatorNode?
55
+ var hasLocalUpdates = false
56
+ var hasUpstreamUpdates = false
57
+ var lastUpdateFrame: CGFloat? = nil
58
+
42
59
  // MARK: Animator Node
43
60
  var propertyMap: NodePropertyMap & KeypathSearchable {
44
- return properties
61
+ properties
45
62
  }
46
-
47
- let parentNode: AnimatorNode?
48
- var hasLocalUpdates: Bool = false
49
- var hasUpstreamUpdates: Bool = false
50
- var lastUpdateFrame: CGFloat? = nil
51
- var isEnabled: Bool = true {
52
- didSet{
53
- self.pathOutput.isEnabled = self.isEnabled
63
+
64
+ var isEnabled = true {
65
+ didSet {
66
+ pathOutput.isEnabled = isEnabled
54
67
  }
55
68
  }
56
-
69
+
57
70
  func rebuildOutputs(frame: CGFloat) {
58
71
  pathOutput.setPath(properties.path.value, updateFrame: frame)
59
72
  }
60
-
73
+
61
74
  }