lottie-ios 3.2.2 → 3.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (316) hide show
  1. package/.github/actions/setup/action.yml +32 -0
  2. package/.github/issue_template.md +6 -23
  3. package/.github/workflows/main.yml +98 -0
  4. package/.spi.yml +6 -0
  5. package/.swift-version +1 -0
  6. package/.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata +7 -0
  7. package/.swiftpm/xcode/package.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  8. package/.swiftpm/xcode/xcuserdata/{brandonwithrow.xcuserdatad → cal.xcuserdatad}/xcschemes/xcschememanagement.plist +25 -15
  9. package/.swiftpm/xcode/xcuserdata/calstephens.xcuserdatad/xcschemes/xcschememanagement.plist +14 -0
  10. package/Gemfile +4 -0
  11. package/Gemfile.lock +102 -0
  12. package/Lottie.xcodeproj/project.pbxproj +2003 -1972
  13. package/Lottie.xcodeproj/project.xcworkspace/contents.xcworkspacedata +1 -1
  14. package/Lottie.xcodeproj/project.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  15. package/Lottie.xcodeproj/xcshareddata/xcschemes/{Lottie_iOS.xcscheme → Lottie (iOS).xcscheme } +15 -18
  16. package/Lottie.xcodeproj/xcshareddata/xcschemes/{Lottie_macOS.xcscheme → Lottie (macOS).xcscheme } +7 -20
  17. package/Lottie.xcodeproj/xcshareddata/xcschemes/{Lottie_tvOS.xcscheme → Lottie (tvOS).xcscheme } +5 -18
  18. package/Lottie.xcodeproj/xcuserdata/cal.xcuserdatad/xcschemes/xcschememanagement.plist +37 -0
  19. package/Lottie.xcodeproj/xcuserdata/calstephens.xcuserdatad/xcschemes/xcschememanagement.plist +24 -0
  20. package/Lottie.xcworkspace/contents.xcworkspacedata +10 -0
  21. package/Lottie.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
  22. package/Lottie.xcworkspace/xcshareddata/swiftpm/Package.resolved +115 -0
  23. package/Lottie.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  24. package/{Lottie.xcodeproj/xcuserdata/brandonwithrow.xcuserdatad → Lottie.xcworkspace/xcuserdata/cal.xcuserdatad}/xcdebugger/Breakpoints_v2.xcbkptlist +2 -2
  25. package/Lottie.xcworkspace/xcuserdata/cal.xcuserdatad/xcdebugger/Expressions.xcexplist +153 -0
  26. package/Lottie.xcworkspace/xcuserdata/calstephens.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  27. package/Lottie.xcworkspace/xcuserdata/calstephens.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +39 -0
  28. package/Lottie.xcworkspace/xcuserdata/calstephens.xcuserdatad/xcdebugger/Expressions.xcexplist +25 -0
  29. package/Lottie.xcworkspace/xcuserdata/calstephens.xcuserdatad/xcschemes/xcschememanagement.plist +30 -0
  30. package/Package.resolved +88 -0
  31. package/Package.swift +10 -15
  32. package/README.md +40 -60
  33. package/Rakefile +121 -0
  34. package/Sources/Private/CoreAnimation/Animations/CAAnimation+TimingConfiguration.swift +81 -0
  35. package/Sources/Private/CoreAnimation/Animations/CALayer+addAnimation.swift +448 -0
  36. package/Sources/Private/CoreAnimation/Animations/CombinedShapeAnimation.swift +53 -0
  37. package/Sources/Private/CoreAnimation/Animations/CustomPathAnimation.swift +41 -0
  38. package/Sources/Private/CoreAnimation/Animations/EllipseAnimation.swift +28 -0
  39. package/Sources/Private/CoreAnimation/Animations/GradientAnimations.swift +210 -0
  40. package/Sources/Private/CoreAnimation/Animations/LayerProperty.swift +229 -0
  41. package/Sources/Private/CoreAnimation/Animations/OpacityAnimation.swift +52 -0
  42. package/Sources/Private/CoreAnimation/Animations/RectangleAnimation.swift +31 -0
  43. package/Sources/Private/CoreAnimation/Animations/ShapeAnimation.swift +246 -0
  44. package/Sources/Private/CoreAnimation/Animations/StarAnimation.swift +95 -0
  45. package/Sources/Private/CoreAnimation/Animations/StrokeAnimation.swift +70 -0
  46. package/Sources/Private/CoreAnimation/Animations/TransformAnimations.swift +205 -0
  47. package/Sources/Private/CoreAnimation/Animations/VisibilityAnimation.swift +37 -0
  48. package/Sources/Private/CoreAnimation/CompatibilityTracker.swift +130 -0
  49. package/Sources/Private/CoreAnimation/CoreAnimationLayer.swift +492 -0
  50. package/Sources/Private/CoreAnimation/Extensions/CALayer+fillBounds.swift +35 -0
  51. package/Sources/Private/CoreAnimation/Extensions/KeyframeGroup+exactlyOneKeyframe.swift +37 -0
  52. package/Sources/Private/CoreAnimation/Extensions/Keyframes+combinedIfPossible.swift +73 -0
  53. package/Sources/Private/CoreAnimation/Layers/AnimationLayer.swift +83 -0
  54. package/Sources/Private/CoreAnimation/Layers/BaseAnimationLayer.swift +33 -0
  55. package/Sources/Private/CoreAnimation/Layers/BaseCompositionLayer.swift +87 -0
  56. package/Sources/Private/CoreAnimation/Layers/CALayer+setupLayerHierarchy.swift +131 -0
  57. package/Sources/Private/CoreAnimation/Layers/GradientRenderLayer.swift +94 -0
  58. package/Sources/Private/CoreAnimation/Layers/ImageLayer.swift +79 -0
  59. package/Sources/Private/CoreAnimation/Layers/LayerModel+makeAnimationLayer.swift +60 -0
  60. package/Sources/Private/CoreAnimation/Layers/MaskCompositionLayer.swift +138 -0
  61. package/Sources/Private/CoreAnimation/Layers/PreCompLayer.swift +140 -0
  62. package/Sources/Private/CoreAnimation/Layers/ShapeItemLayer.swift +302 -0
  63. package/Sources/Private/CoreAnimation/Layers/ShapeLayer.swift +319 -0
  64. package/Sources/Private/CoreAnimation/Layers/SolidLayer.swift +47 -0
  65. package/Sources/Private/CoreAnimation/Layers/TextLayer.swift +91 -0
  66. package/Sources/Private/CoreAnimation/Layers/TransformLayer.swift +11 -0
  67. package/Sources/Private/CoreAnimation/ValueProviderStore.swift +139 -0
  68. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/CompositionLayer.swift +93 -85
  69. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/ImageCompositionLayer.swift +24 -21
  70. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/MaskContainerLayer.swift +75 -54
  71. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/NullCompositionLayer.swift +5 -5
  72. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/PreCompositionLayer.swift +61 -44
  73. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/ShapeCompositionLayer.swift +22 -20
  74. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/SolidCompositionLayer.swift +26 -17
  75. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/TextCompositionLayer.swift +42 -36
  76. package/{lottie-swift/src/Private/LayerContainers/AnimationContainer.swift → Sources/Private/MainThread/LayerContainers/MainThreadAnimationLayer.swift} +200 -140
  77. package/Sources/Private/MainThread/LayerContainers/Utility/CachedImageProvider.swift +47 -0
  78. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/Utility/CompositionLayersInitializer.swift +33 -24
  79. package/{lottie-swift/src/Private/LayerContainers/Utility/TextLayer.swift → Sources/Private/MainThread/LayerContainers/Utility/CoreTextRenderLayer.swift} +120 -106
  80. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/Utility/InvertedMatteLayer.swift +25 -24
  81. package/Sources/Private/MainThread/LayerContainers/Utility/LayerFontProvider.swift +41 -0
  82. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/Utility/LayerImageProvider.swift +20 -16
  83. package/Sources/Private/MainThread/LayerContainers/Utility/LayerTextProvider.swift +40 -0
  84. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/Utility/LayerTransformNode.swift +82 -67
  85. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Extensions/ItemsExtension.swift +4 -4
  86. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/NodeProperty.swift +29 -21
  87. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/Protocols/AnyNodeProperty.swift +16 -10
  88. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/Protocols/AnyValueContainer.swift +6 -6
  89. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/Protocols/KeypathSearchable.swift +5 -5
  90. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/Protocols/NodePropertyMap.swift +10 -8
  91. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/ValueContainer.swift +25 -21
  92. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/ValueProviders/GroupInterpolator.swift +23 -17
  93. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/ValueProviders/KeyframeInterpolator.swift +125 -108
  94. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/ValueProviders/SingleValueProvider.swift +22 -17
  95. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/ModifierNodes/TrimPathNode.swift +110 -79
  96. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/OutputNodes/GroupOutputNode.swift +22 -16
  97. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/OutputNodes/PassThroughOutputNode.swift +19 -15
  98. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/OutputNodes/PathOutputNode.swift +22 -20
  99. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/OutputNodes/Renderables/FillRenderer.swift +22 -23
  100. package/Sources/Private/MainThread/NodeRenderSystem/Nodes/OutputNodes/Renderables/GradientFillRenderer.swift +242 -0
  101. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/OutputNodes/Renderables/GradientStrokeRenderer.swift +30 -24
  102. package/{lottie-swift/src/Private/NodeRenderSystem/Nodes/OutputNodes/Renderables/GradientFillRenderer.swift → Sources/Private/MainThread/NodeRenderSystem/Nodes/OutputNodes/Renderables/LegacyGradientFillRenderer.swift} +93 -66
  103. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/OutputNodes/Renderables/StrokeRenderer.swift +23 -19
  104. package/Sources/Private/MainThread/NodeRenderSystem/Nodes/PathNodes/EllipseNode.swift +139 -0
  105. package/Sources/Private/MainThread/NodeRenderSystem/Nodes/PathNodes/PolygonNode.swift +170 -0
  106. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/PathNodes/RectNode.swift +95 -58
  107. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/PathNodes/ShapeNode.swift +42 -29
  108. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/PathNodes/StarNode.swift +108 -69
  109. package/Sources/Private/MainThread/NodeRenderSystem/Nodes/RenderContainers/GroupNode.swift +155 -0
  110. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/RenderNodes/FillNode.swift +51 -37
  111. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/RenderNodes/GradientFillNode.swift +54 -42
  112. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/RenderNodes/GradientStrokeNode.swift +65 -57
  113. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/RenderNodes/StrokeNode.swift +84 -58
  114. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/Text/TextAnimatorNode.swift +138 -119
  115. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Protocols/AnimatorNode.swift +80 -79
  116. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Protocols/PathNode.swift +5 -3
  117. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Protocols/RenderNode.swift +22 -17
  118. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/RenderLayers/ShapeContainerLayer.swift +27 -24
  119. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/RenderLayers/ShapeRenderLayer.swift +34 -25
  120. package/Sources/Private/Model/Animation.swift +160 -0
  121. package/Sources/Private/Model/Assets/Asset.swift +43 -0
  122. package/{lottie-swift/src → Sources}/Private/Model/Assets/AssetLibrary.swift +40 -13
  123. package/Sources/Private/Model/Assets/ImageAsset.swift +112 -0
  124. package/{lottie-swift/src → Sources}/Private/Model/Assets/PrecompAsset.swift +20 -10
  125. package/Sources/Private/Model/DictionaryInitializable.swift +67 -0
  126. package/Sources/Private/Model/Extensions/Bundle.swift +34 -0
  127. package/{lottie-swift/src → Sources}/Private/Model/Extensions/KeyedDecodingContainerExtensions.swift +8 -4
  128. package/Sources/Private/Model/Keyframes/KeyframeData.swift +113 -0
  129. package/Sources/Private/Model/Keyframes/KeyframeGroup.swift +197 -0
  130. package/{lottie-swift/src → Sources}/Private/Model/Layers/ImageLayerModel.swift +21 -11
  131. package/Sources/Private/Model/Layers/LayerModel.swift +228 -0
  132. package/{lottie-swift/src → Sources}/Private/Model/Layers/PreCompLayerModel.swift +39 -22
  133. package/{lottie-swift/src → Sources}/Private/Model/Layers/ShapeLayerModel.swift +23 -12
  134. package/{lottie-swift/src → Sources}/Private/Model/Layers/SolidLayerModel.swift +31 -19
  135. package/{lottie-swift/src → Sources}/Private/Model/Layers/TextLayerModel.swift +33 -19
  136. package/Sources/Private/Model/Objects/DashPattern.swift +44 -0
  137. package/Sources/Private/Model/Objects/Marker.swift +33 -0
  138. package/Sources/Private/Model/Objects/Mask.swift +80 -0
  139. package/Sources/Private/Model/Objects/Transform.swift +179 -0
  140. package/Sources/Private/Model/ShapeItems/Ellipse.swift +75 -0
  141. package/Sources/Private/Model/ShapeItems/Fill.swift +74 -0
  142. package/Sources/Private/Model/ShapeItems/GradientFill.swift +124 -0
  143. package/Sources/Private/Model/ShapeItems/GradientStroke.swift +186 -0
  144. package/Sources/Private/Model/ShapeItems/Group.swift +48 -0
  145. package/{lottie-swift/src → Sources}/Private/Model/ShapeItems/Merge.swift +29 -11
  146. package/Sources/Private/Model/ShapeItems/Rectangle.swift +73 -0
  147. package/Sources/Private/Model/ShapeItems/Repeater.swift +136 -0
  148. package/Sources/Private/Model/ShapeItems/Shape.swift +56 -0
  149. package/Sources/Private/Model/ShapeItems/ShapeItem.swift +163 -0
  150. package/Sources/Private/Model/ShapeItems/ShapeTransform.swift +136 -0
  151. package/Sources/Private/Model/ShapeItems/Star.swift +132 -0
  152. package/Sources/Private/Model/ShapeItems/Stroke.swift +102 -0
  153. package/Sources/Private/Model/ShapeItems/Trim.swift +78 -0
  154. package/Sources/Private/Model/Text/Font.swift +61 -0
  155. package/{lottie-swift/src → Sources}/Private/Model/Text/Glyph.swift +63 -39
  156. package/Sources/Private/Model/Text/TextAnimator.swift +164 -0
  157. package/Sources/Private/Model/Text/TextDocument.swift +123 -0
  158. package/Sources/Private/RootAnimationLayer.swift +51 -0
  159. package/{lottie-swift/src → Sources}/Private/Utility/Debugging/AnimatorNodeDebugging.swift +7 -7
  160. package/{lottie-swift/src → Sources}/Private/Utility/Debugging/LayerDebugging.swift +72 -48
  161. package/Sources/Private/Utility/Debugging/TestHelpers.swift +10 -0
  162. package/{lottie-swift/src → Sources}/Private/Utility/Extensions/AnimationKeypathExtension.swift +69 -59
  163. package/Sources/Private/Utility/Extensions/BlendMode+Filter.swift +31 -0
  164. package/Sources/Private/Utility/Extensions/CGColor+RGB.swift +22 -0
  165. package/{lottie-swift/src → Sources}/Private/Utility/Extensions/CGFloatExtensions.swift +70 -67
  166. package/Sources/Private/Utility/Extensions/DataExtension.swift +27 -0
  167. package/Sources/Private/Utility/Extensions/MathKit.swift +450 -0
  168. package/Sources/Private/Utility/Extensions/StringExtensions.swift +38 -0
  169. package/{lottie-swift/src → Sources}/Private/Utility/Helpers/AnimationContext.swift +42 -16
  170. package/Sources/Private/Utility/Interpolatable/InterpolatableExtensions.swift +134 -0
  171. package/{lottie-swift/src → Sources}/Private/Utility/Interpolatable/KeyframeExtensions.swift +13 -10
  172. package/Sources/Private/Utility/Interpolatable/KeyframeGroup+Extensions.swift +59 -0
  173. package/{lottie-swift/src → Sources}/Private/Utility/Primitives/BezierPath.swift +229 -143
  174. package/Sources/Private/Utility/Primitives/CGPointExtension.swift +35 -0
  175. package/{lottie-swift/src → Sources}/Private/Utility/Primitives/ColorExtension.swift +46 -14
  176. package/{lottie-swift/src → Sources}/Private/Utility/Primitives/CompoundBezierPath.swift +58 -49
  177. package/Sources/Private/Utility/Primitives/CurveVertex.swift +184 -0
  178. package/Sources/Private/Utility/Primitives/PathElement.swift +75 -0
  179. package/Sources/Private/Utility/Primitives/UnitBezier.swift +115 -0
  180. package/Sources/Private/Utility/Primitives/VectorsExtensions.swift +341 -0
  181. package/Sources/Public/Animation/AnimationPublic.swift +266 -0
  182. package/Sources/Public/Animation/AnimationView.swift +1335 -0
  183. package/Sources/Public/Animation/AnimationViewInitializers.swift +109 -0
  184. package/Sources/Public/AnimationCache/AnimationCacheProvider.swift +22 -0
  185. package/{lottie-swift/src → Sources}/Public/AnimationCache/LRUAnimationCache.swift +22 -18
  186. package/Sources/Public/DynamicProperties/AnimationKeypath.swift +49 -0
  187. package/Sources/Public/DynamicProperties/AnyValueProvider.swift +132 -0
  188. package/{lottie-swift/src → Sources}/Public/DynamicProperties/ValueProviders/ColorValueProvider.swift +54 -36
  189. package/{lottie-swift/src → Sources}/Public/DynamicProperties/ValueProviders/FloatValueProvider.swift +40 -36
  190. package/Sources/Public/DynamicProperties/ValueProviders/GradientValueProvider.swift +123 -0
  191. package/{lottie-swift/src → Sources}/Public/DynamicProperties/ValueProviders/PointValueProvider.swift +40 -35
  192. package/{lottie-swift/src → Sources}/Public/DynamicProperties/ValueProviders/SizeValueProvider.swift +40 -35
  193. package/{lottie-swift/src → Sources}/Public/FontProvider/AnimationFontProvider.swift +15 -8
  194. package/Sources/Public/ImageProvider/AnimationImageProvider.swift +21 -0
  195. package/Sources/Public/Keyframes/Interpolatable.swift +253 -0
  196. package/Sources/Public/Keyframes/Keyframe.swift +92 -0
  197. package/Sources/Public/Logging/LottieLogger.swift +137 -0
  198. package/Sources/Public/LottieConfiguration.swift +143 -0
  199. package/{lottie-swift/src → Sources}/Public/Primitives/AnimationTime.swift +1 -1
  200. package/{lottie-swift/src → Sources}/Public/Primitives/Color.swift +10 -6
  201. package/{lottie-swift/src → Sources}/Public/Primitives/Vectors.swift +13 -12
  202. package/Sources/Public/TextProvider/AnimationTextProvider.swift +53 -0
  203. package/{lottie-swift/src → Sources}/Public/iOS/AnimatedButton.swift +42 -26
  204. package/{lottie-swift/src → Sources}/Public/iOS/AnimatedControl.swift +100 -91
  205. package/{lottie-swift/src → Sources}/Public/iOS/AnimatedSwitch.swift +128 -94
  206. package/{lottie-swift/src → Sources}/Public/iOS/AnimationSubview.swift +3 -3
  207. package/Sources/Public/iOS/AnimationViewBase.swift +78 -0
  208. package/{lottie-swift/src → Sources}/Public/iOS/BundleImageProvider.swift +36 -34
  209. package/{lottie-swift/src → Sources}/Public/iOS/Compatibility/CompatibleAnimationKeypath.swift +4 -0
  210. package/{lottie-swift/src → Sources}/Public/iOS/Compatibility/CompatibleAnimationView.swift +38 -29
  211. package/{lottie-swift/src → Sources}/Public/iOS/FilepathImageProvider.swift +24 -21
  212. package/{lottie-swift/src → Sources}/Public/iOS/UIColorExtension.swift +4 -4
  213. package/{lottie-swift/src/Public/MacOS/AnimationSubview.swift → Sources/Public/macOS/AnimationSubview.macOS.swift} +4 -5
  214. package/{lottie-swift/src/Public/MacOS/LottieView.swift → Sources/Public/macOS/AnimationViewBase.macOS.swift} +58 -50
  215. package/{lottie-swift/src/Public/MacOS/BundleImageProvider.swift → Sources/Public/macOS/BundleImageProvider.macOS.swift} +31 -32
  216. package/Sources/Public/macOS/FilepathImageProvider.macOS.swift +67 -0
  217. package/Tests/AnimationKeypathTests.swift +94 -0
  218. package/Tests/AutomaticEngineTests.swift +57 -0
  219. package/Tests/BundleTests.swift +25 -0
  220. package/Tests/DataURLTests.swift +64 -0
  221. package/Tests/ParsingTests.swift +43 -0
  222. package/Tests/PerformanceTests.swift +215 -0
  223. package/Tests/SnapshotConfiguration.swift +153 -0
  224. package/Tests/SnapshotTests.swift +265 -0
  225. package/Tests/Utils/Bundle+Module.swift +30 -0
  226. package/Tests/Utils/HardcodedFontProvider.swift +19 -0
  227. package/Tests/Utils/HardcodedImageProvider.swift +23 -0
  228. package/Tests/Utils/Snapshotting+presentationLayer.swift +47 -0
  229. package/Tests/ValueProvidersTests.swift +27 -0
  230. package/lottie-ios.podspec +11 -12
  231. package/package.json +1 -1
  232. package/script/test-carthage/Cartfile +1 -0
  233. package/script/test-carthage/Cartfile.resolved +1 -0
  234. package/script/test-carthage/CarthageTest/AppDelegate.swift +26 -0
  235. package/script/test-carthage/CarthageTest/Assets.xcassets/AccentColor.colorset/Contents.json +11 -0
  236. package/script/test-carthage/CarthageTest/Assets.xcassets/AppIcon.appiconset/Contents.json +98 -0
  237. package/script/test-carthage/CarthageTest/Assets.xcassets/Contents.json +6 -0
  238. package/script/test-carthage/CarthageTest/Base.lproj/LaunchScreen.storyboard +25 -0
  239. package/script/test-carthage/CarthageTest/Base.lproj/Main.storyboard +24 -0
  240. package/script/test-carthage/CarthageTest/Info.plist +66 -0
  241. package/script/test-carthage/CarthageTest/SceneDelegate.swift +10 -0
  242. package/script/test-carthage/CarthageTest/ViewController.swift +15 -0
  243. package/script/test-carthage/CarthageTest-macOS/AppDelegate.swift +7 -0
  244. package/script/test-carthage/CarthageTest-macOS/Assets.xcassets/AccentColor.colorset/Contents.json +11 -0
  245. package/script/test-carthage/CarthageTest-macOS/Assets.xcassets/AppIcon.appiconset/Contents.json +58 -0
  246. package/script/test-carthage/CarthageTest-macOS/Assets.xcassets/Contents.json +6 -0
  247. package/script/test-carthage/CarthageTest-macOS/Base.lproj/Main.storyboard +717 -0
  248. package/script/test-carthage/CarthageTest-macOS/CarthageTest_macOS.entitlements +10 -0
  249. package/script/test-carthage/CarthageTest-macOS/ViewController.swift +15 -0
  250. package/script/test-carthage/CarthageTest.xcodeproj/project.pbxproj +532 -0
  251. package/script/test-carthage/CarthageTest.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
  252. package/script/test-carthage/CarthageTest.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
  253. package/script/test-carthage/CarthageTest.xcodeproj/project.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  254. package/script/test-carthage/CarthageTest.xcodeproj/project.xcworkspace/xcuserdata/calstephens.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  255. package/script/test-carthage/CarthageTest.xcodeproj/xcuserdata/cal.xcuserdatad/xcschemes/xcschememanagement.plist +14 -0
  256. package/script/test-carthage/CarthageTest.xcodeproj/xcuserdata/calstephens.xcuserdatad/xcschemes/xcschememanagement.plist +19 -0
  257. package/script/test-carthage/Mintfile +1 -0
  258. package/script/test-spm/LottieSPM.xcworkspace/contents.xcworkspacedata +7 -0
  259. package/script/test-spm/LottieSPM.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  260. package/script/test-spm/Mintfile +1 -0
  261. package/.swiftpm/xcode/package.xcworkspace/xcuserdata/brandonwithrow.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  262. package/Lottie/Info.plist +0 -22
  263. package/Lottie.xcodeproj/project.xcworkspace/xcuserdata/brandonwithrow.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  264. package/Lottie.xcodeproj/xcuserdata/brandonwithrow.xcuserdatad/xcschemes/LottieLibraryMacOS.xcscheme +0 -80
  265. package/Lottie.xcodeproj/xcuserdata/brandonwithrow.xcuserdatad/xcschemes/xcschememanagement.plist +0 -57
  266. package/lottie-swift/Assets/.gitkeep +0 -0
  267. package/lottie-swift/src/Private/LayerContainers/Utility/LayerFontProvider.swift +0 -37
  268. package/lottie-swift/src/Private/LayerContainers/Utility/LayerTextProvider.swift +0 -36
  269. package/lottie-swift/src/Private/Model/Animation.swift +0 -107
  270. package/lottie-swift/src/Private/Model/Assets/Asset.swift +0 -27
  271. package/lottie-swift/src/Private/Model/Assets/ImageAsset.swift +0 -48
  272. package/lottie-swift/src/Private/Model/Keyframes/Keyframe.swift +0 -128
  273. package/lottie-swift/src/Private/Model/Keyframes/KeyframeGroup.swift +0 -108
  274. package/lottie-swift/src/Private/Model/Layers/LayerModel.swift +0 -150
  275. package/lottie-swift/src/Private/Model/Objects/DashPattern.swift +0 -24
  276. package/lottie-swift/src/Private/Model/Objects/Marker.swift +0 -23
  277. package/lottie-swift/src/Private/Model/Objects/Mask.swift +0 -48
  278. package/lottie-swift/src/Private/Model/Objects/Transform.swift +0 -105
  279. package/lottie-swift/src/Private/Model/ShapeItems/Ellipse.swift +0 -50
  280. package/lottie-swift/src/Private/Model/ShapeItems/FillI.swift +0 -49
  281. package/lottie-swift/src/Private/Model/ShapeItems/GradientFill.swift +0 -86
  282. package/lottie-swift/src/Private/Model/ShapeItems/GradientStroke.swift +0 -125
  283. package/lottie-swift/src/Private/Model/ShapeItems/Group.swift +0 -32
  284. package/lottie-swift/src/Private/Model/ShapeItems/Rectangle.swift +0 -50
  285. package/lottie-swift/src/Private/Model/ShapeItems/Repeater.swift +0 -80
  286. package/lottie-swift/src/Private/Model/ShapeItems/Shape.swift +0 -37
  287. package/lottie-swift/src/Private/Model/ShapeItems/ShapeItem.swift +0 -95
  288. package/lottie-swift/src/Private/Model/ShapeItems/ShapeTransform.swift +0 -68
  289. package/lottie-swift/src/Private/Model/ShapeItems/Star.swift +0 -86
  290. package/lottie-swift/src/Private/Model/ShapeItems/Stroke.swift +0 -67
  291. package/lottie-swift/src/Private/Model/ShapeItems/Trim.swift +0 -53
  292. package/lottie-swift/src/Private/Model/Text/Font.swift +0 -35
  293. package/lottie-swift/src/Private/Model/Text/TextAnimator.swift +0 -99
  294. package/lottie-swift/src/Private/Model/Text/TextDocument.swift +0 -70
  295. package/lottie-swift/src/Private/NodeRenderSystem/Nodes/PathNodes/EllipseNode.swift +0 -109
  296. package/lottie-swift/src/Private/NodeRenderSystem/Nodes/PathNodes/PolygonNode.swift +0 -132
  297. package/lottie-swift/src/Private/NodeRenderSystem/Nodes/RenderContainers/GroupNode.swift +0 -141
  298. package/lottie-swift/src/Private/Utility/Extensions/MathKit.swift +0 -539
  299. package/lottie-swift/src/Private/Utility/Extensions/StringExtensions.swift +0 -32
  300. package/lottie-swift/src/Private/Utility/Interpolatable/Interpolatable.swift +0 -18
  301. package/lottie-swift/src/Private/Utility/Interpolatable/InterpolatableExtensions.swift +0 -170
  302. package/lottie-swift/src/Private/Utility/Primitives/CurveVertex.swift +0 -177
  303. package/lottie-swift/src/Private/Utility/Primitives/PathElement.swift +0 -68
  304. package/lottie-swift/src/Private/Utility/Primitives/VectorsExtensions.swift +0 -218
  305. package/lottie-swift/src/Public/Animation/AnimationPublic.swift +0 -196
  306. package/lottie-swift/src/Public/Animation/AnimationView.swift +0 -1006
  307. package/lottie-swift/src/Public/Animation/AnimationViewInitializers.swift +0 -83
  308. package/lottie-swift/src/Public/AnimationCache/AnimationCacheProvider.swift +0 -24
  309. package/lottie-swift/src/Public/DynamicProperties/AnimationKeypath.swift +0 -46
  310. package/lottie-swift/src/Public/DynamicProperties/AnyValueProvider.swift +0 -29
  311. package/lottie-swift/src/Public/DynamicProperties/ValueProviders/GradientValueProvider.swift +0 -114
  312. package/lottie-swift/src/Public/ImageProvider/AnimationImageProvider.swift +0 -23
  313. package/lottie-swift/src/Public/MacOS/FilepathImageProvider.swift +0 -67
  314. package/lottie-swift/src/Public/TextProvider/AnimationTextProvider.swift +0 -39
  315. package/lottie-swift/src/Public/iOS/LottieView.swift +0 -62
  316. package/lottie-swift-testing.podspec +0 -32
@@ -0,0 +1,242 @@
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
+ func render(_: CGContext) {
202
+ // do nothing
203
+ }
204
+
205
+ func setupSublayers(layer: CAShapeLayer) {
206
+ layer.addSublayer(gradientLayer)
207
+ layer.fillColor = nil
208
+ }
209
+
210
+ func updateShapeLayer(layer: CAShapeLayer) {
211
+ hasUpdate = false
212
+
213
+ guard let path = layer.path else {
214
+ return
215
+ }
216
+
217
+ let frame = path.boundingBox
218
+ let anchor = CGPoint(
219
+ x: -frame.origin.x / frame.size.width,
220
+ y: -frame.origin.y / frame.size.height)
221
+ maskLayer.path = path
222
+ maskLayer.bounds = path.boundingBox
223
+ maskLayer.anchorPoint = anchor
224
+
225
+ gradientLayer.bounds = maskLayer.bounds
226
+ gradientLayer.anchorPoint = anchor
227
+
228
+ // setup gradient properties
229
+ gradientLayer.start = start
230
+ gradientLayer.end = end
231
+ gradientLayer.numberOfColors = numberOfColors
232
+ gradientLayer.colors = colors
233
+ gradientLayer.opacity = Float(opacity)
234
+ gradientLayer.type = type
235
+ }
236
+
237
+ // MARK: Private
238
+
239
+ private let gradientLayer = GradientFillLayer()
240
+ private let maskLayer = CAShapeLayer()
241
+
242
+ }
@@ -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)