lottie-ios 3.2.3 → 3.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (434) hide show
  1. package/.github/actions/setup/action.yml +32 -0
  2. package/.github/issue_template.md +6 -23
  3. package/.github/workflows/main.yml +98 -0
  4. package/.github/workflows/stale_issues.yml +17 -0
  5. package/.spi.yml +6 -0
  6. package/.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata +7 -0
  7. package/.swiftpm/xcode/package.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  8. package/.swiftpm/xcode/package.xcworkspace/xcuserdata/calstephens.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  9. package/.swiftpm/xcode/xcuserdata/{brandonwithrow.xcuserdatad → cal.xcuserdatad}/xcschemes/xcschememanagement.plist +25 -15
  10. package/.swiftpm/xcode/xcuserdata/calstephens.xcuserdatad/xcschemes/xcschememanagement.plist +14 -0
  11. package/Gemfile +4 -0
  12. package/Gemfile.lock +102 -0
  13. package/Lottie.xcodeproj/project.pbxproj +2011 -1972
  14. package/Lottie.xcodeproj/project.xcworkspace/contents.xcworkspacedata +1 -1
  15. package/Lottie.xcodeproj/project.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  16. package/Lottie.xcodeproj/xcshareddata/xcschemes/{Lottie_iOS.xcscheme → Lottie (iOS).xcscheme } +15 -18
  17. package/Lottie.xcodeproj/xcshareddata/xcschemes/{Lottie_tvOS.xcscheme → Lottie (macOS).xcscheme } +5 -18
  18. package/Lottie.xcodeproj/xcshareddata/xcschemes/{Lottie_macOS.xcscheme → Lottie (tvOS).xcscheme } +5 -18
  19. package/Lottie.xcodeproj/xcuserdata/cal.xcuserdatad/xcschemes/xcschememanagement.plist +37 -0
  20. package/Lottie.xcodeproj/xcuserdata/calstephens.xcuserdatad/xcschemes/xcschememanagement.plist +24 -0
  21. package/Lottie.xcworkspace/contents.xcworkspacedata +10 -0
  22. package/Lottie.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
  23. package/Lottie.xcworkspace/xcshareddata/swiftpm/Package.resolved +34 -0
  24. package/Lottie.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  25. package/{Lottie.xcodeproj/xcuserdata/brandonwithrow.xcuserdatad → Lottie.xcworkspace/xcuserdata/cal.xcuserdatad}/xcdebugger/Breakpoints_v2.xcbkptlist +2 -2
  26. package/Lottie.xcworkspace/xcuserdata/cal.xcuserdatad/xcdebugger/Expressions.xcexplist +153 -0
  27. package/Lottie.xcworkspace/xcuserdata/calstephens.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  28. package/Lottie.xcworkspace/xcuserdata/calstephens.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +22 -0
  29. package/Lottie.xcworkspace/xcuserdata/calstephens.xcuserdatad/xcdebugger/Expressions.xcexplist +138 -0
  30. package/Lottie.xcworkspace/xcuserdata/calstephens.xcuserdatad/xcschemes/xcschememanagement.plist +30 -0
  31. package/Package.swift +5 -15
  32. package/README.md +40 -60
  33. package/Rakefile +160 -0
  34. package/Sources/Private/CoreAnimation/Animations/CAAnimation+TimingConfiguration.swift +81 -0
  35. package/Sources/Private/CoreAnimation/Animations/CALayer+addAnimation.swift +447 -0
  36. package/Sources/Private/CoreAnimation/Animations/CombinedShapeAnimation.swift +81 -0
  37. package/Sources/Private/CoreAnimation/Animations/CustomPathAnimation.swift +41 -0
  38. package/Sources/Private/CoreAnimation/Animations/EllipseAnimation.swift +55 -0
  39. package/Sources/Private/CoreAnimation/Animations/GradientAnimations.swift +210 -0
  40. package/Sources/Private/CoreAnimation/Animations/LayerProperty.swift +229 -0
  41. package/Sources/Private/CoreAnimation/Animations/OpacityAnimation.swift +52 -0
  42. package/Sources/Private/CoreAnimation/Animations/RectangleAnimation.swift +58 -0
  43. package/Sources/Private/CoreAnimation/Animations/ShapeAnimation.swift +257 -0
  44. package/Sources/Private/CoreAnimation/Animations/StarAnimation.swift +124 -0
  45. package/Sources/Private/CoreAnimation/Animations/StrokeAnimation.swift +73 -0
  46. package/Sources/Private/CoreAnimation/Animations/TransformAnimations.swift +205 -0
  47. package/Sources/Private/CoreAnimation/Animations/VisibilityAnimation.swift +37 -0
  48. package/Sources/Private/CoreAnimation/CompatibilityTracker.swift +130 -0
  49. package/Sources/Private/CoreAnimation/CoreAnimationLayer.swift +497 -0
  50. package/Sources/Private/CoreAnimation/Extensions/CALayer+fillBounds.swift +35 -0
  51. package/Sources/Private/CoreAnimation/Extensions/KeyframeGroup+exactlyOneKeyframe.swift +37 -0
  52. package/Sources/Private/CoreAnimation/Extensions/Keyframes+combinedIfPossible.swift +154 -0
  53. package/Sources/Private/CoreAnimation/Layers/AnimationLayer.swift +83 -0
  54. package/Sources/Private/CoreAnimation/Layers/BaseAnimationLayer.swift +33 -0
  55. package/Sources/Private/CoreAnimation/Layers/BaseCompositionLayer.swift +88 -0
  56. package/Sources/Private/CoreAnimation/Layers/CALayer+setupLayerHierarchy.swift +167 -0
  57. package/Sources/Private/CoreAnimation/Layers/GradientRenderLayer.swift +94 -0
  58. package/Sources/Private/CoreAnimation/Layers/ImageLayer.swift +79 -0
  59. package/Sources/Private/CoreAnimation/Layers/LayerModel+makeAnimationLayer.swift +64 -0
  60. package/Sources/Private/CoreAnimation/Layers/MaskCompositionLayer.swift +138 -0
  61. package/Sources/Private/CoreAnimation/Layers/PreCompLayer.swift +140 -0
  62. package/Sources/Private/CoreAnimation/Layers/RepeaterLayer.swift +85 -0
  63. package/Sources/Private/CoreAnimation/Layers/ShapeItemLayer.swift +315 -0
  64. package/Sources/Private/CoreAnimation/Layers/ShapeLayer.swift +390 -0
  65. package/Sources/Private/CoreAnimation/Layers/SolidLayer.swift +47 -0
  66. package/Sources/Private/CoreAnimation/Layers/TextLayer.swift +91 -0
  67. package/Sources/Private/CoreAnimation/Layers/TransformLayer.swift +11 -0
  68. package/Sources/Private/CoreAnimation/ValueProviderStore.swift +139 -0
  69. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/CompositionLayer.swift +94 -86
  70. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/ImageCompositionLayer.swift +24 -21
  71. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/MaskContainerLayer.swift +75 -54
  72. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/NullCompositionLayer.swift +5 -5
  73. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/PreCompositionLayer.swift +59 -43
  74. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/ShapeCompositionLayer.swift +22 -20
  75. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/SolidCompositionLayer.swift +26 -17
  76. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/TextCompositionLayer.swift +42 -36
  77. package/{lottie-swift/src/Private/LayerContainers/AnimationContainer.swift → Sources/Private/MainThread/LayerContainers/MainThreadAnimationLayer.swift} +200 -140
  78. package/Sources/Private/MainThread/LayerContainers/Utility/CachedImageProvider.swift +47 -0
  79. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/Utility/CompositionLayersInitializer.swift +33 -24
  80. package/{lottie-swift/src/Private/LayerContainers/Utility/TextLayer.swift → Sources/Private/MainThread/LayerContainers/Utility/CoreTextRenderLayer.swift} +149 -106
  81. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/Utility/InvertedMatteLayer.swift +26 -24
  82. package/Sources/Private/MainThread/LayerContainers/Utility/LayerFontProvider.swift +41 -0
  83. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/Utility/LayerImageProvider.swift +20 -16
  84. package/Sources/Private/MainThread/LayerContainers/Utility/LayerTextProvider.swift +40 -0
  85. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/Utility/LayerTransformNode.swift +82 -67
  86. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Extensions/ItemsExtension.swift +9 -4
  87. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/NodeProperty.swift +29 -21
  88. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/Protocols/AnyNodeProperty.swift +16 -10
  89. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/Protocols/AnyValueContainer.swift +6 -6
  90. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/Protocols/KeypathSearchable.swift +5 -5
  91. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/Protocols/NodePropertyMap.swift +10 -8
  92. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/ValueContainer.swift +25 -21
  93. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/ValueProviders/GroupInterpolator.swift +23 -17
  94. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/ValueProviders/SingleValueProvider.swift +22 -17
  95. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/ModifierNodes/TrimPathNode.swift +110 -79
  96. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/OutputNodes/GroupOutputNode.swift +22 -16
  97. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/OutputNodes/PassThroughOutputNode.swift +19 -15
  98. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/OutputNodes/PathOutputNode.swift +22 -20
  99. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/OutputNodes/Renderables/FillRenderer.swift +22 -23
  100. package/Sources/Private/MainThread/NodeRenderSystem/Nodes/OutputNodes/Renderables/GradientFillRenderer.swift +247 -0
  101. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/OutputNodes/Renderables/GradientStrokeRenderer.swift +30 -24
  102. package/{lottie-swift/src/Private/NodeRenderSystem/Nodes/OutputNodes/Renderables/GradientFillRenderer.swift → Sources/Private/MainThread/NodeRenderSystem/Nodes/OutputNodes/Renderables/LegacyGradientFillRenderer.swift} +93 -66
  103. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/OutputNodes/Renderables/StrokeRenderer.swift +23 -19
  104. package/Sources/Private/MainThread/NodeRenderSystem/Nodes/PathNodes/EllipseNode.swift +139 -0
  105. package/Sources/Private/MainThread/NodeRenderSystem/Nodes/PathNodes/PolygonNode.swift +170 -0
  106. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/PathNodes/RectNode.swift +95 -58
  107. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/PathNodes/ShapeNode.swift +42 -29
  108. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/PathNodes/StarNode.swift +108 -69
  109. package/Sources/Private/MainThread/NodeRenderSystem/Nodes/RenderContainers/GroupNode.swift +155 -0
  110. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/RenderNodes/FillNode.swift +51 -37
  111. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/RenderNodes/GradientFillNode.swift +57 -42
  112. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/RenderNodes/GradientStrokeNode.swift +66 -58
  113. package/Sources/Private/MainThread/NodeRenderSystem/Nodes/RenderNodes/StrokeNode.swift +169 -0
  114. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/Text/TextAnimatorNode.swift +138 -119
  115. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Protocols/AnimatorNode.swift +80 -79
  116. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Protocols/PathNode.swift +5 -3
  117. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Protocols/RenderNode.swift +22 -17
  118. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/RenderLayers/ShapeContainerLayer.swift +27 -24
  119. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/RenderLayers/ShapeRenderLayer.swift +34 -25
  120. package/Sources/Private/Model/Animation.swift +160 -0
  121. package/Sources/Private/Model/Assets/Asset.swift +43 -0
  122. package/{lottie-swift/src → Sources}/Private/Model/Assets/AssetLibrary.swift +40 -13
  123. package/Sources/Private/Model/Assets/ImageAsset.swift +112 -0
  124. package/{lottie-swift/src → Sources}/Private/Model/Assets/PrecompAsset.swift +20 -10
  125. package/Sources/Private/Model/DictionaryInitializable.swift +67 -0
  126. package/Sources/Private/Model/Extensions/Bundle.swift +34 -0
  127. package/{lottie-swift/src → Sources}/Private/Model/Extensions/KeyedDecodingContainerExtensions.swift +8 -4
  128. package/Sources/Private/Model/Keyframes/KeyframeData.swift +113 -0
  129. package/Sources/Private/Model/Keyframes/KeyframeGroup.swift +222 -0
  130. package/{lottie-swift/src → Sources}/Private/Model/Layers/ImageLayerModel.swift +21 -11
  131. package/Sources/Private/Model/Layers/LayerModel.swift +228 -0
  132. package/{lottie-swift/src → Sources}/Private/Model/Layers/PreCompLayerModel.swift +39 -22
  133. package/{lottie-swift/src → Sources}/Private/Model/Layers/ShapeLayerModel.swift +23 -12
  134. package/{lottie-swift/src → Sources}/Private/Model/Layers/SolidLayerModel.swift +31 -19
  135. package/{lottie-swift/src → Sources}/Private/Model/Layers/TextLayerModel.swift +33 -19
  136. package/Sources/Private/Model/Objects/DashPattern.swift +44 -0
  137. package/Sources/Private/Model/Objects/Marker.swift +33 -0
  138. package/Sources/Private/Model/Objects/Mask.swift +80 -0
  139. package/Sources/Private/Model/Objects/Transform.swift +179 -0
  140. package/Sources/Private/Model/ShapeItems/Ellipse.swift +74 -0
  141. package/Sources/Private/Model/ShapeItems/Fill.swift +74 -0
  142. package/Sources/Private/Model/ShapeItems/GradientFill.swift +137 -0
  143. package/Sources/Private/Model/ShapeItems/GradientStroke.swift +185 -0
  144. package/Sources/Private/Model/ShapeItems/Group.swift +48 -0
  145. package/{lottie-swift/src → Sources}/Private/Model/ShapeItems/Merge.swift +29 -12
  146. package/Sources/Private/Model/ShapeItems/Rectangle.swift +72 -0
  147. package/Sources/Private/Model/ShapeItems/Repeater.swift +135 -0
  148. package/Sources/Private/Model/ShapeItems/Shape.swift +56 -0
  149. package/Sources/Private/Model/ShapeItems/ShapeItem.swift +163 -0
  150. package/Sources/Private/Model/ShapeItems/ShapeTransform.swift +135 -0
  151. package/Sources/Private/Model/ShapeItems/Star.swift +131 -0
  152. package/Sources/Private/Model/ShapeItems/Stroke.swift +101 -0
  153. package/Sources/Private/Model/ShapeItems/Trim.swift +77 -0
  154. package/Sources/Private/Model/Text/Font.swift +61 -0
  155. package/{lottie-swift/src → Sources}/Private/Model/Text/Glyph.swift +63 -39
  156. package/Sources/Private/Model/Text/TextAnimator.swift +164 -0
  157. package/Sources/Private/Model/Text/TextDocument.swift +123 -0
  158. package/Sources/Private/RootAnimationLayer.swift +51 -0
  159. package/{lottie-swift/src → Sources}/Private/Utility/Debugging/AnimatorNodeDebugging.swift +7 -7
  160. package/{lottie-swift/src → Sources}/Private/Utility/Debugging/LayerDebugging.swift +72 -48
  161. package/Sources/Private/Utility/Debugging/TestHelpers.swift +10 -0
  162. package/{lottie-swift/src → Sources}/Private/Utility/Extensions/AnimationKeypathExtension.swift +69 -59
  163. package/Sources/Private/Utility/Extensions/BlendMode+Filter.swift +31 -0
  164. package/Sources/Private/Utility/Extensions/CGColor+RGB.swift +22 -0
  165. package/{lottie-swift/src → Sources}/Private/Utility/Extensions/CGFloatExtensions.swift +70 -67
  166. package/Sources/Private/Utility/Extensions/DataExtension.swift +27 -0
  167. package/Sources/Private/Utility/Extensions/MathKit.swift +450 -0
  168. package/Sources/Private/Utility/Extensions/StringExtensions.swift +38 -0
  169. package/{lottie-swift/src → Sources}/Private/Utility/Helpers/AnimationContext.swift +42 -16
  170. package/Sources/Private/Utility/Interpolatable/InterpolatableExtensions.swift +134 -0
  171. package/{lottie-swift/src → Sources}/Private/Utility/Interpolatable/KeyframeExtensions.swift +13 -10
  172. package/Sources/Private/Utility/Interpolatable/KeyframeGroup+Extensions.swift +59 -0
  173. package/{lottie-swift/src/Private/NodeRenderSystem/NodeProperties/ValueProviders → Sources/Private/Utility/Interpolatable}/KeyframeInterpolator.swift +125 -108
  174. package/{lottie-swift/src → Sources}/Private/Utility/Primitives/BezierPath.swift +229 -143
  175. package/Sources/Private/Utility/Primitives/CGPointExtension.swift +35 -0
  176. package/{lottie-swift/src → Sources}/Private/Utility/Primitives/ColorExtension.swift +46 -14
  177. package/{lottie-swift/src → Sources}/Private/Utility/Primitives/CompoundBezierPath.swift +58 -49
  178. package/Sources/Private/Utility/Primitives/CurveVertex.swift +184 -0
  179. package/Sources/Private/Utility/Primitives/PathElement.swift +75 -0
  180. package/Sources/Private/Utility/Primitives/UnitBezier.swift +115 -0
  181. package/Sources/Private/Utility/Primitives/VectorsExtensions.swift +341 -0
  182. package/Sources/Public/Animation/AnimationPublic.swift +266 -0
  183. package/Sources/Public/Animation/AnimationView.swift +1335 -0
  184. package/Sources/Public/Animation/AnimationViewInitializers.swift +109 -0
  185. package/Sources/Public/AnimationCache/AnimationCacheProvider.swift +22 -0
  186. package/{lottie-swift/src → Sources}/Public/AnimationCache/LRUAnimationCache.swift +22 -18
  187. package/Sources/Public/DynamicProperties/AnimationKeypath.swift +49 -0
  188. package/Sources/Public/DynamicProperties/AnyValueProvider.swift +132 -0
  189. package/{lottie-swift/src → Sources}/Public/DynamicProperties/ValueProviders/ColorValueProvider.swift +54 -36
  190. package/{lottie-swift/src → Sources}/Public/DynamicProperties/ValueProviders/FloatValueProvider.swift +40 -36
  191. package/Sources/Public/DynamicProperties/ValueProviders/GradientValueProvider.swift +123 -0
  192. package/{lottie-swift/src → Sources}/Public/DynamicProperties/ValueProviders/PointValueProvider.swift +40 -35
  193. package/{lottie-swift/src → Sources}/Public/DynamicProperties/ValueProviders/SizeValueProvider.swift +40 -35
  194. package/{lottie-swift/src → Sources}/Public/FontProvider/AnimationFontProvider.swift +15 -8
  195. package/Sources/Public/ImageProvider/AnimationImageProvider.swift +21 -0
  196. package/Sources/Public/Keyframes/Interpolatable.swift +253 -0
  197. package/Sources/Public/Keyframes/Keyframe.swift +92 -0
  198. package/Sources/Public/Logging/LottieLogger.swift +137 -0
  199. package/Sources/Public/LottieConfiguration.swift +143 -0
  200. package/{lottie-swift/src → Sources}/Public/Primitives/AnimationTime.swift +1 -1
  201. package/{lottie-swift/src → Sources}/Public/Primitives/Color.swift +10 -6
  202. package/{lottie-swift/src → Sources}/Public/Primitives/Vectors.swift +13 -12
  203. package/Sources/Public/TextProvider/AnimationTextProvider.swift +53 -0
  204. package/{lottie-swift/src → Sources}/Public/iOS/AnimatedButton.swift +42 -26
  205. package/{lottie-swift/src → Sources}/Public/iOS/AnimatedControl.swift +100 -91
  206. package/{lottie-swift/src → Sources}/Public/iOS/AnimatedSwitch.swift +128 -94
  207. package/{lottie-swift/src → Sources}/Public/iOS/AnimationSubview.swift +3 -3
  208. package/Sources/Public/iOS/AnimationViewBase.swift +78 -0
  209. package/{lottie-swift/src → Sources}/Public/iOS/BundleImageProvider.swift +36 -34
  210. package/{lottie-swift/src → Sources}/Public/iOS/Compatibility/CompatibleAnimationKeypath.swift +4 -0
  211. package/{lottie-swift/src → Sources}/Public/iOS/Compatibility/CompatibleAnimationView.swift +38 -29
  212. package/{lottie-swift/src → Sources}/Public/iOS/FilepathImageProvider.swift +24 -21
  213. package/{lottie-swift/src → Sources}/Public/iOS/UIColorExtension.swift +4 -4
  214. package/{lottie-swift/src/Public/MacOS/AnimationSubview.swift → Sources/Public/macOS/AnimationSubview.macOS.swift} +4 -5
  215. package/{lottie-swift/src/Public/MacOS/LottieView.swift → Sources/Public/macOS/AnimationViewBase.macOS.swift} +58 -50
  216. package/{lottie-swift/src/Public/MacOS/BundleImageProvider.swift → Sources/Public/macOS/BundleImageProvider.macOS.swift} +31 -32
  217. package/Sources/Public/macOS/FilepathImageProvider.macOS.swift +67 -0
  218. package/Tests/AnimationKeypathTests.swift +103 -0
  219. package/Tests/AutomaticEngineTests.swift +57 -0
  220. package/Tests/BundleTests.swift +25 -0
  221. package/Tests/DataURLTests.swift +64 -0
  222. package/Tests/ParsingTests.swift +43 -0
  223. package/Tests/PerformanceTests.swift +214 -0
  224. package/Tests/Samples/9squares_AlBoardman.json +1 -0
  225. package/Tests/Samples/Boat_Loader.json +1 -0
  226. package/Tests/Samples/HamburgerArrow.json +1 -0
  227. package/Tests/Samples/IconTransitions.json +1 -0
  228. package/Tests/Samples/Images/dog.png +0 -0
  229. package/Tests/Samples/Issues/issue_1125.json +1 -0
  230. package/Tests/Samples/Issues/issue_1260.json +1 -0
  231. package/Tests/Samples/Issues/issue_1403.json +1 -0
  232. package/Tests/Samples/Issues/issue_1407.json +1 -0
  233. package/Tests/Samples/Issues/issue_1460.json +1 -0
  234. package/Tests/Samples/Issues/issue_1488.json +1 -0
  235. package/Tests/Samples/Issues/issue_1505.json +1 -0
  236. package/Tests/Samples/Issues/issue_1541.json +1 -0
  237. package/Tests/Samples/Issues/issue_1557.json +1 -0
  238. package/Tests/Samples/Issues/issue_1603.json +1 -0
  239. package/Tests/Samples/Issues/issue_1628.json +1 -0
  240. package/Tests/Samples/Issues/issue_1636.json +1 -0
  241. package/Tests/Samples/Issues/issue_1643.json +1 -0
  242. package/Tests/Samples/Issues/issue_1655.json +1 -0
  243. package/Tests/Samples/Issues/issue_1664.json +1 -0
  244. package/Tests/Samples/Issues/issue_1683.json +1 -0
  245. package/Tests/Samples/Issues/issue_1687.json +1 -0
  246. package/Tests/Samples/Issues/issue_1711.json +1 -0
  247. package/Tests/Samples/Issues/issue_1717.json +1 -0
  248. package/Tests/Samples/Issues/issue_769.json +1 -0
  249. package/Tests/Samples/Issues/issue_885.json +1 -0
  250. package/Tests/Samples/Issues/issue_965.json +1 -0
  251. package/Tests/Samples/Issues/pr_1536.json +1 -0
  252. package/Tests/Samples/Issues/pr_1563.json +8439 -0
  253. package/Tests/Samples/Issues/pr_1592.json +5527 -0
  254. package/Tests/Samples/Issues/pr_1599.json +738 -0
  255. package/Tests/Samples/Issues/pr_1604_1.json +1 -0
  256. package/Tests/Samples/Issues/pr_1604_2.json +1 -0
  257. package/Tests/Samples/Issues/pr_1632_1.json +1 -0
  258. package/Tests/Samples/Issues/pr_1632_2.json +1 -0
  259. package/Tests/Samples/Issues/pr_1686.json +513 -0
  260. package/Tests/Samples/Issues/pr_1698.json +1 -0
  261. package/Tests/Samples/Issues/pr_1699.json +1 -0
  262. package/Tests/Samples/LottieFiles/LICENSE.md +14 -0
  263. package/Tests/Samples/LottieFiles/bounce_strokes.json +1 -0
  264. package/Tests/Samples/LottieFiles/cactus.json +1 -0
  265. package/Tests/Samples/LottieFiles/dog_car_ride.json +1 -0
  266. package/Tests/Samples/LottieFiles/draft_icon.json +1 -0
  267. package/Tests/Samples/LottieFiles/fireworks.json +1 -0
  268. package/Tests/Samples/LottieFiles/gradient_1.json +1 -0
  269. package/Tests/Samples/LottieFiles/gradient_2.json +1 -0
  270. package/Tests/Samples/LottieFiles/gradient_pill.json +1 -0
  271. package/Tests/Samples/LottieFiles/gradient_shapes.json +1 -0
  272. package/Tests/Samples/LottieFiles/gradient_square.json +1 -0
  273. package/Tests/Samples/LottieFiles/growth.json +1 -0
  274. package/Tests/Samples/LottieFiles/infinity_loader.json +1 -0
  275. package/Tests/Samples/LottieFiles/loading_dots_1.json +1 -0
  276. package/Tests/Samples/LottieFiles/loading_dots_2.json +1 -0
  277. package/Tests/Samples/LottieFiles/loading_dots_3.json +1 -0
  278. package/Tests/Samples/LottieFiles/loading_gradient_strokes.json +1 -0
  279. package/Tests/Samples/LottieFiles/settings_slider.json +1 -0
  280. package/Tests/Samples/LottieFiles/shop.json +1 -0
  281. package/Tests/Samples/LottieFiles/step_loader.json +1 -0
  282. package/Tests/Samples/LottieLogo1.json +1 -0
  283. package/Tests/Samples/LottieLogo1_masked.json +1 -0
  284. package/Tests/Samples/LottieLogo2.json +1 -0
  285. package/Tests/Samples/MotionCorpse_Jrcanest.json +1 -0
  286. package/Tests/Samples/Nonanimating/BasicLayers.json +1 -0
  287. package/Tests/Samples/Nonanimating/DisableNodesTest.json +1 -0
  288. package/Tests/Samples/Nonanimating/FirstText.json +1 -0
  289. package/Tests/Samples/Nonanimating/GeometryTransformTest.json +1 -0
  290. package/Tests/Samples/Nonanimating/Text_AnimatedProperties.json +1 -0
  291. package/Tests/Samples/Nonanimating/Text_Glyph.json +1 -0
  292. package/Tests/Samples/Nonanimating/Text_NoAnimation.json +1 -0
  293. package/Tests/Samples/Nonanimating/Text_NoGlyph.json +1 -0
  294. package/Tests/Samples/Nonanimating/Zoom.json +1 -0
  295. package/Tests/Samples/Nonanimating/_dog.json +1 -0
  296. package/Tests/Samples/Nonanimating/base64Test.json +1 -0
  297. package/Tests/Samples/Nonanimating/blend_mode_test.json +1 -0
  298. package/Tests/Samples/Nonanimating/keypathTest.json +1 -0
  299. package/Tests/Samples/Nonanimating/verifyLineHeight.json +1 -0
  300. package/Tests/Samples/PinJump.json +1 -0
  301. package/Tests/Samples/Switch.json +1 -0
  302. package/Tests/Samples/Switch_States.json +1 -0
  303. package/Tests/Samples/TwitterHeart.json +1 -0
  304. package/Tests/Samples/TwitterHeartButton.json +1 -0
  305. package/Tests/Samples/TypeFace/A.json +1 -0
  306. package/Tests/Samples/TypeFace/Apostrophe.json +1 -0
  307. package/Tests/Samples/TypeFace/B.json +1 -0
  308. package/Tests/Samples/TypeFace/BlinkingCursor.json +1 -0
  309. package/Tests/Samples/TypeFace/C.json +1 -0
  310. package/Tests/Samples/TypeFace/Colon.json +1 -0
  311. package/Tests/Samples/TypeFace/Comma.json +1 -0
  312. package/Tests/Samples/TypeFace/D.json +1 -0
  313. package/Tests/Samples/TypeFace/E.json +1 -0
  314. package/Tests/Samples/TypeFace/F.json +1 -0
  315. package/Tests/Samples/TypeFace/G.json +1 -0
  316. package/Tests/Samples/TypeFace/H.json +1 -0
  317. package/Tests/Samples/TypeFace/I.json +1 -0
  318. package/Tests/Samples/TypeFace/J.json +1 -0
  319. package/Tests/Samples/TypeFace/K.json +1 -0
  320. package/Tests/Samples/TypeFace/L.json +1 -0
  321. package/Tests/Samples/TypeFace/M.json +1 -0
  322. package/Tests/Samples/TypeFace/N.json +1 -0
  323. package/Tests/Samples/TypeFace/O.json +1 -0
  324. package/Tests/Samples/TypeFace/P.json +1 -0
  325. package/Tests/Samples/TypeFace/Q.json +1 -0
  326. package/Tests/Samples/TypeFace/R.json +1 -0
  327. package/Tests/Samples/TypeFace/S.json +1 -0
  328. package/Tests/Samples/TypeFace/T.json +1 -0
  329. package/Tests/Samples/TypeFace/U.json +1 -0
  330. package/Tests/Samples/TypeFace/V.json +1 -0
  331. package/Tests/Samples/TypeFace/W.json +1 -0
  332. package/Tests/Samples/TypeFace/X.json +1 -0
  333. package/Tests/Samples/TypeFace/Y.json +1 -0
  334. package/Tests/Samples/TypeFace/Z.json +1 -0
  335. package/Tests/Samples/Watermelon.json +1 -0
  336. package/Tests/Samples/setValueTest.json +1 -0
  337. package/Tests/Samples/timeremap.json +1 -0
  338. package/Tests/Samples/vcTransition1.json +1 -0
  339. package/Tests/Samples/vcTransition2.json +1 -0
  340. package/Tests/SnapshotConfiguration.swift +158 -0
  341. package/Tests/SnapshotTests.swift +265 -0
  342. package/Tests/Utils/Bundle+Module.swift +30 -0
  343. package/Tests/Utils/HardcodedFontProvider.swift +19 -0
  344. package/Tests/Utils/HardcodedImageProvider.swift +23 -0
  345. package/Tests/Utils/Snapshotting+presentationLayer.swift +47 -0
  346. package/Tests/ValueProvidersTests.swift +27 -0
  347. package/lottie-ios.podspec +12 -12
  348. package/package.json +1 -1
  349. package/script/test-carthage/Cartfile +1 -0
  350. package/script/test-carthage/Cartfile.resolved +1 -0
  351. package/script/test-carthage/CarthageTest/AppDelegate.swift +26 -0
  352. package/script/test-carthage/CarthageTest/Assets.xcassets/AccentColor.colorset/Contents.json +11 -0
  353. package/script/test-carthage/CarthageTest/Assets.xcassets/AppIcon.appiconset/Contents.json +98 -0
  354. package/script/test-carthage/CarthageTest/Assets.xcassets/Contents.json +6 -0
  355. package/script/test-carthage/CarthageTest/Base.lproj/LaunchScreen.storyboard +25 -0
  356. package/script/test-carthage/CarthageTest/Base.lproj/Main.storyboard +24 -0
  357. package/script/test-carthage/CarthageTest/Info.plist +66 -0
  358. package/script/test-carthage/CarthageTest/SceneDelegate.swift +10 -0
  359. package/script/test-carthage/CarthageTest/ViewController.swift +15 -0
  360. package/script/test-carthage/CarthageTest-macOS/AppDelegate.swift +7 -0
  361. package/script/test-carthage/CarthageTest-macOS/Assets.xcassets/AccentColor.colorset/Contents.json +11 -0
  362. package/script/test-carthage/CarthageTest-macOS/Assets.xcassets/AppIcon.appiconset/Contents.json +58 -0
  363. package/script/test-carthage/CarthageTest-macOS/Assets.xcassets/Contents.json +6 -0
  364. package/script/test-carthage/CarthageTest-macOS/Base.lproj/Main.storyboard +717 -0
  365. package/script/test-carthage/CarthageTest-macOS/CarthageTest_macOS.entitlements +10 -0
  366. package/script/test-carthage/CarthageTest-macOS/ViewController.swift +15 -0
  367. package/script/test-carthage/CarthageTest.xcodeproj/project.pbxproj +532 -0
  368. package/script/test-carthage/CarthageTest.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
  369. package/script/test-carthage/CarthageTest.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
  370. package/script/test-carthage/CarthageTest.xcodeproj/project.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  371. package/script/test-carthage/CarthageTest.xcodeproj/project.xcworkspace/xcuserdata/calstephens.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  372. package/script/test-carthage/CarthageTest.xcodeproj/xcuserdata/cal.xcuserdatad/xcschemes/xcschememanagement.plist +14 -0
  373. package/script/test-carthage/CarthageTest.xcodeproj/xcuserdata/calstephens.xcuserdatad/xcschemes/xcschememanagement.plist +19 -0
  374. package/script/test-carthage/Mintfile +1 -0
  375. package/script/test-spm/LottieSPM.xcworkspace/contents.xcworkspacedata +7 -0
  376. package/script/test-spm/LottieSPM.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  377. package/script/test-spm/Mintfile +1 -0
  378. package/.swiftpm/xcode/package.xcworkspace/xcuserdata/brandonwithrow.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  379. package/Lottie/Info.plist +0 -22
  380. package/Lottie.xcodeproj/project.xcworkspace/xcuserdata/brandonwithrow.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  381. package/Lottie.xcodeproj/xcuserdata/brandonwithrow.xcuserdatad/xcschemes/LottieLibraryMacOS.xcscheme +0 -80
  382. package/Lottie.xcodeproj/xcuserdata/brandonwithrow.xcuserdatad/xcschemes/xcschememanagement.plist +0 -57
  383. package/lottie-swift/Assets/.gitkeep +0 -0
  384. package/lottie-swift/src/Private/LayerContainers/Utility/LayerFontProvider.swift +0 -37
  385. package/lottie-swift/src/Private/LayerContainers/Utility/LayerTextProvider.swift +0 -36
  386. package/lottie-swift/src/Private/Model/Animation.swift +0 -107
  387. package/lottie-swift/src/Private/Model/Assets/Asset.swift +0 -27
  388. package/lottie-swift/src/Private/Model/Assets/ImageAsset.swift +0 -48
  389. package/lottie-swift/src/Private/Model/Keyframes/Keyframe.swift +0 -128
  390. package/lottie-swift/src/Private/Model/Keyframes/KeyframeGroup.swift +0 -108
  391. package/lottie-swift/src/Private/Model/Layers/LayerModel.swift +0 -150
  392. package/lottie-swift/src/Private/Model/Objects/DashPattern.swift +0 -24
  393. package/lottie-swift/src/Private/Model/Objects/Marker.swift +0 -23
  394. package/lottie-swift/src/Private/Model/Objects/Mask.swift +0 -48
  395. package/lottie-swift/src/Private/Model/Objects/Transform.swift +0 -105
  396. package/lottie-swift/src/Private/Model/ShapeItems/Ellipse.swift +0 -50
  397. package/lottie-swift/src/Private/Model/ShapeItems/FillI.swift +0 -49
  398. package/lottie-swift/src/Private/Model/ShapeItems/GradientFill.swift +0 -86
  399. package/lottie-swift/src/Private/Model/ShapeItems/GradientStroke.swift +0 -125
  400. package/lottie-swift/src/Private/Model/ShapeItems/Group.swift +0 -32
  401. package/lottie-swift/src/Private/Model/ShapeItems/Rectangle.swift +0 -50
  402. package/lottie-swift/src/Private/Model/ShapeItems/Repeater.swift +0 -80
  403. package/lottie-swift/src/Private/Model/ShapeItems/Shape.swift +0 -37
  404. package/lottie-swift/src/Private/Model/ShapeItems/ShapeItem.swift +0 -95
  405. package/lottie-swift/src/Private/Model/ShapeItems/ShapeTransform.swift +0 -68
  406. package/lottie-swift/src/Private/Model/ShapeItems/Star.swift +0 -86
  407. package/lottie-swift/src/Private/Model/ShapeItems/Stroke.swift +0 -67
  408. package/lottie-swift/src/Private/Model/ShapeItems/Trim.swift +0 -53
  409. package/lottie-swift/src/Private/Model/Text/Font.swift +0 -35
  410. package/lottie-swift/src/Private/Model/Text/TextAnimator.swift +0 -99
  411. package/lottie-swift/src/Private/Model/Text/TextDocument.swift +0 -70
  412. package/lottie-swift/src/Private/NodeRenderSystem/Nodes/PathNodes/EllipseNode.swift +0 -109
  413. package/lottie-swift/src/Private/NodeRenderSystem/Nodes/PathNodes/PolygonNode.swift +0 -132
  414. package/lottie-swift/src/Private/NodeRenderSystem/Nodes/RenderContainers/GroupNode.swift +0 -141
  415. package/lottie-swift/src/Private/NodeRenderSystem/Nodes/RenderNodes/StrokeNode.swift +0 -127
  416. package/lottie-swift/src/Private/Utility/Extensions/MathKit.swift +0 -539
  417. package/lottie-swift/src/Private/Utility/Extensions/StringExtensions.swift +0 -32
  418. package/lottie-swift/src/Private/Utility/Interpolatable/Interpolatable.swift +0 -18
  419. package/lottie-swift/src/Private/Utility/Interpolatable/InterpolatableExtensions.swift +0 -170
  420. package/lottie-swift/src/Private/Utility/Primitives/CurveVertex.swift +0 -177
  421. package/lottie-swift/src/Private/Utility/Primitives/PathElement.swift +0 -68
  422. package/lottie-swift/src/Private/Utility/Primitives/VectorsExtensions.swift +0 -218
  423. package/lottie-swift/src/Public/Animation/AnimationPublic.swift +0 -196
  424. package/lottie-swift/src/Public/Animation/AnimationView.swift +0 -1006
  425. package/lottie-swift/src/Public/Animation/AnimationViewInitializers.swift +0 -83
  426. package/lottie-swift/src/Public/AnimationCache/AnimationCacheProvider.swift +0 -24
  427. package/lottie-swift/src/Public/DynamicProperties/AnimationKeypath.swift +0 -46
  428. package/lottie-swift/src/Public/DynamicProperties/AnyValueProvider.swift +0 -29
  429. package/lottie-swift/src/Public/DynamicProperties/ValueProviders/GradientValueProvider.swift +0 -114
  430. package/lottie-swift/src/Public/ImageProvider/AnimationImageProvider.swift +0 -23
  431. package/lottie-swift/src/Public/MacOS/FilepathImageProvider.swift +0 -67
  432. package/lottie-swift/src/Public/TextProvider/AnimationTextProvider.swift +0 -39
  433. package/lottie-swift/src/Public/iOS/LottieView.swift +0 -62
  434. package/lottie-swift-testing.podspec +0 -32
@@ -0,0 +1,247 @@
1
+ //
2
+ // GradientFillRenderer.swift
3
+ // lottie-swift
4
+ //
5
+ // Created by Brandon Withrow on 1/30/19.
6
+ //
7
+
8
+ import Foundation
9
+ import QuartzCore
10
+
11
+ // MARK: - GradientFillLayer
12
+
13
+ private final class GradientFillLayer: CALayer {
14
+
15
+ var start: CGPoint = .zero {
16
+ didSet {
17
+ setNeedsDisplay()
18
+ }
19
+ }
20
+
21
+ var numberOfColors = 0 {
22
+ didSet {
23
+ setNeedsDisplay()
24
+ }
25
+ }
26
+
27
+ var colors: [CGFloat] = [] {
28
+ didSet {
29
+ setNeedsDisplay()
30
+ }
31
+ }
32
+
33
+ var end: CGPoint = .zero {
34
+ didSet {
35
+ setNeedsDisplay()
36
+ }
37
+ }
38
+
39
+ var type: GradientType = .none {
40
+ didSet {
41
+ setNeedsDisplay()
42
+ }
43
+ }
44
+
45
+ override func draw(in ctx: CGContext) {
46
+ var alphaColors = [CGColor]()
47
+ var alphaLocations = [CGFloat]()
48
+
49
+ var gradientColors = [CGColor]()
50
+ var colorLocations = [CGFloat]()
51
+ let colorSpace = CGColorSpaceCreateDeviceRGB()
52
+ let maskColorSpace = CGColorSpaceCreateDeviceGray()
53
+ for i in 0..<numberOfColors {
54
+ let ix = i * 4
55
+ if
56
+ colors.count > ix, let color = CGColor(
57
+ colorSpace: colorSpace,
58
+ components: [colors[ix + 1], colors[ix + 2], colors[ix + 3], 1])
59
+ {
60
+ gradientColors.append(color)
61
+ colorLocations.append(colors[ix])
62
+ }
63
+ }
64
+
65
+ var drawMask = false
66
+ for i in stride(from: numberOfColors * 4, to: colors.endIndex, by: 2) {
67
+ let alpha = colors[i + 1]
68
+ if alpha < 1 {
69
+ drawMask = true
70
+ }
71
+ if let color = CGColor(colorSpace: maskColorSpace, components: [alpha, 1]) {
72
+ alphaLocations.append(colors[i])
73
+ alphaColors.append(color)
74
+ }
75
+ }
76
+
77
+ /// First draw a mask is necessary.
78
+ if drawMask {
79
+ guard
80
+ let maskGradient = CGGradient(
81
+ colorsSpace: maskColorSpace,
82
+ colors: alphaColors as CFArray,
83
+ locations: alphaLocations),
84
+ let maskContext = CGContext(
85
+ data: nil,
86
+ width: ctx.width,
87
+ height: ctx.height,
88
+ bitsPerComponent: 8,
89
+ bytesPerRow: ctx.width,
90
+ space: maskColorSpace,
91
+ bitmapInfo: 0) else { return }
92
+ let flipVertical = CGAffineTransform(a: 1, b: 0, c: 0, d: -1, tx: 0, ty: CGFloat(maskContext.height))
93
+ maskContext.concatenate(flipVertical)
94
+ maskContext.concatenate(ctx.ctm)
95
+ if type == .linear {
96
+ maskContext.drawLinearGradient(
97
+ maskGradient,
98
+ start: start,
99
+ end: end,
100
+ options: [.drawsAfterEndLocation, .drawsBeforeStartLocation])
101
+ } else {
102
+ maskContext.drawRadialGradient(
103
+ maskGradient,
104
+ startCenter: start,
105
+ startRadius: 0,
106
+ endCenter: start,
107
+ endRadius: start.distanceTo(end),
108
+ options: [.drawsAfterEndLocation, .drawsBeforeStartLocation])
109
+ }
110
+ /// Clips the gradient
111
+ if let alphaMask = maskContext.makeImage() {
112
+ ctx.clip(to: ctx.boundingBoxOfClipPath, mask: alphaMask)
113
+ }
114
+ }
115
+
116
+ /// Now draw the gradient
117
+ guard let gradient = CGGradient(colorsSpace: colorSpace, colors: gradientColors as CFArray, locations: colorLocations)
118
+ else { return }
119
+ if type == .linear {
120
+ ctx.drawLinearGradient(gradient, start: start, end: end, options: [.drawsAfterEndLocation, .drawsBeforeStartLocation])
121
+ } else {
122
+ ctx.drawRadialGradient(
123
+ gradient,
124
+ startCenter: start,
125
+ startRadius: 0,
126
+ endCenter: start,
127
+ endRadius: start.distanceTo(end),
128
+ options: [.drawsAfterEndLocation, .drawsBeforeStartLocation])
129
+ }
130
+ }
131
+
132
+ }
133
+
134
+ // MARK: - GradientFillRenderer
135
+
136
+ /// A rendered for a Path Fill
137
+ final class GradientFillRenderer: PassThroughOutputNode, Renderable {
138
+
139
+ // MARK: Lifecycle
140
+
141
+ override init(parent: NodeOutput?) {
142
+ super.init(parent: parent)
143
+
144
+ maskLayer.fillColor = CGColor(colorSpace: CGColorSpaceCreateDeviceRGB(), components: [1, 1, 1, 1])
145
+ gradientLayer.mask = maskLayer
146
+
147
+ maskLayer.actions = [
148
+ "startPoint" : NSNull(),
149
+ "endPoint" : NSNull(),
150
+ "opacity" : NSNull(),
151
+ "locations" : NSNull(),
152
+ "colors" : NSNull(),
153
+ "bounds" : NSNull(),
154
+ "anchorPoint" : NSNull(),
155
+ "isRadial" : NSNull(),
156
+ "path" : NSNull(),
157
+ ]
158
+ gradientLayer.actions = maskLayer.actions
159
+ }
160
+
161
+ // MARK: Internal
162
+
163
+ var shouldRenderInContext = false
164
+
165
+ var start: CGPoint = .zero {
166
+ didSet {
167
+ hasUpdate = true
168
+ }
169
+ }
170
+
171
+ var numberOfColors = 0 {
172
+ didSet {
173
+ hasUpdate = true
174
+ }
175
+ }
176
+
177
+ var colors: [CGFloat] = [] {
178
+ didSet {
179
+ hasUpdate = true
180
+ }
181
+ }
182
+
183
+ var end: CGPoint = .zero {
184
+ didSet {
185
+ hasUpdate = true
186
+ }
187
+ }
188
+
189
+ var opacity: CGFloat = 0 {
190
+ didSet {
191
+ hasUpdate = true
192
+ }
193
+ }
194
+
195
+ var type: GradientType = .none {
196
+ didSet {
197
+ hasUpdate = true
198
+ }
199
+ }
200
+
201
+ var fillRule: CAShapeLayerFillRule {
202
+ get { maskLayer.fillRule }
203
+ set { maskLayer.fillRule = newValue }
204
+ }
205
+
206
+ func render(_: CGContext) {
207
+ // do nothing
208
+ }
209
+
210
+ func setupSublayers(layer: CAShapeLayer) {
211
+ layer.addSublayer(gradientLayer)
212
+ layer.fillColor = nil
213
+ }
214
+
215
+ func updateShapeLayer(layer: CAShapeLayer) {
216
+ hasUpdate = false
217
+
218
+ guard let path = layer.path else {
219
+ return
220
+ }
221
+
222
+ let frame = path.boundingBox
223
+ let anchor = CGPoint(
224
+ x: -frame.origin.x / frame.size.width,
225
+ y: -frame.origin.y / frame.size.height)
226
+ maskLayer.path = path
227
+ maskLayer.bounds = path.boundingBox
228
+ maskLayer.anchorPoint = anchor
229
+
230
+ gradientLayer.bounds = maskLayer.bounds
231
+ gradientLayer.anchorPoint = anchor
232
+
233
+ // setup gradient properties
234
+ gradientLayer.start = start
235
+ gradientLayer.end = end
236
+ gradientLayer.numberOfColors = numberOfColors
237
+ gradientLayer.colors = colors
238
+ gradientLayer.opacity = Float(opacity)
239
+ gradientLayer.type = type
240
+ }
241
+
242
+ // MARK: Private
243
+
244
+ private let gradientLayer = GradientFillLayer()
245
+ private let maskLayer = CAShapeLayer()
246
+
247
+ }
@@ -11,49 +11,55 @@ import QuartzCore
11
11
  // MARK: - Renderer
12
12
 
13
13
  final class GradientStrokeRenderer: PassThroughOutputNode, Renderable {
14
-
14
+
15
+ // MARK: Lifecycle
16
+
17
+ override init(parent: NodeOutput?) {
18
+ strokeRender = StrokeRenderer(parent: nil)
19
+ gradientRender = LegacyGradientFillRenderer(parent: nil)
20
+ strokeRender.color = CGColor(colorSpace: CGColorSpaceCreateDeviceRGB(), components: [1, 1, 1, 1])
21
+ super.init(parent: parent)
22
+ }
23
+
24
+ // MARK: Internal
25
+
26
+ var shouldRenderInContext = true
27
+
28
+ let strokeRender: StrokeRenderer
29
+ let gradientRender: LegacyGradientFillRenderer
30
+
15
31
  override func hasOutputUpdates(_ forFrame: CGFloat) -> Bool {
16
32
  let updates = super.hasOutputUpdates(forFrame)
17
33
  return updates || strokeRender.hasUpdate || gradientRender.hasUpdate
18
34
  }
19
-
20
- var shouldRenderInContext: Bool = true
21
-
22
- func updateShapeLayer(layer: CAShapeLayer) {
35
+
36
+ func updateShapeLayer(layer _: CAShapeLayer) {
23
37
  /// Not Applicable
24
38
  }
25
-
26
- let strokeRender: StrokeRenderer
27
- let gradientRender: GradientFillRenderer
28
-
29
- override init(parent: NodeOutput?) {
30
- self.strokeRender = StrokeRenderer(parent: nil)
31
- self.gradientRender = GradientFillRenderer(parent: nil)
32
- self.strokeRender.color = CGColor(colorSpace: CGColorSpaceCreateDeviceRGB(), components: [1, 1, 1, 1])
33
- super.init(parent: parent)
39
+
40
+ func setupSublayers(layer _: CAShapeLayer) {
41
+ /// Not Applicable
34
42
  }
35
-
43
+
36
44
  func render(_ inContext: CGContext) {
37
- guard inContext.path != nil && inContext.path!.isEmpty == false else {
45
+ guard inContext.path != nil, inContext.path!.isEmpty == false else {
38
46
  return
39
47
  }
40
48
 
41
49
  strokeRender.hasUpdate = false
42
50
  hasUpdate = false
43
51
  gradientRender.hasUpdate = false
44
-
52
+
45
53
  strokeRender.setupForStroke(inContext)
46
-
54
+
47
55
  inContext.replacePathWithStrokedPath()
48
-
56
+
49
57
  /// Now draw the gradient.
50
58
  gradientRender.render(inContext)
51
-
52
59
  }
53
-
60
+
54
61
  func renderBoundsFor(_ boundingBox: CGRect) -> CGRect {
55
- return strokeRender.renderBoundsFor(boundingBox)
62
+ strokeRender.renderBoundsFor(boundingBox)
56
63
  }
57
-
58
-
64
+
59
65
  }
@@ -1,5 +1,5 @@
1
1
  //
2
- // GradientFillRenderer.swift
2
+ // LegacyGradientFillRenderer.swift
3
3
  // lottie-swift
4
4
  //
5
5
  // Created by Brandon Withrow on 1/30/19.
@@ -9,36 +9,80 @@ import Foundation
9
9
  import QuartzCore
10
10
 
11
11
  /// A rendered for a Path Fill
12
- final class GradientFillRenderer: PassThroughOutputNode, Renderable {
13
-
14
- var shouldRenderInContext: Bool = true
15
-
16
- func updateShapeLayer(layer: CAShapeLayer) {
12
+ final class LegacyGradientFillRenderer: PassThroughOutputNode, Renderable {
13
+
14
+ var shouldRenderInContext = true
15
+
16
+ var start: CGPoint = .zero {
17
+ didSet {
18
+ hasUpdate = true
19
+ }
20
+ }
21
+
22
+ var numberOfColors = 0 {
23
+ didSet {
24
+ hasUpdate = true
25
+ }
26
+ }
27
+
28
+ var colors: [CGFloat] = [] {
29
+ didSet {
30
+ hasUpdate = true
31
+ }
32
+ }
33
+
34
+ var end: CGPoint = .zero {
35
+ didSet {
36
+ hasUpdate = true
37
+ }
38
+ }
39
+
40
+ var opacity: CGFloat = 0 {
41
+ didSet {
42
+ hasUpdate = true
43
+ }
44
+ }
45
+
46
+ var type: GradientType = .none {
47
+ didSet {
48
+ hasUpdate = true
49
+ }
50
+ }
51
+
52
+ func updateShapeLayer(layer _: CAShapeLayer) {
17
53
  // Not applicable
18
54
  }
19
-
55
+
56
+ func setupSublayers(layer _: CAShapeLayer) {
57
+ // Not applicable
58
+ }
59
+
20
60
  func render(_ inContext: CGContext) {
21
- guard inContext.path != nil && inContext.path!.isEmpty == false else {
61
+ guard inContext.path != nil, inContext.path!.isEmpty == false else {
22
62
  return
23
63
  }
24
64
  hasUpdate = false
25
65
  var alphaColors = [CGColor]()
26
66
  var alphaLocations = [CGFloat]()
27
-
67
+
28
68
  var gradientColors = [CGColor]()
29
69
  var colorLocations = [CGFloat]()
30
70
  let colorSpace = CGColorSpaceCreateDeviceRGB()
31
71
  let maskColorSpace = CGColorSpaceCreateDeviceGray()
32
72
  for i in 0..<numberOfColors {
33
73
  let ix = i * 4
34
- if colors.count > ix, let color = CGColor(colorSpace: colorSpace, components: [colors[ix + 1], colors[ix + 2], colors[ix + 3], 1]) {
74
+ if
75
+ colors.count > ix, let color = CGColor(
76
+ colorSpace: colorSpace,
77
+ components: [colors[ix + 1], colors[ix + 2], colors[ix + 3], 1])
78
+ {
35
79
  gradientColors.append(color)
36
80
  colorLocations.append(colors[ix])
37
81
  }
38
82
  }
39
-
83
+
40
84
  var drawMask = false
41
- for i in stride(from: (numberOfColors * 4), to: colors.endIndex, by: 2) {
85
+ for i in stride(from: numberOfColors * 4, to: colors.endIndex, by: 2) {
42
86
  let alpha = colors[i + 1]
43
87
  if alpha < 1 {
44
88
  drawMask = true
@@ -48,79 +92,62 @@ final class GradientFillRenderer: PassThroughOutputNode, Renderable {
48
92
  alphaColors.append(color)
49
93
  }
50
94
  }
51
-
95
+
52
96
  inContext.setAlpha(opacity)
53
97
  inContext.clip()
54
-
98
+
55
99
  /// First draw a mask is necessary.
56
100
  if drawMask {
57
- guard let maskGradient = CGGradient(colorsSpace: maskColorSpace,
58
- colors: alphaColors as CFArray,
59
- locations: alphaLocations),
60
- let maskContext = CGContext(data: nil,
61
- width: inContext.width,
62
- height: inContext.height,
63
- bitsPerComponent: 8,
64
- bytesPerRow: inContext.width,
65
- space: maskColorSpace,
66
- bitmapInfo: 0) else { return }
101
+ guard
102
+ let maskGradient = CGGradient(
103
+ colorsSpace: maskColorSpace,
104
+ colors: alphaColors as CFArray,
105
+ locations: alphaLocations),
106
+ let maskContext = CGContext(
107
+ data: nil,
108
+ width: inContext.width,
109
+ height: inContext.height,
110
+ bitsPerComponent: 8,
111
+ bytesPerRow: inContext.width,
112
+ space: maskColorSpace,
113
+ bitmapInfo: 0) else { return }
67
114
  let flipVertical = CGAffineTransform(a: 1, b: 0, c: 0, d: -1, tx: 0, ty: CGFloat(maskContext.height))
68
115
  maskContext.concatenate(flipVertical)
69
116
  maskContext.concatenate(inContext.ctm)
70
117
  if type == .linear {
71
- maskContext.drawLinearGradient(maskGradient, start: start, end: end, options: [.drawsAfterEndLocation, .drawsBeforeStartLocation])
118
+ maskContext.drawLinearGradient(
119
+ maskGradient,
120
+ start: start,
121
+ end: end,
122
+ options: [.drawsAfterEndLocation, .drawsBeforeStartLocation])
72
123
  } else {
73
- maskContext.drawRadialGradient(maskGradient, startCenter: start, startRadius: 0, endCenter: start, endRadius: start.distanceTo(end), options: [.drawsAfterEndLocation, .drawsBeforeStartLocation])
124
+ maskContext.drawRadialGradient(
125
+ maskGradient,
126
+ startCenter: start,
127
+ startRadius: 0,
128
+ endCenter: start,
129
+ endRadius: start.distanceTo(end),
130
+ options: [.drawsAfterEndLocation, .drawsBeforeStartLocation])
74
131
  }
75
132
  /// Clips the gradient
76
133
  if let alphaMask = maskContext.makeImage() {
77
134
  inContext.clip(to: inContext.boundingBoxOfClipPath, mask: alphaMask)
78
135
  }
79
136
  }
80
-
137
+
81
138
  /// Now draw the gradient
82
- guard let gradient = CGGradient(colorsSpace: colorSpace, colors: gradientColors as CFArray, locations: colorLocations) else { return }
139
+ guard let gradient = CGGradient(colorsSpace: colorSpace, colors: gradientColors as CFArray, locations: colorLocations)
140
+ else { return }
83
141
  if type == .linear {
84
142
  inContext.drawLinearGradient(gradient, start: start, end: end, options: [.drawsAfterEndLocation, .drawsBeforeStartLocation])
85
143
  } else {
86
- inContext.drawRadialGradient(gradient, startCenter: start, startRadius: 0, endCenter: start, endRadius: start.distanceTo(end), options: [.drawsAfterEndLocation, .drawsBeforeStartLocation])
87
- }
88
- }
89
-
90
- var start: CGPoint = .zero {
91
- didSet {
92
- hasUpdate = true
93
- }
94
- }
95
-
96
- var numberOfColors: Int = 0 {
97
- didSet {
98
- hasUpdate = true
99
- }
100
- }
101
-
102
- var colors: [CGFloat] = [] {
103
- didSet {
104
- hasUpdate = true
105
- }
106
- }
107
-
108
- var end: CGPoint = .zero {
109
- didSet {
110
- hasUpdate = true
111
- }
112
- }
113
-
114
- var opacity: CGFloat = 0 {
115
- didSet {
116
- hasUpdate = true
117
- }
118
- }
119
-
120
- var type: GradientType = .none {
121
- didSet {
122
- hasUpdate = true
144
+ inContext.drawRadialGradient(
145
+ gradient,
146
+ startCenter: start,
147
+ startRadius: 0,
148
+ endCenter: start,
149
+ endRadius: start.distanceTo(end),
150
+ options: [.drawsAfterEndLocation, .drawsBeforeStartLocation])
123
151
  }
124
152
  }
125
-
126
153
  }
@@ -21,7 +21,7 @@ extension LineJoin {
21
21
  return .round
22
22
  }
23
23
  }
24
-
24
+
25
25
  var caLineJoin: CAShapeLayerLineJoin {
26
26
  switch self {
27
27
  case .none:
@@ -49,7 +49,7 @@ extension LineCap {
49
49
  return .square
50
50
  }
51
51
  }
52
-
52
+
53
53
  var caLineCap: CAShapeLayerLineCap {
54
54
  switch self {
55
55
  case .none:
@@ -64,65 +64,69 @@ extension LineCap {
64
64
  }
65
65
  }
66
66
 
67
- // MARK: - Renderer
67
+ // MARK: - StrokeRenderer
68
68
 
69
69
  /// A rendered that renders a stroke on a path.
70
70
  final class StrokeRenderer: PassThroughOutputNode, Renderable {
71
-
72
- var shouldRenderInContext: Bool = false
73
-
71
+
72
+ var shouldRenderInContext = false
73
+
74
74
  var color: CGColor? {
75
75
  didSet {
76
76
  hasUpdate = true
77
77
  }
78
78
  }
79
-
79
+
80
80
  var opacity: CGFloat = 0 {
81
81
  didSet {
82
82
  hasUpdate = true
83
83
  }
84
84
  }
85
-
85
+
86
86
  var width: CGFloat = 0 {
87
87
  didSet {
88
88
  hasUpdate = true
89
89
  }
90
90
  }
91
-
91
+
92
92
  var miterLimit: CGFloat = 0 {
93
93
  didSet {
94
94
  hasUpdate = true
95
95
  }
96
96
  }
97
-
97
+
98
98
  var lineCap: LineCap = .none {
99
99
  didSet {
100
100
  hasUpdate = true
101
101
  }
102
102
  }
103
-
103
+
104
104
  var lineJoin: LineJoin = .none {
105
105
  didSet {
106
106
  hasUpdate = true
107
107
  }
108
108
  }
109
-
109
+
110
110
  var dashPhase: CGFloat? {
111
111
  didSet {
112
112
  hasUpdate = true
113
113
  }
114
114
  }
115
-
115
+
116
116
  var dashLengths: [CGFloat]? {
117
117
  didSet {
118
118
  hasUpdate = true
119
119
  }
120
120
  }
121
-
121
+
122
+ func setupSublayers(layer _: CAShapeLayer) {
123
+ // empty
124
+ }
125
+
122
126
  func renderBoundsFor(_ boundingBox: CGRect) -> CGRect {
123
- return boundingBox.insetBy(dx: -width, dy: -width)
127
+ boundingBox.insetBy(dx: -width, dy: -width)
124
128
  }
125
-
129
+
126
130
  func setupForStroke(_ inContext: CGContext) {
127
131
  inContext.setLineWidth(width)
128
132
  inContext.setMiterLimit(miterLimit)
@@ -134,9 +138,9 @@ final class StrokeRenderer: PassThroughOutputNode, Renderable {
134
138
  inContext.setLineDash(phase: 0, lengths: [])
135
139
  }
136
140
  }
137
-
141
+
138
142
  func render(_ inContext: CGContext) {
139
- guard inContext.path != nil && inContext.path!.isEmpty == false else {
143
+ guard inContext.path != nil, inContext.path!.isEmpty == false else {
140
144
  return
141
145
  }
142
146
  guard let color = color else { return }
@@ -146,7 +150,7 @@ final class StrokeRenderer: PassThroughOutputNode, Renderable {
146
150
  inContext.setStrokeColor(color)
147
151
  inContext.strokePath()
148
152
  }
149
-
153
+
150
154
  func updateShapeLayer(layer: CAShapeLayer) {
151
155
  layer.strokeColor = color
152
156
  layer.opacity = Float(opacity)