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
@@ -29,13 +29,17 @@ extension MaskMode {
29
29
  }
30
30
  }
31
31
 
32
+ // MARK: - MaskContainerLayer
33
+
32
34
  final class MaskContainerLayer: CALayer {
33
-
35
+
36
+ // MARK: Lifecycle
37
+
34
38
  init(masks: [Mask]) {
35
39
  super.init()
36
40
  anchorPoint = .zero
37
41
  var containerLayer = CALayer()
38
- var firstObject: Bool = true
42
+ var firstObject = true
39
43
  for mask in masks {
40
44
  let maskLayer = MaskLayer(mask: mask)
41
45
  maskLayers.append(maskLayer)
@@ -53,7 +57,7 @@ final class MaskContainerLayer: CALayer {
53
57
  }
54
58
  addSublayer(containerLayer)
55
59
  }
56
-
60
+
57
61
  override init(layer: Any) {
58
62
  /// Used for creating shadow model layers. Read More here: https://developer.apple.com/documentation/quartzcore/calayer/1410842-init
59
63
  guard let layer = layer as? MaskContainerLayer else {
@@ -61,71 +65,84 @@ final class MaskContainerLayer: CALayer {
61
65
  }
62
66
  super.init(layer: layer)
63
67
  }
64
-
65
- fileprivate var maskLayers: [MaskLayer] = []
66
-
68
+
69
+ required init?(coder _: NSCoder) {
70
+ fatalError("init(coder:) has not been implemented")
71
+ }
72
+
73
+ // MARK: Internal
74
+
67
75
  func updateWithFrame(frame: CGFloat, forceUpdates: Bool) {
68
76
  maskLayers.forEach({ $0.updateWithFrame(frame: frame, forceUpdates: forceUpdates) })
69
77
  }
70
-
71
- required init?(coder aDecoder: NSCoder) {
72
- fatalError("init(coder:) has not been implemented")
73
- }
78
+
79
+ // MARK: Fileprivate
80
+
81
+ fileprivate var maskLayers: [MaskLayer] = []
74
82
  }
75
83
 
76
84
  extension CGRect {
77
85
  static var veryLargeRect: CGRect {
78
- return CGRect(x: -100_000_000,
79
- y: -100_000_000,
80
- width: 200_000_000,
81
- height: 200_000_000)
86
+ CGRect(
87
+ x: -100_000_000,
88
+ y: -100_000_000,
89
+ width: 200_000_000,
90
+ height: 200_000_000)
82
91
  }
83
92
  }
84
93
 
85
- fileprivate class MaskLayer: CALayer {
86
-
87
- let properties: MaskNodeProperties?
88
-
89
- let maskLayer = CAShapeLayer()
90
-
94
+ // MARK: - MaskLayer
95
+
96
+ private class MaskLayer: CALayer {
97
+
98
+ // MARK: Lifecycle
99
+
91
100
  init(mask: Mask) {
92
- self.properties = MaskNodeProperties(mask: mask)
101
+ properties = MaskNodeProperties(mask: mask)
93
102
  super.init()
94
103
  addSublayer(maskLayer)
95
104
  anchorPoint = .zero
96
- maskLayer.fillColor = mask.mode == .add ? CGColor(colorSpace: CGColorSpaceCreateDeviceRGB(), components: [1, 0, 0, 1]) :
97
- CGColor(colorSpace: CGColorSpaceCreateDeviceRGB(), components: [0, 1, 0, 1])
105
+ maskLayer.fillColor = mask.mode == .add
106
+ ? CGColor(colorSpace: CGColorSpaceCreateDeviceRGB(), components: [1, 0, 0, 1])
107
+ : CGColor(colorSpace: CGColorSpaceCreateDeviceRGB(), components: [0, 1, 0, 1])
98
108
  maskLayer.fillRule = CAShapeLayerFillRule.evenOdd
99
- self.actions = [
100
- "opacity" : NSNull()
109
+ actions = [
110
+ "opacity" : NSNull(),
101
111
  ]
102
-
103
112
  }
104
-
113
+
105
114
  override init(layer: Any) {
106
- self.properties = nil
115
+ properties = nil
107
116
  super.init(layer: layer)
108
117
  }
109
-
110
- required init?(coder aDecoder: NSCoder) {
118
+
119
+ required init?(coder _: NSCoder) {
111
120
  fatalError("init(coder:) has not been implemented")
112
121
  }
113
-
122
+
123
+ // MARK: Internal
124
+
125
+ let properties: MaskNodeProperties?
126
+
127
+ let maskLayer = CAShapeLayer()
128
+
114
129
  func updateWithFrame(frame: CGFloat, forceUpdates: Bool) {
115
130
  guard let properties = properties else { return }
116
131
  if properties.opacity.needsUpdate(frame: frame) || forceUpdates {
117
132
  properties.opacity.update(frame: frame)
118
- self.opacity = Float(properties.opacity.value.cgFloatValue)
133
+ opacity = Float(properties.opacity.value.cgFloatValue)
119
134
  }
120
-
135
+
121
136
  if properties.shape.needsUpdate(frame: frame) || forceUpdates {
122
137
  properties.shape.update(frame: frame)
123
138
  properties.expansion.update(frame: frame)
124
-
139
+
125
140
  let shapePath = properties.shape.value.cgPath()
126
141
  var path = shapePath
127
- if properties.mode.usableMode == .subtract && !properties.inverted ||
128
- (properties.mode.usableMode == .add && properties.inverted) {
142
+ if
143
+ properties.mode.usableMode == .subtract && !properties.inverted ||
144
+ (properties.mode.usableMode == .add && properties.inverted)
145
+ {
129
146
  /// Add a bounds rect to invert the mask
130
147
  let newPath = CGMutablePath()
131
148
  newPath.addRect(CGRect.veryLargeRect)
@@ -134,35 +151,39 @@ fileprivate class MaskLayer: CALayer {
134
151
  }
135
152
  maskLayer.path = path
136
153
  }
137
-
138
154
  }
139
155
  }
140
156
 
141
- fileprivate class MaskNodeProperties: NodePropertyMap {
142
-
143
- var propertyMap: [String : AnyNodeProperty]
144
-
145
- var properties: [AnyNodeProperty]
146
-
157
+ // MARK: - MaskNodeProperties
158
+
159
+ private class MaskNodeProperties: NodePropertyMap {
160
+
161
+ // MARK: Lifecycle
162
+
147
163
  init(mask: Mask) {
148
- self.mode = mask.mode
149
- self.inverted = mask.inverted
150
- self.opacity = NodeProperty(provider: KeyframeInterpolator(keyframes: mask.opacity.keyframes))
151
- self.shape = NodeProperty(provider: KeyframeInterpolator(keyframes: mask.shape.keyframes))
152
- self.expansion = NodeProperty(provider: KeyframeInterpolator(keyframes: mask.expansion.keyframes))
153
- self.propertyMap = [
164
+ mode = mask.mode
165
+ inverted = mask.inverted
166
+ opacity = NodeProperty(provider: KeyframeInterpolator(keyframes: mask.opacity.keyframes))
167
+ shape = NodeProperty(provider: KeyframeInterpolator(keyframes: mask.shape.keyframes))
168
+ expansion = NodeProperty(provider: KeyframeInterpolator(keyframes: mask.expansion.keyframes))
169
+ propertyMap = [
154
170
  "Opacity" : opacity,
155
171
  "Shape" : shape,
156
- "Expansion" : expansion
172
+ "Expansion" : expansion,
157
173
  ]
158
- self.properties = Array(self.propertyMap.values)
174
+ properties = Array(propertyMap.values)
159
175
  }
160
-
176
+
177
+ // MARK: Internal
178
+
179
+ var propertyMap: [String: AnyNodeProperty]
180
+
181
+ var properties: [AnyNodeProperty]
182
+
161
183
  let mode: MaskMode
162
184
  let inverted: Bool
163
-
185
+
164
186
  let opacity: NodeProperty<Vector1D>
165
187
  let shape: NodeProperty<BezierPath>
166
188
  let expansion: NodeProperty<Vector1D>
167
189
  }
168
-
@@ -8,15 +8,15 @@
8
8
  import Foundation
9
9
 
10
10
  final class NullCompositionLayer: CompositionLayer {
11
-
11
+
12
12
  init(layer: LayerModel) {
13
13
  super.init(layer: layer, size: .zero)
14
14
  }
15
-
16
- required init?(coder aDecoder: NSCoder) {
15
+
16
+ required init?(coder _: NSCoder) {
17
17
  fatalError("init(coder:) has not been implemented")
18
18
  }
19
-
19
+
20
20
  override init(layer: Any) {
21
21
  /// Used for creating shadow model layers. Read More here: https://developer.apple.com/documentation/quartzcore/calayer/1410842-init
22
22
  guard let layer = layer as? NullCompositionLayer else {
@@ -24,5 +24,5 @@ final class NullCompositionLayer: CompositionLayer {
24
24
  }
25
25
  super.init(layer: layer)
26
26
  }
27
-
27
+
28
28
  }
@@ -9,36 +9,41 @@ import Foundation
9
9
  import QuartzCore
10
10
 
11
11
  final class PreCompositionLayer: CompositionLayer {
12
-
13
- let frameRate: CGFloat
14
- let remappingNode: NodeProperty<Vector1D>?
15
- fileprivate var animationLayers: [CompositionLayer]
16
-
17
- init(precomp: PreCompLayerModel,
18
- asset: PrecompAsset,
19
- layerImageProvider: LayerImageProvider,
20
- textProvider: AnimationTextProvider,
21
- fontProvider: AnimationFontProvider,
22
- assetLibrary: AssetLibrary?,
23
- frameRate: CGFloat) {
24
- self.animationLayers = []
12
+
13
+ // MARK: Lifecycle
14
+
15
+ init(
16
+ precomp: PreCompLayerModel,
17
+ asset: PrecompAsset,
18
+ layerImageProvider: LayerImageProvider,
19
+ textProvider: AnimationTextProvider,
20
+ fontProvider: AnimationFontProvider,
21
+ assetLibrary: AssetLibrary?,
22
+ frameRate: CGFloat)
23
+ {
24
+ animationLayers = []
25
25
  if let keyframes = precomp.timeRemapping?.keyframes {
26
- self.remappingNode = NodeProperty(provider: KeyframeInterpolator(keyframes: keyframes))
26
+ remappingNode = NodeProperty(provider: KeyframeInterpolator(keyframes: keyframes))
27
27
  } else {
28
- self.remappingNode = nil
28
+ remappingNode = nil
29
29
  }
30
30
  self.frameRate = frameRate
31
31
  super.init(layer: precomp, size: CGSize(width: precomp.width, height: precomp.height))
32
32
  bounds = CGRect(origin: .zero, size: CGSize(width: precomp.width, height: precomp.height))
33
33
  contentsLayer.masksToBounds = true
34
34
  contentsLayer.bounds = bounds
35
-
36
- let layers = asset.layers.initializeCompositionLayers(assetLibrary: assetLibrary, layerImageProvider: layerImageProvider, textProvider: textProvider, fontProvider: fontProvider, frameRate: frameRate)
37
-
35
+
36
+ let layers = asset.layers.initializeCompositionLayers(
37
+ assetLibrary: assetLibrary,
38
+ layerImageProvider: layerImageProvider,
39
+ textProvider: textProvider,
40
+ fontProvider: fontProvider,
41
+ frameRate: frameRate)
42
+
38
43
  var imageLayers = [ImageCompositionLayer]()
39
-
44
+
40
45
  var mattedLayer: CompositionLayer? = nil
41
-
46
+
42
47
  for layer in layers.reversed() {
43
48
  layer.bounds = bounds
44
49
  animationLayers.append(layer)
@@ -51,35 +56,49 @@ final class PreCompositionLayer: CompositionLayer {
51
56
  mattedLayer = nil
52
57
  continue
53
58
  }
54
- if let matte = layer.matteType,
55
- (matte == .add || matte == .invert) {
59
+ if
60
+ let matte = layer.matteType,
61
+ matte == .add || matte == .invert
62
+ {
56
63
  /// We have a layer that requires a matte.
57
64
  mattedLayer = layer
58
65
  }
59
66
  contentsLayer.addSublayer(layer)
60
67
  }
61
-
62
- self.childKeypaths.append(contentsOf: layers)
63
-
68
+
69
+ childKeypaths.append(contentsOf: layers)
70
+
64
71
  layerImageProvider.addImageLayers(imageLayers)
65
72
  }
66
-
73
+
67
74
  override init(layer: Any) {
68
75
  /// Used for creating shadow model layers. Read More here: https://developer.apple.com/documentation/quartzcore/calayer/1410842-init
69
76
  guard let layer = layer as? PreCompositionLayer else {
70
77
  fatalError("init(layer:) Wrong Layer Class")
71
78
  }
72
- self.frameRate = layer.frameRate
73
- self.remappingNode = nil
74
- self.animationLayers = []
75
-
79
+ frameRate = layer.frameRate
80
+ remappingNode = nil
81
+ animationLayers = []
82
+
76
83
  super.init(layer: layer)
77
84
  }
78
-
79
- required init?(coder aDecoder: NSCoder) {
85
+
86
+ required init?(coder _: NSCoder) {
80
87
  fatalError("init(coder:) has not been implemented")
81
88
  }
82
-
89
+
90
+ // MARK: Internal
91
+
92
+ let frameRate: CGFloat
93
+ let remappingNode: NodeProperty<Vector1D>?
94
+
95
+ override var keypathProperties: [String: AnyNodeProperty] {
96
+ guard let remappingNode = remappingNode else {
97
+ return super.keypathProperties
98
+ }
99
+ return ["Time Remap" : remappingNode]
100
+ }
101
+
83
102
  override func displayContentsWithFrame(frame: CGFloat, forceUpdates: Bool) {
84
103
  let localFrame: CGFloat
85
104
  if let remappingNode = remappingNode {
@@ -88,18 +107,15 @@ final class PreCompositionLayer: CompositionLayer {
88
107
  } else {
89
108
  localFrame = (frame - startFrame) / timeStretch
90
109
  }
91
- animationLayers.forEach( { $0.displayWithFrame(frame: localFrame, forceUpdates: forceUpdates) })
110
+ animationLayers.forEach({ $0.displayWithFrame(frame: localFrame, forceUpdates: forceUpdates) })
92
111
  }
93
-
94
- override var keypathProperties: [String : AnyNodeProperty] {
95
- guard let remappingNode = remappingNode else {
96
- return super.keypathProperties
97
- }
98
- return ["Time Remap" : remappingNode]
99
- }
100
-
112
+
101
113
  override func updateRenderScale() {
102
114
  super.updateRenderScale()
103
- animationLayers.forEach( { $0.renderScale = renderScale } )
115
+ animationLayers.forEach({ $0.renderScale = renderScale })
104
116
  }
117
+
118
+ // MARK: Fileprivate
119
+
120
+ fileprivate var animationLayers: [CompositionLayer]
105
121
  }
@@ -5,52 +5,54 @@
5
5
  // Created by Brandon Withrow on 1/22/19.
6
6
  //
7
7
 
8
- import Foundation
9
8
  import CoreGraphics
9
+ import Foundation
10
10
 
11
- /**
12
- A CompositionLayer responsible for initializing and rendering shapes
13
- */
11
+ /// A CompositionLayer responsible for initializing and rendering shapes
14
12
  final class ShapeCompositionLayer: CompositionLayer {
15
-
16
- let rootNode: AnimatorNode?
17
- let renderContainer: ShapeContainerLayer?
18
-
13
+
14
+ // MARK: Lifecycle
15
+
19
16
  init(shapeLayer: ShapeLayerModel) {
20
17
  let results = shapeLayer.items.initializeNodeTree()
21
18
  let renderContainer = ShapeContainerLayer()
22
19
  self.renderContainer = renderContainer
23
- self.rootNode = results.rootNode
20
+ rootNode = results.rootNode
24
21
  super.init(layer: shapeLayer, size: .zero)
25
22
  contentsLayer.addSublayer(renderContainer)
26
23
  for container in results.renderContainers {
27
24
  renderContainer.insertRenderLayer(container)
28
25
  }
29
26
  rootNode?.updateTree(0, forceUpdates: true)
30
- self.childKeypaths.append(contentsOf: results.childrenNodes)
27
+ childKeypaths.append(contentsOf: results.childrenNodes)
31
28
  }
32
-
29
+
33
30
  override init(layer: Any) {
34
31
  guard let layer = layer as? ShapeCompositionLayer else {
35
32
  fatalError("init(layer:) wrong class.")
36
33
  }
37
- self.rootNode = nil
38
- self.renderContainer = nil
34
+ rootNode = nil
35
+ renderContainer = nil
39
36
  super.init(layer: layer)
40
37
  }
41
-
38
+
39
+ required init?(coder _: NSCoder) {
40
+ fatalError("init(coder:) has not been implemented")
41
+ }
42
+
43
+ // MARK: Internal
44
+
45
+ let rootNode: AnimatorNode?
46
+ let renderContainer: ShapeContainerLayer?
47
+
42
48
  override func displayContentsWithFrame(frame: CGFloat, forceUpdates: Bool) {
43
49
  rootNode?.updateTree(frame, forceUpdates: forceUpdates)
44
50
  renderContainer?.markRenderUpdates(forFrame: frame)
45
51
  }
46
-
47
- required init?(coder aDecoder: NSCoder) {
48
- fatalError("init(coder:) has not been implemented")
49
- }
50
-
52
+
51
53
  override func updateRenderScale() {
52
54
  super.updateRenderScale()
53
55
  renderContainer?.renderScale = renderScale
54
56
  }
55
-
57
+
56
58
  }
@@ -9,40 +9,49 @@ import Foundation
9
9
  import QuartzCore
10
10
 
11
11
  final class SolidCompositionLayer: CompositionLayer {
12
-
13
- let colorProperty: NodeProperty<Color>?
14
- let solidShape: CAShapeLayer = CAShapeLayer()
15
-
12
+
13
+ // MARK: Lifecycle
14
+
16
15
  init(solid: SolidLayerModel) {
17
16
  let components = solid.colorHex.hexColorComponents()
18
- self.colorProperty = NodeProperty(provider: SingleValueProvider(Color(r: Double(components.red), g: Double(components.green), b: Double(components.blue), a: 1)))
19
-
17
+ colorProperty =
18
+ NodeProperty(provider: SingleValueProvider(Color(
19
+ r: Double(components.red),
20
+ g: Double(components.green),
21
+ b: Double(components.blue),
22
+ a: 1)))
23
+
20
24
  super.init(layer: solid, size: .zero)
21
25
  solidShape.path = CGPath(rect: CGRect(x: 0, y: 0, width: solid.width, height: solid.height), transform: nil)
22
26
  contentsLayer.addSublayer(solidShape)
23
27
  }
24
-
28
+
25
29
  override init(layer: Any) {
26
30
  /// Used for creating shadow model layers. Read More here: https://developer.apple.com/documentation/quartzcore/calayer/1410842-init
27
31
  guard let layer = layer as? SolidCompositionLayer else {
28
32
  fatalError("init(layer:) Wrong Layer Class")
29
33
  }
30
- self.colorProperty = layer.colorProperty
34
+ colorProperty = layer.colorProperty
31
35
  super.init(layer: layer)
32
36
  }
33
-
34
- required init?(coder aDecoder: NSCoder) {
37
+
38
+ required init?(coder _: NSCoder) {
35
39
  fatalError("init(coder:) has not been implemented")
36
40
  }
37
-
38
- override func displayContentsWithFrame(frame: CGFloat, forceUpdates: Bool) {
41
+
42
+ // MARK: Internal
43
+
44
+ let colorProperty: NodeProperty<Color>?
45
+ let solidShape = CAShapeLayer()
46
+
47
+ override var keypathProperties: [String: AnyNodeProperty] {
48
+ guard let colorProperty = colorProperty else { return super.keypathProperties }
49
+ return [PropertyName.color.rawValue : colorProperty]
50
+ }
51
+
52
+ override func displayContentsWithFrame(frame: CGFloat, forceUpdates _: Bool) {
39
53
  guard let colorProperty = colorProperty else { return }
40
54
  colorProperty.update(frame: frame)
41
55
  solidShape.fillColor = colorProperty.value.cgColorValue
42
56
  }
43
-
44
- override var keypathProperties: [String : AnyNodeProperty] {
45
- guard let colorProperty = colorProperty else { return super.keypathProperties }
46
- return ["Color" : colorProperty]
47
- }
48
57
  }
@@ -5,10 +5,10 @@
5
5
  // Created by Brandon Withrow on 1/25/19.
6
6
  //
7
7
 
8
- import Foundation
9
8
  import CoreGraphics
10
- import QuartzCore
11
9
  import CoreText
10
+ import Foundation
11
+ import QuartzCore
12
12
 
13
13
  /// Needed for NSMutableParagraphStyle...
14
14
  #if os(OSX)
@@ -28,7 +28,7 @@ extension TextJustification {
28
28
  return .center
29
29
  }
30
30
  }
31
-
31
+
32
32
  var caTextAlignement: CATextLayerAlignmentMode {
33
33
  switch self {
34
34
  case .left:
@@ -41,72 +41,78 @@ extension TextJustification {
41
41
  }
42
42
  }
43
43
 
44
+ // MARK: - TextCompositionLayer
45
+
44
46
  final class TextCompositionLayer: CompositionLayer {
45
-
46
- let rootNode: TextAnimatorNode?
47
- let textDocument: KeyframeInterpolator<TextDocument>?
48
-
49
- let textLayer: TextLayer = TextLayer()
50
- var textProvider: AnimationTextProvider
51
- var fontProvider: AnimationFontProvider
52
-
47
+
48
+ // MARK: Lifecycle
49
+
53
50
  init(textLayer: TextLayerModel, textProvider: AnimationTextProvider, fontProvider: AnimationFontProvider) {
54
51
  var rootNode: TextAnimatorNode?
55
52
  for animator in textLayer.animators {
56
53
  rootNode = TextAnimatorNode(parentNode: rootNode, textAnimator: animator)
57
54
  }
58
55
  self.rootNode = rootNode
59
- self.textDocument = KeyframeInterpolator(keyframes: textLayer.text.keyframes)
60
-
56
+ textDocument = KeyframeInterpolator(keyframes: textLayer.text.keyframes)
57
+
61
58
  self.textProvider = textProvider
62
59
  self.fontProvider = fontProvider
63
-
60
+
64
61
  super.init(layer: textLayer, size: .zero)
65
62
  contentsLayer.addSublayer(self.textLayer)
66
63
  self.textLayer.masksToBounds = false
67
64
  self.textLayer.isGeometryFlipped = true
68
65
 
69
66
  if let rootNode = rootNode {
70
- childKeypaths.append(rootNode)
67
+ childKeypaths.append(rootNode)
71
68
  }
72
69
  }
73
-
74
- required init?(coder aDecoder: NSCoder) {
70
+
71
+ required init?(coder _: NSCoder) {
75
72
  fatalError("init(coder:) has not been implemented")
76
73
  }
77
-
74
+
78
75
  override init(layer: Any) {
79
76
  /// Used for creating shadow model layers. Read More here: https://developer.apple.com/documentation/quartzcore/calayer/1410842-init
80
77
  guard let layer = layer as? TextCompositionLayer else {
81
78
  fatalError("init(layer:) Wrong Layer Class")
82
79
  }
83
- self.rootNode = nil
84
- self.textDocument = nil
85
-
86
- self.textProvider = DefaultTextProvider()
87
- self.fontProvider = DefaultFontProvider()
88
-
80
+ rootNode = nil
81
+ textDocument = nil
82
+
83
+ textProvider = DefaultTextProvider()
84
+ fontProvider = DefaultFontProvider()
85
+
89
86
  super.init(layer: layer)
90
87
  }
91
-
88
+
89
+ // MARK: Internal
90
+
91
+ let rootNode: TextAnimatorNode?
92
+ let textDocument: KeyframeInterpolator<TextDocument>?
93
+
94
+ let textLayer = CoreTextRenderLayer()
95
+ var textProvider: AnimationTextProvider
96
+ var fontProvider: AnimationFontProvider
97
+
92
98
  override func displayContentsWithFrame(frame: CGFloat, forceUpdates: Bool) {
93
99
  guard let textDocument = textDocument else { return }
94
-
95
- textLayer.contentsScale = self.renderScale
96
-
100
+
101
+ textLayer.contentsScale = renderScale
102
+
97
103
  let documentUpdate = textDocument.hasUpdate(frame: frame)
98
104
  let animatorUpdate = rootNode?.updateContents(frame, forceLocalUpdate: forceUpdates) ?? false
99
105
  guard documentUpdate == true || animatorUpdate == true else { return }
100
-
106
+
101
107
  rootNode?.rebuildOutputs(frame: frame)
102
-
108
+
103
109
  // Get Text Attributes
104
110
  let text = textDocument.value(frame: frame) as! TextDocument
105
111
  let strokeColor = rootNode?.textOutputNode.strokeColor ?? text.strokeColorData?.cgColorValue
106
112
  let strokeWidth = rootNode?.textOutputNode.strokeWidth ?? CGFloat(text.strokeWidth ?? 0)
107
113
  let tracking = (CGFloat(text.fontSize) * (rootNode?.textOutputNode.tracking ?? CGFloat(text.tracking))) / 1000.0
108
114
  let matrix = rootNode?.textOutputNode.xform ?? CATransform3DIdentity
109
- let textString = textProvider.textFor(keypathName: self.keypathName, sourceText: text.text)
115
+ let textString = textProvider.textFor(keypathName: keypathName, sourceText: text.text)
110
116
  let ctFont = fontProvider.fontFor(family: text.fontFamily, size: CGFloat(text.fontSize))
111
117
 
112
118
  // Set all of the text layer options
@@ -115,7 +121,7 @@ final class TextCompositionLayer: CompositionLayer {
115
121
  textLayer.alignment = text.justification.textAlignment
116
122
  textLayer.lineHeight = CGFloat(text.lineHeight)
117
123
  textLayer.tracking = tracking
118
-
124
+
119
125
  if let fillColor = rootNode?.textOutputNode.fillColor {
120
126
  textLayer.fillColor = fillColor
121
127
  } else if let fillColor = text.fillColorData?.cgColorValue {
@@ -123,21 +129,21 @@ final class TextCompositionLayer: CompositionLayer {
123
129
  } else {
124
130
  textLayer.fillColor = nil
125
131
  }
126
-
132
+
127
133
  textLayer.preferredSize = text.textFrameSize?.sizeValue
128
134
  textLayer.strokeOnTop = text.strokeOverFill ?? false
129
135
  textLayer.strokeWidth = strokeWidth
130
136
  textLayer.strokeColor = strokeColor
131
137
  textLayer.sizeToFit()
132
-
138
+
133
139
  textLayer.opacity = Float(rootNode?.textOutputNode.opacity ?? 1)
134
140
  textLayer.transform = CATransform3DIdentity
135
141
  textLayer.position = text.textFramePosition?.pointValue ?? CGPoint.zero
136
142
  textLayer.transform = matrix
137
143
  }
138
-
144
+
139
145
  override func updateRenderScale() {
140
146
  super.updateRenderScale()
141
- textLayer.contentsScale = self.renderScale
147
+ textLayer.contentsScale = renderScale
142
148
  }
143
149
  }