lottie-ios 3.2.3 → 3.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (434) hide show
  1. package/.github/actions/setup/action.yml +32 -0
  2. package/.github/issue_template.md +6 -23
  3. package/.github/workflows/main.yml +98 -0
  4. package/.github/workflows/stale_issues.yml +17 -0
  5. package/.spi.yml +6 -0
  6. package/.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata +7 -0
  7. package/.swiftpm/xcode/package.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  8. package/.swiftpm/xcode/package.xcworkspace/xcuserdata/calstephens.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  9. package/.swiftpm/xcode/xcuserdata/{brandonwithrow.xcuserdatad → cal.xcuserdatad}/xcschemes/xcschememanagement.plist +25 -15
  10. package/.swiftpm/xcode/xcuserdata/calstephens.xcuserdatad/xcschemes/xcschememanagement.plist +14 -0
  11. package/Gemfile +4 -0
  12. package/Gemfile.lock +102 -0
  13. package/Lottie.xcodeproj/project.pbxproj +2011 -1972
  14. package/Lottie.xcodeproj/project.xcworkspace/contents.xcworkspacedata +1 -1
  15. package/Lottie.xcodeproj/project.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  16. package/Lottie.xcodeproj/xcshareddata/xcschemes/{Lottie_iOS.xcscheme → Lottie (iOS).xcscheme } +15 -18
  17. package/Lottie.xcodeproj/xcshareddata/xcschemes/{Lottie_tvOS.xcscheme → Lottie (macOS).xcscheme } +5 -18
  18. package/Lottie.xcodeproj/xcshareddata/xcschemes/{Lottie_macOS.xcscheme → Lottie (tvOS).xcscheme } +5 -18
  19. package/Lottie.xcodeproj/xcuserdata/cal.xcuserdatad/xcschemes/xcschememanagement.plist +37 -0
  20. package/Lottie.xcodeproj/xcuserdata/calstephens.xcuserdatad/xcschemes/xcschememanagement.plist +24 -0
  21. package/Lottie.xcworkspace/contents.xcworkspacedata +10 -0
  22. package/Lottie.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
  23. package/Lottie.xcworkspace/xcshareddata/swiftpm/Package.resolved +34 -0
  24. package/Lottie.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  25. package/{Lottie.xcodeproj/xcuserdata/brandonwithrow.xcuserdatad → Lottie.xcworkspace/xcuserdata/cal.xcuserdatad}/xcdebugger/Breakpoints_v2.xcbkptlist +2 -2
  26. package/Lottie.xcworkspace/xcuserdata/cal.xcuserdatad/xcdebugger/Expressions.xcexplist +153 -0
  27. package/Lottie.xcworkspace/xcuserdata/calstephens.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  28. package/Lottie.xcworkspace/xcuserdata/calstephens.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +22 -0
  29. package/Lottie.xcworkspace/xcuserdata/calstephens.xcuserdatad/xcdebugger/Expressions.xcexplist +138 -0
  30. package/Lottie.xcworkspace/xcuserdata/calstephens.xcuserdatad/xcschemes/xcschememanagement.plist +30 -0
  31. package/Package.swift +5 -15
  32. package/README.md +40 -60
  33. package/Rakefile +160 -0
  34. package/Sources/Private/CoreAnimation/Animations/CAAnimation+TimingConfiguration.swift +81 -0
  35. package/Sources/Private/CoreAnimation/Animations/CALayer+addAnimation.swift +447 -0
  36. package/Sources/Private/CoreAnimation/Animations/CombinedShapeAnimation.swift +81 -0
  37. package/Sources/Private/CoreAnimation/Animations/CustomPathAnimation.swift +41 -0
  38. package/Sources/Private/CoreAnimation/Animations/EllipseAnimation.swift +55 -0
  39. package/Sources/Private/CoreAnimation/Animations/GradientAnimations.swift +210 -0
  40. package/Sources/Private/CoreAnimation/Animations/LayerProperty.swift +229 -0
  41. package/Sources/Private/CoreAnimation/Animations/OpacityAnimation.swift +52 -0
  42. package/Sources/Private/CoreAnimation/Animations/RectangleAnimation.swift +58 -0
  43. package/Sources/Private/CoreAnimation/Animations/ShapeAnimation.swift +257 -0
  44. package/Sources/Private/CoreAnimation/Animations/StarAnimation.swift +124 -0
  45. package/Sources/Private/CoreAnimation/Animations/StrokeAnimation.swift +73 -0
  46. package/Sources/Private/CoreAnimation/Animations/TransformAnimations.swift +205 -0
  47. package/Sources/Private/CoreAnimation/Animations/VisibilityAnimation.swift +37 -0
  48. package/Sources/Private/CoreAnimation/CompatibilityTracker.swift +130 -0
  49. package/Sources/Private/CoreAnimation/CoreAnimationLayer.swift +497 -0
  50. package/Sources/Private/CoreAnimation/Extensions/CALayer+fillBounds.swift +35 -0
  51. package/Sources/Private/CoreAnimation/Extensions/KeyframeGroup+exactlyOneKeyframe.swift +37 -0
  52. package/Sources/Private/CoreAnimation/Extensions/Keyframes+combinedIfPossible.swift +154 -0
  53. package/Sources/Private/CoreAnimation/Layers/AnimationLayer.swift +83 -0
  54. package/Sources/Private/CoreAnimation/Layers/BaseAnimationLayer.swift +33 -0
  55. package/Sources/Private/CoreAnimation/Layers/BaseCompositionLayer.swift +88 -0
  56. package/Sources/Private/CoreAnimation/Layers/CALayer+setupLayerHierarchy.swift +167 -0
  57. package/Sources/Private/CoreAnimation/Layers/GradientRenderLayer.swift +94 -0
  58. package/Sources/Private/CoreAnimation/Layers/ImageLayer.swift +79 -0
  59. package/Sources/Private/CoreAnimation/Layers/LayerModel+makeAnimationLayer.swift +64 -0
  60. package/Sources/Private/CoreAnimation/Layers/MaskCompositionLayer.swift +138 -0
  61. package/Sources/Private/CoreAnimation/Layers/PreCompLayer.swift +140 -0
  62. package/Sources/Private/CoreAnimation/Layers/RepeaterLayer.swift +85 -0
  63. package/Sources/Private/CoreAnimation/Layers/ShapeItemLayer.swift +315 -0
  64. package/Sources/Private/CoreAnimation/Layers/ShapeLayer.swift +390 -0
  65. package/Sources/Private/CoreAnimation/Layers/SolidLayer.swift +47 -0
  66. package/Sources/Private/CoreAnimation/Layers/TextLayer.swift +91 -0
  67. package/Sources/Private/CoreAnimation/Layers/TransformLayer.swift +11 -0
  68. package/Sources/Private/CoreAnimation/ValueProviderStore.swift +139 -0
  69. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/CompositionLayer.swift +94 -86
  70. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/ImageCompositionLayer.swift +24 -21
  71. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/MaskContainerLayer.swift +75 -54
  72. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/NullCompositionLayer.swift +5 -5
  73. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/PreCompositionLayer.swift +59 -43
  74. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/ShapeCompositionLayer.swift +22 -20
  75. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/SolidCompositionLayer.swift +26 -17
  76. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/TextCompositionLayer.swift +42 -36
  77. package/{lottie-swift/src/Private/LayerContainers/AnimationContainer.swift → Sources/Private/MainThread/LayerContainers/MainThreadAnimationLayer.swift} +200 -140
  78. package/Sources/Private/MainThread/LayerContainers/Utility/CachedImageProvider.swift +47 -0
  79. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/Utility/CompositionLayersInitializer.swift +33 -24
  80. package/{lottie-swift/src/Private/LayerContainers/Utility/TextLayer.swift → Sources/Private/MainThread/LayerContainers/Utility/CoreTextRenderLayer.swift} +149 -106
  81. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/Utility/InvertedMatteLayer.swift +26 -24
  82. package/Sources/Private/MainThread/LayerContainers/Utility/LayerFontProvider.swift +41 -0
  83. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/Utility/LayerImageProvider.swift +20 -16
  84. package/Sources/Private/MainThread/LayerContainers/Utility/LayerTextProvider.swift +40 -0
  85. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/Utility/LayerTransformNode.swift +82 -67
  86. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Extensions/ItemsExtension.swift +9 -4
  87. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/NodeProperty.swift +29 -21
  88. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/Protocols/AnyNodeProperty.swift +16 -10
  89. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/Protocols/AnyValueContainer.swift +6 -6
  90. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/Protocols/KeypathSearchable.swift +5 -5
  91. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/Protocols/NodePropertyMap.swift +10 -8
  92. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/ValueContainer.swift +25 -21
  93. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/ValueProviders/GroupInterpolator.swift +23 -17
  94. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/ValueProviders/SingleValueProvider.swift +22 -17
  95. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/ModifierNodes/TrimPathNode.swift +110 -79
  96. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/OutputNodes/GroupOutputNode.swift +22 -16
  97. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/OutputNodes/PassThroughOutputNode.swift +19 -15
  98. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/OutputNodes/PathOutputNode.swift +22 -20
  99. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/OutputNodes/Renderables/FillRenderer.swift +22 -23
  100. package/Sources/Private/MainThread/NodeRenderSystem/Nodes/OutputNodes/Renderables/GradientFillRenderer.swift +247 -0
  101. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/OutputNodes/Renderables/GradientStrokeRenderer.swift +30 -24
  102. package/{lottie-swift/src/Private/NodeRenderSystem/Nodes/OutputNodes/Renderables/GradientFillRenderer.swift → Sources/Private/MainThread/NodeRenderSystem/Nodes/OutputNodes/Renderables/LegacyGradientFillRenderer.swift} +93 -66
  103. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/OutputNodes/Renderables/StrokeRenderer.swift +23 -19
  104. package/Sources/Private/MainThread/NodeRenderSystem/Nodes/PathNodes/EllipseNode.swift +139 -0
  105. package/Sources/Private/MainThread/NodeRenderSystem/Nodes/PathNodes/PolygonNode.swift +170 -0
  106. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/PathNodes/RectNode.swift +95 -58
  107. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/PathNodes/ShapeNode.swift +42 -29
  108. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/PathNodes/StarNode.swift +108 -69
  109. package/Sources/Private/MainThread/NodeRenderSystem/Nodes/RenderContainers/GroupNode.swift +155 -0
  110. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/RenderNodes/FillNode.swift +51 -37
  111. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/RenderNodes/GradientFillNode.swift +57 -42
  112. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/RenderNodes/GradientStrokeNode.swift +66 -58
  113. package/Sources/Private/MainThread/NodeRenderSystem/Nodes/RenderNodes/StrokeNode.swift +169 -0
  114. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/Text/TextAnimatorNode.swift +138 -119
  115. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Protocols/AnimatorNode.swift +80 -79
  116. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Protocols/PathNode.swift +5 -3
  117. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Protocols/RenderNode.swift +22 -17
  118. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/RenderLayers/ShapeContainerLayer.swift +27 -24
  119. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/RenderLayers/ShapeRenderLayer.swift +34 -25
  120. package/Sources/Private/Model/Animation.swift +160 -0
  121. package/Sources/Private/Model/Assets/Asset.swift +43 -0
  122. package/{lottie-swift/src → Sources}/Private/Model/Assets/AssetLibrary.swift +40 -13
  123. package/Sources/Private/Model/Assets/ImageAsset.swift +112 -0
  124. package/{lottie-swift/src → Sources}/Private/Model/Assets/PrecompAsset.swift +20 -10
  125. package/Sources/Private/Model/DictionaryInitializable.swift +67 -0
  126. package/Sources/Private/Model/Extensions/Bundle.swift +34 -0
  127. package/{lottie-swift/src → Sources}/Private/Model/Extensions/KeyedDecodingContainerExtensions.swift +8 -4
  128. package/Sources/Private/Model/Keyframes/KeyframeData.swift +113 -0
  129. package/Sources/Private/Model/Keyframes/KeyframeGroup.swift +222 -0
  130. package/{lottie-swift/src → Sources}/Private/Model/Layers/ImageLayerModel.swift +21 -11
  131. package/Sources/Private/Model/Layers/LayerModel.swift +228 -0
  132. package/{lottie-swift/src → Sources}/Private/Model/Layers/PreCompLayerModel.swift +39 -22
  133. package/{lottie-swift/src → Sources}/Private/Model/Layers/ShapeLayerModel.swift +23 -12
  134. package/{lottie-swift/src → Sources}/Private/Model/Layers/SolidLayerModel.swift +31 -19
  135. package/{lottie-swift/src → Sources}/Private/Model/Layers/TextLayerModel.swift +33 -19
  136. package/Sources/Private/Model/Objects/DashPattern.swift +44 -0
  137. package/Sources/Private/Model/Objects/Marker.swift +33 -0
  138. package/Sources/Private/Model/Objects/Mask.swift +80 -0
  139. package/Sources/Private/Model/Objects/Transform.swift +179 -0
  140. package/Sources/Private/Model/ShapeItems/Ellipse.swift +74 -0
  141. package/Sources/Private/Model/ShapeItems/Fill.swift +74 -0
  142. package/Sources/Private/Model/ShapeItems/GradientFill.swift +137 -0
  143. package/Sources/Private/Model/ShapeItems/GradientStroke.swift +185 -0
  144. package/Sources/Private/Model/ShapeItems/Group.swift +48 -0
  145. package/{lottie-swift/src → Sources}/Private/Model/ShapeItems/Merge.swift +29 -12
  146. package/Sources/Private/Model/ShapeItems/Rectangle.swift +72 -0
  147. package/Sources/Private/Model/ShapeItems/Repeater.swift +135 -0
  148. package/Sources/Private/Model/ShapeItems/Shape.swift +56 -0
  149. package/Sources/Private/Model/ShapeItems/ShapeItem.swift +163 -0
  150. package/Sources/Private/Model/ShapeItems/ShapeTransform.swift +135 -0
  151. package/Sources/Private/Model/ShapeItems/Star.swift +131 -0
  152. package/Sources/Private/Model/ShapeItems/Stroke.swift +101 -0
  153. package/Sources/Private/Model/ShapeItems/Trim.swift +77 -0
  154. package/Sources/Private/Model/Text/Font.swift +61 -0
  155. package/{lottie-swift/src → Sources}/Private/Model/Text/Glyph.swift +63 -39
  156. package/Sources/Private/Model/Text/TextAnimator.swift +164 -0
  157. package/Sources/Private/Model/Text/TextDocument.swift +123 -0
  158. package/Sources/Private/RootAnimationLayer.swift +51 -0
  159. package/{lottie-swift/src → Sources}/Private/Utility/Debugging/AnimatorNodeDebugging.swift +7 -7
  160. package/{lottie-swift/src → Sources}/Private/Utility/Debugging/LayerDebugging.swift +72 -48
  161. package/Sources/Private/Utility/Debugging/TestHelpers.swift +10 -0
  162. package/{lottie-swift/src → Sources}/Private/Utility/Extensions/AnimationKeypathExtension.swift +69 -59
  163. package/Sources/Private/Utility/Extensions/BlendMode+Filter.swift +31 -0
  164. package/Sources/Private/Utility/Extensions/CGColor+RGB.swift +22 -0
  165. package/{lottie-swift/src → Sources}/Private/Utility/Extensions/CGFloatExtensions.swift +70 -67
  166. package/Sources/Private/Utility/Extensions/DataExtension.swift +27 -0
  167. package/Sources/Private/Utility/Extensions/MathKit.swift +450 -0
  168. package/Sources/Private/Utility/Extensions/StringExtensions.swift +38 -0
  169. package/{lottie-swift/src → Sources}/Private/Utility/Helpers/AnimationContext.swift +42 -16
  170. package/Sources/Private/Utility/Interpolatable/InterpolatableExtensions.swift +134 -0
  171. package/{lottie-swift/src → Sources}/Private/Utility/Interpolatable/KeyframeExtensions.swift +13 -10
  172. package/Sources/Private/Utility/Interpolatable/KeyframeGroup+Extensions.swift +59 -0
  173. package/{lottie-swift/src/Private/NodeRenderSystem/NodeProperties/ValueProviders → Sources/Private/Utility/Interpolatable}/KeyframeInterpolator.swift +125 -108
  174. package/{lottie-swift/src → Sources}/Private/Utility/Primitives/BezierPath.swift +229 -143
  175. package/Sources/Private/Utility/Primitives/CGPointExtension.swift +35 -0
  176. package/{lottie-swift/src → Sources}/Private/Utility/Primitives/ColorExtension.swift +46 -14
  177. package/{lottie-swift/src → Sources}/Private/Utility/Primitives/CompoundBezierPath.swift +58 -49
  178. package/Sources/Private/Utility/Primitives/CurveVertex.swift +184 -0
  179. package/Sources/Private/Utility/Primitives/PathElement.swift +75 -0
  180. package/Sources/Private/Utility/Primitives/UnitBezier.swift +115 -0
  181. package/Sources/Private/Utility/Primitives/VectorsExtensions.swift +341 -0
  182. package/Sources/Public/Animation/AnimationPublic.swift +266 -0
  183. package/Sources/Public/Animation/AnimationView.swift +1335 -0
  184. package/Sources/Public/Animation/AnimationViewInitializers.swift +109 -0
  185. package/Sources/Public/AnimationCache/AnimationCacheProvider.swift +22 -0
  186. package/{lottie-swift/src → Sources}/Public/AnimationCache/LRUAnimationCache.swift +22 -18
  187. package/Sources/Public/DynamicProperties/AnimationKeypath.swift +49 -0
  188. package/Sources/Public/DynamicProperties/AnyValueProvider.swift +132 -0
  189. package/{lottie-swift/src → Sources}/Public/DynamicProperties/ValueProviders/ColorValueProvider.swift +54 -36
  190. package/{lottie-swift/src → Sources}/Public/DynamicProperties/ValueProviders/FloatValueProvider.swift +40 -36
  191. package/Sources/Public/DynamicProperties/ValueProviders/GradientValueProvider.swift +123 -0
  192. package/{lottie-swift/src → Sources}/Public/DynamicProperties/ValueProviders/PointValueProvider.swift +40 -35
  193. package/{lottie-swift/src → Sources}/Public/DynamicProperties/ValueProviders/SizeValueProvider.swift +40 -35
  194. package/{lottie-swift/src → Sources}/Public/FontProvider/AnimationFontProvider.swift +15 -8
  195. package/Sources/Public/ImageProvider/AnimationImageProvider.swift +21 -0
  196. package/Sources/Public/Keyframes/Interpolatable.swift +253 -0
  197. package/Sources/Public/Keyframes/Keyframe.swift +92 -0
  198. package/Sources/Public/Logging/LottieLogger.swift +137 -0
  199. package/Sources/Public/LottieConfiguration.swift +143 -0
  200. package/{lottie-swift/src → Sources}/Public/Primitives/AnimationTime.swift +1 -1
  201. package/{lottie-swift/src → Sources}/Public/Primitives/Color.swift +10 -6
  202. package/{lottie-swift/src → Sources}/Public/Primitives/Vectors.swift +13 -12
  203. package/Sources/Public/TextProvider/AnimationTextProvider.swift +53 -0
  204. package/{lottie-swift/src → Sources}/Public/iOS/AnimatedButton.swift +42 -26
  205. package/{lottie-swift/src → Sources}/Public/iOS/AnimatedControl.swift +100 -91
  206. package/{lottie-swift/src → Sources}/Public/iOS/AnimatedSwitch.swift +128 -94
  207. package/{lottie-swift/src → Sources}/Public/iOS/AnimationSubview.swift +3 -3
  208. package/Sources/Public/iOS/AnimationViewBase.swift +78 -0
  209. package/{lottie-swift/src → Sources}/Public/iOS/BundleImageProvider.swift +36 -34
  210. package/{lottie-swift/src → Sources}/Public/iOS/Compatibility/CompatibleAnimationKeypath.swift +4 -0
  211. package/{lottie-swift/src → Sources}/Public/iOS/Compatibility/CompatibleAnimationView.swift +38 -29
  212. package/{lottie-swift/src → Sources}/Public/iOS/FilepathImageProvider.swift +24 -21
  213. package/{lottie-swift/src → Sources}/Public/iOS/UIColorExtension.swift +4 -4
  214. package/{lottie-swift/src/Public/MacOS/AnimationSubview.swift → Sources/Public/macOS/AnimationSubview.macOS.swift} +4 -5
  215. package/{lottie-swift/src/Public/MacOS/LottieView.swift → Sources/Public/macOS/AnimationViewBase.macOS.swift} +58 -50
  216. package/{lottie-swift/src/Public/MacOS/BundleImageProvider.swift → Sources/Public/macOS/BundleImageProvider.macOS.swift} +31 -32
  217. package/Sources/Public/macOS/FilepathImageProvider.macOS.swift +67 -0
  218. package/Tests/AnimationKeypathTests.swift +103 -0
  219. package/Tests/AutomaticEngineTests.swift +57 -0
  220. package/Tests/BundleTests.swift +25 -0
  221. package/Tests/DataURLTests.swift +64 -0
  222. package/Tests/ParsingTests.swift +43 -0
  223. package/Tests/PerformanceTests.swift +214 -0
  224. package/Tests/Samples/9squares_AlBoardman.json +1 -0
  225. package/Tests/Samples/Boat_Loader.json +1 -0
  226. package/Tests/Samples/HamburgerArrow.json +1 -0
  227. package/Tests/Samples/IconTransitions.json +1 -0
  228. package/Tests/Samples/Images/dog.png +0 -0
  229. package/Tests/Samples/Issues/issue_1125.json +1 -0
  230. package/Tests/Samples/Issues/issue_1260.json +1 -0
  231. package/Tests/Samples/Issues/issue_1403.json +1 -0
  232. package/Tests/Samples/Issues/issue_1407.json +1 -0
  233. package/Tests/Samples/Issues/issue_1460.json +1 -0
  234. package/Tests/Samples/Issues/issue_1488.json +1 -0
  235. package/Tests/Samples/Issues/issue_1505.json +1 -0
  236. package/Tests/Samples/Issues/issue_1541.json +1 -0
  237. package/Tests/Samples/Issues/issue_1557.json +1 -0
  238. package/Tests/Samples/Issues/issue_1603.json +1 -0
  239. package/Tests/Samples/Issues/issue_1628.json +1 -0
  240. package/Tests/Samples/Issues/issue_1636.json +1 -0
  241. package/Tests/Samples/Issues/issue_1643.json +1 -0
  242. package/Tests/Samples/Issues/issue_1655.json +1 -0
  243. package/Tests/Samples/Issues/issue_1664.json +1 -0
  244. package/Tests/Samples/Issues/issue_1683.json +1 -0
  245. package/Tests/Samples/Issues/issue_1687.json +1 -0
  246. package/Tests/Samples/Issues/issue_1711.json +1 -0
  247. package/Tests/Samples/Issues/issue_1717.json +1 -0
  248. package/Tests/Samples/Issues/issue_769.json +1 -0
  249. package/Tests/Samples/Issues/issue_885.json +1 -0
  250. package/Tests/Samples/Issues/issue_965.json +1 -0
  251. package/Tests/Samples/Issues/pr_1536.json +1 -0
  252. package/Tests/Samples/Issues/pr_1563.json +8439 -0
  253. package/Tests/Samples/Issues/pr_1592.json +5527 -0
  254. package/Tests/Samples/Issues/pr_1599.json +738 -0
  255. package/Tests/Samples/Issues/pr_1604_1.json +1 -0
  256. package/Tests/Samples/Issues/pr_1604_2.json +1 -0
  257. package/Tests/Samples/Issues/pr_1632_1.json +1 -0
  258. package/Tests/Samples/Issues/pr_1632_2.json +1 -0
  259. package/Tests/Samples/Issues/pr_1686.json +513 -0
  260. package/Tests/Samples/Issues/pr_1698.json +1 -0
  261. package/Tests/Samples/Issues/pr_1699.json +1 -0
  262. package/Tests/Samples/LottieFiles/LICENSE.md +14 -0
  263. package/Tests/Samples/LottieFiles/bounce_strokes.json +1 -0
  264. package/Tests/Samples/LottieFiles/cactus.json +1 -0
  265. package/Tests/Samples/LottieFiles/dog_car_ride.json +1 -0
  266. package/Tests/Samples/LottieFiles/draft_icon.json +1 -0
  267. package/Tests/Samples/LottieFiles/fireworks.json +1 -0
  268. package/Tests/Samples/LottieFiles/gradient_1.json +1 -0
  269. package/Tests/Samples/LottieFiles/gradient_2.json +1 -0
  270. package/Tests/Samples/LottieFiles/gradient_pill.json +1 -0
  271. package/Tests/Samples/LottieFiles/gradient_shapes.json +1 -0
  272. package/Tests/Samples/LottieFiles/gradient_square.json +1 -0
  273. package/Tests/Samples/LottieFiles/growth.json +1 -0
  274. package/Tests/Samples/LottieFiles/infinity_loader.json +1 -0
  275. package/Tests/Samples/LottieFiles/loading_dots_1.json +1 -0
  276. package/Tests/Samples/LottieFiles/loading_dots_2.json +1 -0
  277. package/Tests/Samples/LottieFiles/loading_dots_3.json +1 -0
  278. package/Tests/Samples/LottieFiles/loading_gradient_strokes.json +1 -0
  279. package/Tests/Samples/LottieFiles/settings_slider.json +1 -0
  280. package/Tests/Samples/LottieFiles/shop.json +1 -0
  281. package/Tests/Samples/LottieFiles/step_loader.json +1 -0
  282. package/Tests/Samples/LottieLogo1.json +1 -0
  283. package/Tests/Samples/LottieLogo1_masked.json +1 -0
  284. package/Tests/Samples/LottieLogo2.json +1 -0
  285. package/Tests/Samples/MotionCorpse_Jrcanest.json +1 -0
  286. package/Tests/Samples/Nonanimating/BasicLayers.json +1 -0
  287. package/Tests/Samples/Nonanimating/DisableNodesTest.json +1 -0
  288. package/Tests/Samples/Nonanimating/FirstText.json +1 -0
  289. package/Tests/Samples/Nonanimating/GeometryTransformTest.json +1 -0
  290. package/Tests/Samples/Nonanimating/Text_AnimatedProperties.json +1 -0
  291. package/Tests/Samples/Nonanimating/Text_Glyph.json +1 -0
  292. package/Tests/Samples/Nonanimating/Text_NoAnimation.json +1 -0
  293. package/Tests/Samples/Nonanimating/Text_NoGlyph.json +1 -0
  294. package/Tests/Samples/Nonanimating/Zoom.json +1 -0
  295. package/Tests/Samples/Nonanimating/_dog.json +1 -0
  296. package/Tests/Samples/Nonanimating/base64Test.json +1 -0
  297. package/Tests/Samples/Nonanimating/blend_mode_test.json +1 -0
  298. package/Tests/Samples/Nonanimating/keypathTest.json +1 -0
  299. package/Tests/Samples/Nonanimating/verifyLineHeight.json +1 -0
  300. package/Tests/Samples/PinJump.json +1 -0
  301. package/Tests/Samples/Switch.json +1 -0
  302. package/Tests/Samples/Switch_States.json +1 -0
  303. package/Tests/Samples/TwitterHeart.json +1 -0
  304. package/Tests/Samples/TwitterHeartButton.json +1 -0
  305. package/Tests/Samples/TypeFace/A.json +1 -0
  306. package/Tests/Samples/TypeFace/Apostrophe.json +1 -0
  307. package/Tests/Samples/TypeFace/B.json +1 -0
  308. package/Tests/Samples/TypeFace/BlinkingCursor.json +1 -0
  309. package/Tests/Samples/TypeFace/C.json +1 -0
  310. package/Tests/Samples/TypeFace/Colon.json +1 -0
  311. package/Tests/Samples/TypeFace/Comma.json +1 -0
  312. package/Tests/Samples/TypeFace/D.json +1 -0
  313. package/Tests/Samples/TypeFace/E.json +1 -0
  314. package/Tests/Samples/TypeFace/F.json +1 -0
  315. package/Tests/Samples/TypeFace/G.json +1 -0
  316. package/Tests/Samples/TypeFace/H.json +1 -0
  317. package/Tests/Samples/TypeFace/I.json +1 -0
  318. package/Tests/Samples/TypeFace/J.json +1 -0
  319. package/Tests/Samples/TypeFace/K.json +1 -0
  320. package/Tests/Samples/TypeFace/L.json +1 -0
  321. package/Tests/Samples/TypeFace/M.json +1 -0
  322. package/Tests/Samples/TypeFace/N.json +1 -0
  323. package/Tests/Samples/TypeFace/O.json +1 -0
  324. package/Tests/Samples/TypeFace/P.json +1 -0
  325. package/Tests/Samples/TypeFace/Q.json +1 -0
  326. package/Tests/Samples/TypeFace/R.json +1 -0
  327. package/Tests/Samples/TypeFace/S.json +1 -0
  328. package/Tests/Samples/TypeFace/T.json +1 -0
  329. package/Tests/Samples/TypeFace/U.json +1 -0
  330. package/Tests/Samples/TypeFace/V.json +1 -0
  331. package/Tests/Samples/TypeFace/W.json +1 -0
  332. package/Tests/Samples/TypeFace/X.json +1 -0
  333. package/Tests/Samples/TypeFace/Y.json +1 -0
  334. package/Tests/Samples/TypeFace/Z.json +1 -0
  335. package/Tests/Samples/Watermelon.json +1 -0
  336. package/Tests/Samples/setValueTest.json +1 -0
  337. package/Tests/Samples/timeremap.json +1 -0
  338. package/Tests/Samples/vcTransition1.json +1 -0
  339. package/Tests/Samples/vcTransition2.json +1 -0
  340. package/Tests/SnapshotConfiguration.swift +158 -0
  341. package/Tests/SnapshotTests.swift +265 -0
  342. package/Tests/Utils/Bundle+Module.swift +30 -0
  343. package/Tests/Utils/HardcodedFontProvider.swift +19 -0
  344. package/Tests/Utils/HardcodedImageProvider.swift +23 -0
  345. package/Tests/Utils/Snapshotting+presentationLayer.swift +47 -0
  346. package/Tests/ValueProvidersTests.swift +27 -0
  347. package/lottie-ios.podspec +12 -12
  348. package/package.json +1 -1
  349. package/script/test-carthage/Cartfile +1 -0
  350. package/script/test-carthage/Cartfile.resolved +1 -0
  351. package/script/test-carthage/CarthageTest/AppDelegate.swift +26 -0
  352. package/script/test-carthage/CarthageTest/Assets.xcassets/AccentColor.colorset/Contents.json +11 -0
  353. package/script/test-carthage/CarthageTest/Assets.xcassets/AppIcon.appiconset/Contents.json +98 -0
  354. package/script/test-carthage/CarthageTest/Assets.xcassets/Contents.json +6 -0
  355. package/script/test-carthage/CarthageTest/Base.lproj/LaunchScreen.storyboard +25 -0
  356. package/script/test-carthage/CarthageTest/Base.lproj/Main.storyboard +24 -0
  357. package/script/test-carthage/CarthageTest/Info.plist +66 -0
  358. package/script/test-carthage/CarthageTest/SceneDelegate.swift +10 -0
  359. package/script/test-carthage/CarthageTest/ViewController.swift +15 -0
  360. package/script/test-carthage/CarthageTest-macOS/AppDelegate.swift +7 -0
  361. package/script/test-carthage/CarthageTest-macOS/Assets.xcassets/AccentColor.colorset/Contents.json +11 -0
  362. package/script/test-carthage/CarthageTest-macOS/Assets.xcassets/AppIcon.appiconset/Contents.json +58 -0
  363. package/script/test-carthage/CarthageTest-macOS/Assets.xcassets/Contents.json +6 -0
  364. package/script/test-carthage/CarthageTest-macOS/Base.lproj/Main.storyboard +717 -0
  365. package/script/test-carthage/CarthageTest-macOS/CarthageTest_macOS.entitlements +10 -0
  366. package/script/test-carthage/CarthageTest-macOS/ViewController.swift +15 -0
  367. package/script/test-carthage/CarthageTest.xcodeproj/project.pbxproj +532 -0
  368. package/script/test-carthage/CarthageTest.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
  369. package/script/test-carthage/CarthageTest.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
  370. package/script/test-carthage/CarthageTest.xcodeproj/project.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  371. package/script/test-carthage/CarthageTest.xcodeproj/project.xcworkspace/xcuserdata/calstephens.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  372. package/script/test-carthage/CarthageTest.xcodeproj/xcuserdata/cal.xcuserdatad/xcschemes/xcschememanagement.plist +14 -0
  373. package/script/test-carthage/CarthageTest.xcodeproj/xcuserdata/calstephens.xcuserdatad/xcschemes/xcschememanagement.plist +19 -0
  374. package/script/test-carthage/Mintfile +1 -0
  375. package/script/test-spm/LottieSPM.xcworkspace/contents.xcworkspacedata +7 -0
  376. package/script/test-spm/LottieSPM.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  377. package/script/test-spm/Mintfile +1 -0
  378. package/.swiftpm/xcode/package.xcworkspace/xcuserdata/brandonwithrow.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  379. package/Lottie/Info.plist +0 -22
  380. package/Lottie.xcodeproj/project.xcworkspace/xcuserdata/brandonwithrow.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  381. package/Lottie.xcodeproj/xcuserdata/brandonwithrow.xcuserdatad/xcschemes/LottieLibraryMacOS.xcscheme +0 -80
  382. package/Lottie.xcodeproj/xcuserdata/brandonwithrow.xcuserdatad/xcschemes/xcschememanagement.plist +0 -57
  383. package/lottie-swift/Assets/.gitkeep +0 -0
  384. package/lottie-swift/src/Private/LayerContainers/Utility/LayerFontProvider.swift +0 -37
  385. package/lottie-swift/src/Private/LayerContainers/Utility/LayerTextProvider.swift +0 -36
  386. package/lottie-swift/src/Private/Model/Animation.swift +0 -107
  387. package/lottie-swift/src/Private/Model/Assets/Asset.swift +0 -27
  388. package/lottie-swift/src/Private/Model/Assets/ImageAsset.swift +0 -48
  389. package/lottie-swift/src/Private/Model/Keyframes/Keyframe.swift +0 -128
  390. package/lottie-swift/src/Private/Model/Keyframes/KeyframeGroup.swift +0 -108
  391. package/lottie-swift/src/Private/Model/Layers/LayerModel.swift +0 -150
  392. package/lottie-swift/src/Private/Model/Objects/DashPattern.swift +0 -24
  393. package/lottie-swift/src/Private/Model/Objects/Marker.swift +0 -23
  394. package/lottie-swift/src/Private/Model/Objects/Mask.swift +0 -48
  395. package/lottie-swift/src/Private/Model/Objects/Transform.swift +0 -105
  396. package/lottie-swift/src/Private/Model/ShapeItems/Ellipse.swift +0 -50
  397. package/lottie-swift/src/Private/Model/ShapeItems/FillI.swift +0 -49
  398. package/lottie-swift/src/Private/Model/ShapeItems/GradientFill.swift +0 -86
  399. package/lottie-swift/src/Private/Model/ShapeItems/GradientStroke.swift +0 -125
  400. package/lottie-swift/src/Private/Model/ShapeItems/Group.swift +0 -32
  401. package/lottie-swift/src/Private/Model/ShapeItems/Rectangle.swift +0 -50
  402. package/lottie-swift/src/Private/Model/ShapeItems/Repeater.swift +0 -80
  403. package/lottie-swift/src/Private/Model/ShapeItems/Shape.swift +0 -37
  404. package/lottie-swift/src/Private/Model/ShapeItems/ShapeItem.swift +0 -95
  405. package/lottie-swift/src/Private/Model/ShapeItems/ShapeTransform.swift +0 -68
  406. package/lottie-swift/src/Private/Model/ShapeItems/Star.swift +0 -86
  407. package/lottie-swift/src/Private/Model/ShapeItems/Stroke.swift +0 -67
  408. package/lottie-swift/src/Private/Model/ShapeItems/Trim.swift +0 -53
  409. package/lottie-swift/src/Private/Model/Text/Font.swift +0 -35
  410. package/lottie-swift/src/Private/Model/Text/TextAnimator.swift +0 -99
  411. package/lottie-swift/src/Private/Model/Text/TextDocument.swift +0 -70
  412. package/lottie-swift/src/Private/NodeRenderSystem/Nodes/PathNodes/EllipseNode.swift +0 -109
  413. package/lottie-swift/src/Private/NodeRenderSystem/Nodes/PathNodes/PolygonNode.swift +0 -132
  414. package/lottie-swift/src/Private/NodeRenderSystem/Nodes/RenderContainers/GroupNode.swift +0 -141
  415. package/lottie-swift/src/Private/NodeRenderSystem/Nodes/RenderNodes/StrokeNode.swift +0 -127
  416. package/lottie-swift/src/Private/Utility/Extensions/MathKit.swift +0 -539
  417. package/lottie-swift/src/Private/Utility/Extensions/StringExtensions.swift +0 -32
  418. package/lottie-swift/src/Private/Utility/Interpolatable/Interpolatable.swift +0 -18
  419. package/lottie-swift/src/Private/Utility/Interpolatable/InterpolatableExtensions.swift +0 -170
  420. package/lottie-swift/src/Private/Utility/Primitives/CurveVertex.swift +0 -177
  421. package/lottie-swift/src/Private/Utility/Primitives/PathElement.swift +0 -68
  422. package/lottie-swift/src/Private/Utility/Primitives/VectorsExtensions.swift +0 -218
  423. package/lottie-swift/src/Public/Animation/AnimationPublic.swift +0 -196
  424. package/lottie-swift/src/Public/Animation/AnimationView.swift +0 -1006
  425. package/lottie-swift/src/Public/Animation/AnimationViewInitializers.swift +0 -83
  426. package/lottie-swift/src/Public/AnimationCache/AnimationCacheProvider.swift +0 -24
  427. package/lottie-swift/src/Public/DynamicProperties/AnimationKeypath.swift +0 -46
  428. package/lottie-swift/src/Public/DynamicProperties/AnyValueProvider.swift +0 -29
  429. package/lottie-swift/src/Public/DynamicProperties/ValueProviders/GradientValueProvider.swift +0 -114
  430. package/lottie-swift/src/Public/ImageProvider/AnimationImageProvider.swift +0 -23
  431. package/lottie-swift/src/Public/MacOS/FilepathImageProvider.swift +0 -67
  432. package/lottie-swift/src/Public/TextProvider/AnimationTextProvider.swift +0 -39
  433. package/lottie-swift/src/Public/iOS/LottieView.swift +0 -62
  434. package/lottie-swift-testing.podspec +0 -32
@@ -8,43 +8,49 @@
8
8
  import Foundation
9
9
  import QuartzCore
10
10
 
11
+ // MARK: - StarNodeProperties
12
+
11
13
  final class StarNodeProperties: NodePropertyMap, KeypathSearchable {
12
-
13
- var keypathName: String
14
-
14
+
15
+ // MARK: Lifecycle
16
+
15
17
  init(star: Star) {
16
- self.keypathName = star.name
17
- self.direction = star.direction
18
- self.position = NodeProperty(provider: KeyframeInterpolator(keyframes: star.position.keyframes))
19
- self.outerRadius = NodeProperty(provider: KeyframeInterpolator(keyframes: star.outerRadius.keyframes))
20
- self.outerRoundedness = NodeProperty(provider: KeyframeInterpolator(keyframes: star.outerRoundness.keyframes))
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))
21
23
  if let innerRadiusKeyframes = star.innerRadius?.keyframes {
22
- self.innerRadius = NodeProperty(provider: KeyframeInterpolator(keyframes: innerRadiusKeyframes))
24
+ innerRadius = NodeProperty(provider: KeyframeInterpolator(keyframes: innerRadiusKeyframes))
23
25
  } else {
24
- self.innerRadius = NodeProperty(provider: SingleValueProvider(Vector1D(0)))
26
+ innerRadius = NodeProperty(provider: SingleValueProvider(Vector1D(0)))
25
27
  }
26
28
  if let innderRoundedness = star.innerRoundness?.keyframes {
27
- self.innerRoundedness = NodeProperty(provider: KeyframeInterpolator(keyframes: innderRoundedness))
29
+ innerRoundedness = NodeProperty(provider: KeyframeInterpolator(keyframes: innderRoundedness))
28
30
  } else {
29
- self.innerRoundedness = NodeProperty(provider: SingleValueProvider(Vector1D(0)))
31
+ innerRoundedness = NodeProperty(provider: SingleValueProvider(Vector1D(0)))
30
32
  }
31
- self.rotation = NodeProperty(provider: KeyframeInterpolator(keyframes: star.rotation.keyframes))
32
- self.points = NodeProperty(provider: KeyframeInterpolator(keyframes: star.points.keyframes))
33
- self.keypathProperties = [
33
+ rotation = NodeProperty(provider: KeyframeInterpolator(keyframes: star.rotation.keyframes))
34
+ points = NodeProperty(provider: KeyframeInterpolator(keyframes: star.points.keyframes))
35
+ keypathProperties = [
34
36
  "Position" : position,
35
37
  "Outer Radius" : outerRadius,
36
38
  "Outer Roundedness" : outerRoundedness,
37
39
  "Inner Radius" : innerRadius,
38
40
  "Inner Roundedness" : innerRoundedness,
39
41
  "Rotation" : rotation,
40
- "Points" : points
42
+ "Points" : points,
41
43
  ]
42
- self.properties = Array(keypathProperties.values)
44
+ properties = Array(keypathProperties.values)
43
45
  }
44
-
45
- let keypathProperties: [String : AnyNodeProperty]
46
+
47
+ // MARK: Internal
48
+
49
+ var keypathName: String
50
+
51
+ let keypathProperties: [String: AnyNodeProperty]
46
52
  let properties: [AnyNodeProperty]
47
-
53
+
48
54
  let direction: PathDirection
49
55
  let position: NodeProperty<Vector3D>
50
56
  let outerRadius: NodeProperty<Vector1D>
@@ -55,52 +61,81 @@ final class StarNodeProperties: NodePropertyMap, KeypathSearchable {
55
61
  let points: NodeProperty<Vector1D>
56
62
  }
57
63
 
64
+ // MARK: - StarNode
65
+
58
66
  final class StarNode: AnimatorNode, PathNode {
59
-
60
- let properties: StarNodeProperties
61
67
 
62
- let pathOutput: PathOutputNode
68
+ // MARK: Lifecycle
63
69
 
64
70
  init(parentNode: AnimatorNode?, star: Star) {
65
- self.pathOutput = PathOutputNode(parent: parentNode?.outputNode)
66
- self.properties = StarNodeProperties(star: star)
71
+ pathOutput = PathOutputNode(parent: parentNode?.outputNode)
72
+ properties = StarNodeProperties(star: star)
67
73
  self.parentNode = parentNode
68
74
  }
69
-
75
+
76
+ // MARK: Internal
77
+
78
+ /// Magic number needed for building path data
79
+ static let PolystarConstant: CGFloat = 0.47829
80
+
81
+ let properties: StarNodeProperties
82
+
83
+ let pathOutput: PathOutputNode
84
+
85
+ let parentNode: AnimatorNode?
86
+ var hasLocalUpdates = false
87
+ var hasUpstreamUpdates = false
88
+ var lastUpdateFrame: CGFloat? = nil
89
+
70
90
  // MARK: Animator Node
71
91
  var propertyMap: NodePropertyMap & KeypathSearchable {
72
- return properties
92
+ properties
73
93
  }
74
-
75
- let parentNode: AnimatorNode?
76
- var hasLocalUpdates: Bool = false
77
- var hasUpstreamUpdates: Bool = false
78
- var lastUpdateFrame: CGFloat? = nil
79
- var isEnabled: Bool = true {
80
- didSet{
81
- self.pathOutput.isEnabled = self.isEnabled
94
+
95
+ var isEnabled = true {
96
+ didSet {
97
+ pathOutput.isEnabled = isEnabled
82
98
  }
83
99
  }
84
-
85
- /// Magic number needed for building path data
86
- static let PolystarConstant: CGFloat = 0.47829
87
-
100
+
88
101
  func rebuildOutputs(frame: CGFloat) {
89
- let outerRadius = properties.outerRadius.value.cgFloatValue
90
- let innerRadius = properties.innerRadius.value.cgFloatValue
91
- let outerRoundedness = properties.outerRoundedness.value.cgFloatValue * 0.01
92
- let innerRoundedness = properties.innerRoundedness.value.cgFloatValue * 0.01
93
- let numberOfPoints = properties.points.value.cgFloatValue
94
- let rotation = properties.rotation.value.cgFloatValue
95
- let position = properties.position.value.pointValue
96
-
102
+ let path = BezierPath.star(
103
+ position: properties.position.value.pointValue,
104
+ outerRadius: properties.outerRadius.value.cgFloatValue,
105
+ innerRadius: properties.innerRadius.value.cgFloatValue,
106
+ outerRoundedness: properties.outerRoundedness.value.cgFloatValue,
107
+ innerRoundedness: properties.innerRoundedness.value.cgFloatValue,
108
+ numberOfPoints: properties.points.value.cgFloatValue,
109
+ rotation: properties.rotation.value.cgFloatValue,
110
+ direction: properties.direction)
111
+
112
+ pathOutput.setPath(path, updateFrame: frame)
113
+ }
114
+
115
+ }
116
+
117
+ extension BezierPath {
118
+ /// Constructs a `BezierPath` in the shape of a star
119
+ static func star(
120
+ position: CGPoint,
121
+ outerRadius: CGFloat,
122
+ innerRadius: CGFloat,
123
+ outerRoundedness inoutOuterRoundedness: CGFloat,
124
+ innerRoundedness inputInnerRoundedness: CGFloat,
125
+ numberOfPoints: CGFloat,
126
+ rotation: CGFloat,
127
+ direction: PathDirection)
128
+ -> BezierPath
129
+ {
97
130
  var currentAngle = (rotation - 90).toRadians()
98
131
  let anglePerPoint = (2 * CGFloat.pi) / numberOfPoints
99
132
  let halfAnglePerPoint = anglePerPoint / 2.0
100
133
  let partialPointAmount = numberOfPoints - floor(numberOfPoints)
101
-
134
+ let outerRoundedness = inoutOuterRoundedness * 0.01
135
+ let innerRoundedness = inputInnerRoundedness * 0.01
136
+
102
137
  var point: CGPoint = .zero
103
-
138
+
104
139
  var partialPointRadius: CGFloat = 0
105
140
  if partialPointAmount != 0 {
106
141
  currentAngle += halfAnglePerPoint * (1 - partialPointAmount)
@@ -113,46 +148,48 @@ final class StarNode: AnimatorNode, PathNode {
113
148
  point.y = (outerRadius * sin(currentAngle))
114
149
  currentAngle += halfAnglePerPoint
115
150
  }
116
-
151
+
117
152
  var vertices = [CurveVertex]()
118
153
  vertices.append(CurveVertex(point: point + position, inTangentRelative: .zero, outTangentRelative: .zero))
119
-
154
+
120
155
  var previousPoint = point
121
156
  var longSegment = false
122
- let numPoints: Int = Int(ceil(numberOfPoints) * 2)
157
+ let numPoints = Int(ceil(numberOfPoints) * 2)
123
158
  for i in 0..<numPoints {
124
159
  var radius = longSegment ? outerRadius : innerRadius
125
160
  var dTheta = halfAnglePerPoint
126
- if partialPointRadius != 0 && i == numPoints - 2 {
161
+ if partialPointRadius != 0, i == numPoints - 2 {
127
162
  dTheta = anglePerPoint * partialPointAmount / 2
128
163
  }
129
- if partialPointRadius != 0 && i == numPoints - 1 {
164
+ if partialPointRadius != 0, i == numPoints - 1 {
130
165
  radius = partialPointRadius
131
166
  }
132
167
  previousPoint = point
133
168
  point.x = (radius * cos(currentAngle))
134
169
  point.y = (radius * sin(currentAngle))
135
-
136
- if innerRoundedness == 0 && outerRoundedness == 0 {
170
+
171
+ if innerRoundedness == 0, outerRoundedness == 0 {
137
172
  vertices.append(CurveVertex(point: point + position, inTangentRelative: .zero, outTangentRelative: .zero))
138
173
  } else {
139
174
  let cp1Theta = (atan2(previousPoint.y, previousPoint.x) - CGFloat.pi / 2)
140
175
  let cp1Dx = cos(cp1Theta)
141
176
  let cp1Dy = sin(cp1Theta)
142
-
177
+
143
178
  let cp2Theta = (atan2(point.y, point.x) - CGFloat.pi / 2)
144
179
  let cp2Dx = cos(cp2Theta)
145
180
  let cp2Dy = sin(cp2Theta)
146
-
181
+
147
182
  let cp1Roundedness = longSegment ? innerRoundedness : outerRoundedness
148
183
  let cp2Roundedness = longSegment ? outerRoundedness : innerRoundedness
149
184
  let cp1Radius = longSegment ? innerRadius : outerRadius
150
185
  let cp2Radius = longSegment ? outerRadius : innerRadius
151
-
152
- var cp1 = CGPoint(x: cp1Radius * cp1Roundedness * StarNode.PolystarConstant * cp1Dx,
153
- y: cp1Radius * cp1Roundedness * StarNode.PolystarConstant * cp1Dy)
154
- var cp2 = CGPoint(x: cp2Radius * cp2Roundedness * StarNode.PolystarConstant * cp2Dx,
155
- y: cp2Radius * cp2Roundedness * StarNode.PolystarConstant * cp2Dy)
186
+
187
+ var cp1 = CGPoint(
188
+ x: cp1Radius * cp1Roundedness * StarNode.PolystarConstant * cp1Dx,
189
+ y: cp1Radius * cp1Roundedness * StarNode.PolystarConstant * cp1Dy)
190
+ var cp2 = CGPoint(
191
+ x: cp2Radius * cp2Roundedness * StarNode.PolystarConstant * cp2Dx,
192
+ y: cp2Radius * cp2Roundedness * StarNode.PolystarConstant * cp2Dy)
156
193
  if partialPointAmount != 0 {
157
194
  if i == 0 {
158
195
  cp1 = cp1 * partialPointAmount
@@ -160,15 +197,18 @@ final class StarNode: AnimatorNode, PathNode {
160
197
  cp2 = cp2 * partialPointAmount
161
198
  }
162
199
  }
163
- let previousVertex = vertices[vertices.endIndex-1]
164
- vertices[vertices.endIndex-1] = CurveVertex(previousVertex.inTangent, previousVertex.point, previousVertex.point - cp1 + position)
200
+ let previousVertex = vertices[vertices.endIndex - 1]
201
+ vertices[vertices.endIndex - 1] = CurveVertex(
202
+ previousVertex.inTangent,
203
+ previousVertex.point,
204
+ previousVertex.point - cp1)
165
205
  vertices.append(CurveVertex(point: point + position, inTangentRelative: cp2, outTangentRelative: .zero))
166
206
  }
167
207
  currentAngle += dTheta
168
208
  longSegment = !longSegment
169
209
  }
170
-
171
- let reverse = properties.direction == .counterClockwise
210
+
211
+ let reverse = direction == .counterClockwise
172
212
  if reverse {
173
213
  vertices = vertices.reversed()
174
214
  }
@@ -177,7 +217,6 @@ final class StarNode: AnimatorNode, PathNode {
177
217
  path.addVertex(reverse ? vertex.reversed() : vertex)
178
218
  }
179
219
  path.close()
180
- pathOutput.setPath(path, updateFrame: frame)
220
+ return path
181
221
  }
182
-
183
222
  }
@@ -0,0 +1,155 @@
1
+ //
2
+ // GroupNode.swift
3
+ // lottie-swift
4
+ //
5
+ // Created by Brandon Withrow on 1/18/19.
6
+ //
7
+
8
+ import CoreGraphics
9
+ import Foundation
10
+ import QuartzCore
11
+
12
+ // MARK: - GroupNodeProperties
13
+
14
+ final class GroupNodeProperties: NodePropertyMap, KeypathSearchable {
15
+
16
+ // MARK: Lifecycle
17
+
18
+ init(transform: ShapeTransform?) {
19
+ if let transform = transform {
20
+ anchor = NodeProperty(provider: KeyframeInterpolator(keyframes: transform.anchor.keyframes))
21
+ position = NodeProperty(provider: KeyframeInterpolator(keyframes: transform.position.keyframes))
22
+ scale = NodeProperty(provider: KeyframeInterpolator(keyframes: transform.scale.keyframes))
23
+ rotation = NodeProperty(provider: KeyframeInterpolator(keyframes: transform.rotation.keyframes))
24
+ opacity = NodeProperty(provider: KeyframeInterpolator(keyframes: transform.opacity.keyframes))
25
+ skew = NodeProperty(provider: KeyframeInterpolator(keyframes: transform.skew.keyframes))
26
+ skewAxis = NodeProperty(provider: KeyframeInterpolator(keyframes: transform.skewAxis.keyframes))
27
+ } else {
28
+ /// Transform node missing. Default to empty transform.
29
+ anchor = NodeProperty(provider: SingleValueProvider(Vector3D(x: CGFloat(0), y: CGFloat(0), z: CGFloat(0))))
30
+ position = NodeProperty(provider: SingleValueProvider(Vector3D(x: CGFloat(0), y: CGFloat(0), z: CGFloat(0))))
31
+ scale = NodeProperty(provider: SingleValueProvider(Vector3D(x: CGFloat(100), y: CGFloat(100), z: CGFloat(100))))
32
+ rotation = NodeProperty(provider: SingleValueProvider(Vector1D(0)))
33
+ opacity = NodeProperty(provider: SingleValueProvider(Vector1D(100)))
34
+ skew = NodeProperty(provider: SingleValueProvider(Vector1D(0)))
35
+ skewAxis = NodeProperty(provider: SingleValueProvider(Vector1D(0)))
36
+ }
37
+ keypathProperties = [
38
+ "Anchor Point" : anchor,
39
+ "Position" : position,
40
+ "Scale" : scale,
41
+ "Rotation" : rotation,
42
+ "Opacity" : opacity,
43
+ "Skew" : skew,
44
+ "Skew Axis" : skewAxis,
45
+ ]
46
+ properties = Array(keypathProperties.values)
47
+ }
48
+
49
+ // MARK: Internal
50
+
51
+ var keypathName = "Transform"
52
+
53
+ var childKeypaths: [KeypathSearchable] = []
54
+
55
+ let keypathProperties: [String: AnyNodeProperty]
56
+ let properties: [AnyNodeProperty]
57
+
58
+ let anchor: NodeProperty<Vector3D>
59
+ let position: NodeProperty<Vector3D>
60
+ let scale: NodeProperty<Vector3D>
61
+ let rotation: NodeProperty<Vector1D>
62
+ let opacity: NodeProperty<Vector1D>
63
+ let skew: NodeProperty<Vector1D>
64
+ let skewAxis: NodeProperty<Vector1D>
65
+
66
+ var caTransform: CATransform3D {
67
+ CATransform3D.makeTransform(
68
+ anchor: anchor.value.pointValue,
69
+ position: position.value.pointValue,
70
+ scale: scale.value.sizeValue,
71
+ rotation: rotation.value.cgFloatValue,
72
+ skew: skew.value.cgFloatValue,
73
+ skewAxis: skewAxis.value.cgFloatValue)
74
+ }
75
+ }
76
+
77
+ // MARK: - GroupNode
78
+
79
+ final class GroupNode: AnimatorNode {
80
+
81
+ // MARK: Lifecycle
82
+
83
+ // MARK: Initializer
84
+ init(name: String, parentNode: AnimatorNode?, tree: NodeTree) {
85
+ self.parentNode = parentNode
86
+ keypathName = name
87
+ rootNode = tree.rootNode
88
+ properties = GroupNodeProperties(transform: tree.transform)
89
+ groupOutput = GroupOutputNode(parent: parentNode?.outputNode, rootNode: rootNode?.outputNode)
90
+ var childKeypaths: [KeypathSearchable] = tree.childrenNodes
91
+ childKeypaths.append(properties)
92
+ self.childKeypaths = childKeypaths
93
+
94
+ for childContainer in tree.renderContainers {
95
+ container.insertRenderLayer(childContainer)
96
+ }
97
+ }
98
+
99
+ // MARK: Internal
100
+
101
+ // MARK: Properties
102
+ let groupOutput: GroupOutputNode
103
+
104
+ let properties: GroupNodeProperties
105
+
106
+ let rootNode: AnimatorNode?
107
+
108
+ var container = ShapeContainerLayer()
109
+
110
+ // MARK: Keypath Searchable
111
+
112
+ let keypathName: String
113
+
114
+ let childKeypaths: [KeypathSearchable]
115
+
116
+ let parentNode: AnimatorNode?
117
+ var hasLocalUpdates = false
118
+ var hasUpstreamUpdates = false
119
+ var lastUpdateFrame: CGFloat? = nil
120
+
121
+ var keypathLayer: CALayer? {
122
+ container
123
+ }
124
+
125
+ // MARK: Animator Node Protocol
126
+
127
+ var propertyMap: NodePropertyMap & KeypathSearchable {
128
+ properties
129
+ }
130
+
131
+ var outputNode: NodeOutput {
132
+ groupOutput
133
+ }
134
+
135
+ var isEnabled = true {
136
+ didSet {
137
+ container.isHidden = !isEnabled
138
+ }
139
+ }
140
+
141
+ func performAdditionalLocalUpdates(frame: CGFloat, forceLocalUpdate: Bool) -> Bool {
142
+ rootNode?.updateContents(frame, forceLocalUpdate: forceLocalUpdate) ?? false
143
+ }
144
+
145
+ func performAdditionalOutputUpdates(_ frame: CGFloat, forceOutputUpdate: Bool) {
146
+ rootNode?.updateOutputs(frame, forceOutputUpdate: forceOutputUpdate)
147
+ }
148
+
149
+ func rebuildOutputs(frame: CGFloat) {
150
+ container.opacity = Float(properties.opacity.value.cgFloatValue) * 0.01
151
+ container.transform = properties.caTransform
152
+ groupOutput.setTransform(container.transform, forFrame: frame)
153
+ }
154
+
155
+ }
@@ -5,70 +5,84 @@
5
5
  // Created by Brandon Withrow on 1/17/19.
6
6
  //
7
7
 
8
- import Foundation
9
8
  import CoreGraphics
9
+ import Foundation
10
+
11
+ // MARK: - FillNodeProperties
10
12
 
11
13
  final class FillNodeProperties: NodePropertyMap, KeypathSearchable {
12
-
13
- var keypathName: String
14
-
14
+
15
+ // MARK: Lifecycle
16
+
15
17
  init(fill: Fill) {
16
- self.keypathName = fill.name
17
- self.color = NodeProperty(provider: KeyframeInterpolator(keyframes: fill.color.keyframes))
18
- self.opacity = NodeProperty(provider: KeyframeInterpolator(keyframes: fill.opacity.keyframes))
19
- self.type = fill.fillRule
20
- self.keypathProperties = [
18
+ keypathName = fill.name
19
+ color = NodeProperty(provider: KeyframeInterpolator(keyframes: fill.color.keyframes))
20
+ opacity = NodeProperty(provider: KeyframeInterpolator(keyframes: fill.opacity.keyframes))
21
+ type = fill.fillRule
22
+ keypathProperties = [
21
23
  "Opacity" : opacity,
22
- "Color" : color
24
+ PropertyName.color.rawValue : color,
23
25
  ]
24
- self.properties = Array(keypathProperties.values)
26
+ properties = Array(keypathProperties.values)
25
27
  }
26
-
28
+
29
+ // MARK: Internal
30
+
31
+ var keypathName: String
32
+
27
33
  let opacity: NodeProperty<Vector1D>
28
34
  let color: NodeProperty<Color>
29
35
  let type: FillRule
30
-
31
- let keypathProperties: [String : AnyNodeProperty]
36
+
37
+ let keypathProperties: [String: AnyNodeProperty]
32
38
  let properties: [AnyNodeProperty]
33
-
39
+
34
40
  }
35
41
 
42
+ // MARK: - FillNode
43
+
36
44
  final class FillNode: AnimatorNode, RenderNode {
37
-
38
- let fillRender: FillRenderer
39
- var renderer: NodeOutput & Renderable {
40
- return fillRender
41
- }
42
-
43
- let fillProperties: FillNodeProperties
45
+
46
+ // MARK: Lifecycle
44
47
 
45
48
  init(parentNode: AnimatorNode?, fill: Fill) {
46
- self.fillRender = FillRenderer(parent: parentNode?.outputNode)
47
- self.fillProperties = FillNodeProperties(fill: fill)
49
+ fillRender = FillRenderer(parent: parentNode?.outputNode)
50
+ fillProperties = FillNodeProperties(fill: fill)
48
51
  self.parentNode = parentNode
49
52
  }
50
-
53
+
54
+ // MARK: Internal
55
+
56
+ let fillRender: FillRenderer
57
+
58
+ let fillProperties: FillNodeProperties
59
+
60
+ let parentNode: AnimatorNode?
61
+ var hasLocalUpdates = false
62
+ var hasUpstreamUpdates = false
63
+ var lastUpdateFrame: CGFloat? = nil
64
+
65
+ var renderer: NodeOutput & Renderable {
66
+ fillRender
67
+ }
68
+
51
69
  // MARK: Animator Node Protocol
52
-
70
+
53
71
  var propertyMap: NodePropertyMap & KeypathSearchable {
54
- return fillProperties
72
+ fillProperties
55
73
  }
56
-
57
- let parentNode: AnimatorNode?
58
- var hasLocalUpdates: Bool = false
59
- var hasUpstreamUpdates: Bool = false
60
- var lastUpdateFrame: CGFloat? = nil
61
- var isEnabled: Bool = true {
74
+
75
+ var isEnabled = true {
62
76
  didSet {
63
77
  fillRender.isEnabled = isEnabled
64
78
  }
65
79
  }
66
-
80
+
67
81
  func localUpdatesPermeateDownstream() -> Bool {
68
- return false
82
+ false
69
83
  }
70
-
71
- func rebuildOutputs(frame: CGFloat) {
84
+
85
+ func rebuildOutputs(frame _: CGFloat) {
72
86
  fillRender.color = fillProperties.color.value.cgColorValue
73
87
  fillRender.opacity = fillProperties.opacity.value.cgFloatValue * 0.01
74
88
  fillRender.fillRule = fillProperties.type