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
@@ -1,5 +1,5 @@
1
1
  //
2
- // AnimationContainer.swift
2
+ // MainThreadAnimationLayer.swift
3
3
  // lottie-swift
4
4
  //
5
5
  // Created by Brandon Withrow on 1/24/19.
@@ -8,118 +8,40 @@
8
8
  import Foundation
9
9
  import QuartzCore
10
10
 
11
- /**
12
- The base animation container.
13
-
14
- This layer holds a single composition container and allows for animation of
15
- the currentFrame property.
16
- */
17
- final class AnimationContainer: CALayer {
18
-
19
- /// The animatable Current Frame Property
20
- @NSManaged var currentFrame: CGFloat
21
-
22
- var imageProvider: AnimationImageProvider {
23
- get {
24
- return layerImageProvider.imageProvider
25
- }
26
- set {
27
- layerImageProvider.imageProvider = newValue
28
- }
29
- }
30
-
31
- func reloadImages() {
32
- layerImageProvider.reloadImages()
33
- }
34
-
35
- var renderScale: CGFloat = 1 {
36
- didSet {
37
- animationLayers.forEach({ $0.renderScale = renderScale })
38
- }
39
- }
40
-
41
- public var respectAnimationFrameRate: Bool = false
42
-
43
- /// Forces the view to update its drawing.
44
- func forceDisplayUpdate() {
45
- animationLayers.forEach( { $0.displayWithFrame(frame: currentFrame, forceUpdates: true) })
46
- }
47
-
48
- func logHierarchyKeypaths() {
49
- print("Lottie: Logging Animation Keypaths")
50
- animationLayers.forEach({ $0.logKeypaths(for: nil) })
51
- }
52
-
53
- func setValueProvider(_ valueProvider: AnyValueProvider, keypath: AnimationKeypath) {
54
- for layer in animationLayers {
55
- if let foundProperties = layer.nodeProperties(for: keypath) {
56
- for property in foundProperties {
57
- property.setProvider(provider: valueProvider)
58
- }
59
- layer.displayWithFrame(frame: presentation()?.currentFrame ?? currentFrame, forceUpdates: true)
60
- }
61
- }
62
- }
63
-
64
- func getValue(for keypath: AnimationKeypath, atFrame: CGFloat?) -> Any? {
65
- for layer in animationLayers {
66
- if let foundProperties = layer.nodeProperties(for: keypath),
67
- let first = foundProperties.first {
68
- return first.valueProvider.value(frame: atFrame ?? currentFrame)
69
- }
70
- }
71
- return nil
72
- }
73
-
74
- func layer(for keypath: AnimationKeypath) -> CALayer? {
75
- for layer in animationLayers {
76
- if let foundLayer = layer.layer(for: keypath) {
77
- return foundLayer
78
- }
79
- }
80
- return nil
81
- }
82
-
83
- func animatorNodes(for keypath: AnimationKeypath) -> [AnimatorNode]? {
84
- var results = [AnimatorNode]()
85
- for layer in animationLayers {
86
- if let nodes = layer.animatorNodes(for: keypath) {
87
- results.append(contentsOf: nodes)
88
- }
89
- }
90
- if results.count == 0 {
91
- return nil
92
- }
93
- return results
94
- }
11
+ // MARK: - MainThreadAnimationLayer
95
12
 
96
- var textProvider: AnimationTextProvider {
97
- get { return layerTextProvider.textProvider }
98
- set { layerTextProvider.textProvider = newValue }
99
- }
100
-
101
- var fontProvider: AnimationFontProvider {
102
- get { return layerFontProvider.fontProvider }
103
- set { layerFontProvider.fontProvider = newValue }
104
- }
105
-
106
- var animationLayers: ContiguousArray<CompositionLayer>
107
- fileprivate let layerImageProvider: LayerImageProvider
108
- fileprivate let layerTextProvider: LayerTextProvider
109
- fileprivate let layerFontProvider: LayerFontProvider
110
-
111
- init(animation: Animation, imageProvider: AnimationImageProvider, textProvider: AnimationTextProvider, fontProvider: AnimationFontProvider) {
112
- self.layerImageProvider = LayerImageProvider(imageProvider: imageProvider, assets: animation.assetLibrary?.imageAssets)
113
- self.layerTextProvider = LayerTextProvider(textProvider: textProvider)
114
- self.layerFontProvider = LayerFontProvider(fontProvider: fontProvider)
115
- self.animationLayers = []
13
+ /// The base `CALayer` for the Main Thread rendering engine
14
+ ///
15
+ /// This layer holds a single composition container and allows for animation of
16
+ /// the currentFrame property.
17
+ final class MainThreadAnimationLayer: CALayer, RootAnimationLayer {
18
+
19
+ // MARK: Lifecycle
20
+
21
+ init(
22
+ animation: Animation,
23
+ imageProvider: AnimationImageProvider,
24
+ textProvider: AnimationTextProvider,
25
+ fontProvider: AnimationFontProvider,
26
+ logger: LottieLogger)
27
+ {
28
+ layerImageProvider = LayerImageProvider(imageProvider: imageProvider, assets: animation.assetLibrary?.imageAssets)
29
+ layerTextProvider = LayerTextProvider(textProvider: textProvider)
30
+ layerFontProvider = LayerFontProvider(fontProvider: fontProvider)
31
+ animationLayers = []
32
+ self.logger = logger
116
33
  super.init()
117
34
  bounds = animation.bounds
118
- let layers = animation.layers.initializeCompositionLayers(assetLibrary: animation.assetLibrary, layerImageProvider: layerImageProvider, textProvider: textProvider, fontProvider: fontProvider, frameRate: CGFloat(animation.framerate))
119
-
35
+ let layers = animation.layers.initializeCompositionLayers(
36
+ assetLibrary: animation.assetLibrary,
37
+ layerImageProvider: layerImageProvider,
38
+ textProvider: textProvider,
39
+ fontProvider: fontProvider,
40
+ frameRate: CGFloat(animation.framerate))
41
+
120
42
  var imageLayers = [ImageCompositionLayer]()
121
43
  var textLayers = [TextCompositionLayer]()
122
-
44
+
123
45
  var mattedLayer: CompositionLayer? = nil
124
46
 
125
47
  for layer in layers.reversed() {
@@ -137,14 +59,16 @@ final class AnimationContainer: CALayer {
137
59
  mattedLayer = nil
138
60
  continue
139
61
  }
140
- if let matte = layer.matteType,
141
- (matte == .add || matte == .invert) {
62
+ if
63
+ let matte = layer.matteType,
64
+ matte == .add || matte == .invert
65
+ {
142
66
  /// We have a layer that requires a matte.
143
67
  mattedLayer = layer
144
68
  }
145
69
  addSublayer(layer)
146
70
  }
147
-
71
+
148
72
  layerImageProvider.addImageLayers(imageLayers)
149
73
  layerImageProvider.reloadImages()
150
74
  layerTextProvider.addTextLayers(textLayers)
@@ -153,64 +77,200 @@ final class AnimationContainer: CALayer {
153
77
  layerFontProvider.reloadTexts()
154
78
  setNeedsDisplay()
155
79
  }
156
-
157
- /// For CAAnimation Use
158
- public override init(layer: Any) {
159
- self.animationLayers = []
160
- self.layerImageProvider = LayerImageProvider(imageProvider: BlankImageProvider(), assets: nil)
161
- self.layerTextProvider = LayerTextProvider(textProvider: DefaultTextProvider())
162
- self.layerFontProvider = LayerFontProvider(fontProvider: DefaultFontProvider())
80
+
81
+ /// Called by CoreAnimation to create a shadow copy of this layer
82
+ /// More details: https://developer.apple.com/documentation/quartzcore/calayer/1410842-init
83
+ override init(layer: Any) {
84
+ guard let typedLayer = layer as? Self else {
85
+ fatalError("\(Self.self).init(layer:) incorrectly called with \(type(of: layer))")
86
+ }
87
+
88
+ animationLayers = []
89
+ layerImageProvider = LayerImageProvider(imageProvider: BlankImageProvider(), assets: nil)
90
+ layerTextProvider = LayerTextProvider(textProvider: DefaultTextProvider())
91
+ layerFontProvider = LayerFontProvider(fontProvider: DefaultFontProvider())
92
+ logger = typedLayer.logger
163
93
  super.init(layer: layer)
164
-
165
- guard let animationLayer = layer as? AnimationContainer else { return }
166
-
167
- currentFrame = animationLayer.currentFrame
168
-
169
- }
170
-
171
- required init?(coder aDecoder: NSCoder) {
94
+
95
+ currentFrame = typedLayer.currentFrame
96
+ }
97
+
98
+ required init?(coder _: NSCoder) {
172
99
  fatalError("init(coder:) has not been implemented")
173
100
  }
174
-
101
+
102
+ // MARK: Public
103
+
104
+ public var respectAnimationFrameRate = false
105
+
175
106
  // MARK: CALayer Animations
176
-
107
+
177
108
  override public class func needsDisplay(forKey key: String) -> Bool {
178
109
  if key == "currentFrame" {
179
110
  return true
180
111
  }
181
112
  return super.needsDisplay(forKey: key)
182
113
  }
183
-
114
+
184
115
  override public func action(forKey event: String) -> CAAction? {
185
116
  if event == "currentFrame" {
186
117
  let animation = CABasicAnimation(keyPath: event)
187
118
  animation.timingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName.linear)
188
- animation.fromValue = self.presentation()?.currentFrame
119
+ animation.fromValue = presentation()?.currentFrame
189
120
  return animation
190
121
  }
191
122
  return super.action(forKey: event)
192
123
  }
193
-
124
+
194
125
  public override func display() {
195
126
  guard Thread.isMainThread else { return }
196
127
  var newFrame: CGFloat
197
- if let animationKeys = self.animationKeys(),
198
- !animationKeys.isEmpty {
199
- newFrame = self.presentation()?.currentFrame ?? self.currentFrame
128
+ if
129
+ let animationKeys = animationKeys(),
130
+ !animationKeys.isEmpty
131
+ {
132
+ newFrame = presentation()?.currentFrame ?? currentFrame
200
133
  } else {
201
134
  // We ignore the presentation's frame if there's no animation in the layer.
202
- newFrame = self.currentFrame
135
+ newFrame = currentFrame
203
136
  }
204
137
  if respectAnimationFrameRate {
205
138
  newFrame = floor(newFrame)
206
139
  }
207
- animationLayers.forEach( { $0.displayWithFrame(frame: newFrame, forceUpdates: false) })
140
+ animationLayers.forEach { $0.displayWithFrame(frame: newFrame, forceUpdates: false) }
208
141
  }
209
-
210
- }
211
142
 
212
- fileprivate class BlankImageProvider: AnimationImageProvider {
213
- func imageForAsset(asset: ImageAsset) -> CGImage? {
143
+ // MARK: Internal
144
+
145
+ /// The animatable Current Frame Property
146
+ @NSManaged var currentFrame: CGFloat
147
+
148
+ var animationLayers: ContiguousArray<CompositionLayer>
149
+
150
+ var primaryAnimationKey: AnimationKey {
151
+ .managed
152
+ }
153
+
154
+ var isAnimationPlaying: Bool? {
155
+ nil // this state is managed by `AnimationView`
156
+ }
157
+
158
+ var _animationLayers: [CALayer] {
159
+ Array(animationLayers)
160
+ }
161
+
162
+ var imageProvider: AnimationImageProvider {
163
+ get {
164
+ layerImageProvider.imageProvider
165
+ }
166
+ set {
167
+ layerImageProvider.imageProvider = newValue
168
+ }
169
+ }
170
+
171
+ var renderScale: CGFloat = 1 {
172
+ didSet {
173
+ animationLayers.forEach({ $0.renderScale = renderScale })
174
+ }
175
+ }
176
+
177
+ var textProvider: AnimationTextProvider {
178
+ get { layerTextProvider.textProvider }
179
+ set { layerTextProvider.textProvider = newValue }
180
+ }
181
+
182
+ var fontProvider: AnimationFontProvider {
183
+ get { layerFontProvider.fontProvider }
184
+ set { layerFontProvider.fontProvider = newValue }
185
+ }
186
+
187
+ func reloadImages() {
188
+ layerImageProvider.reloadImages()
189
+ }
190
+
191
+ func removeAnimations() {
192
+ // no-op, since the primary animation is managed by the `AnimationView`.
193
+ }
194
+
195
+ /// Forces the view to update its drawing.
196
+ func forceDisplayUpdate() {
197
+ animationLayers.forEach({ $0.displayWithFrame(frame: currentFrame, forceUpdates: true) })
198
+ }
199
+
200
+ func logHierarchyKeypaths() {
201
+ logger.info("Lottie: Logging Animation Keypaths")
202
+ animationLayers.forEach({ $0.logKeypaths(for: nil, logger: self.logger) })
203
+ }
204
+
205
+ func setValueProvider(_ valueProvider: AnyValueProvider, keypath: AnimationKeypath) {
206
+ for layer in animationLayers {
207
+ if let foundProperties = layer.nodeProperties(for: keypath) {
208
+ for property in foundProperties {
209
+ property.setProvider(provider: valueProvider)
210
+ }
211
+ layer.displayWithFrame(frame: presentation()?.currentFrame ?? currentFrame, forceUpdates: true)
212
+ }
213
+ }
214
+ }
215
+
216
+ func getValue(for keypath: AnimationKeypath, atFrame: CGFloat?) -> Any? {
217
+ for layer in animationLayers {
218
+ if
219
+ let foundProperties = layer.nodeProperties(for: keypath),
220
+ let first = foundProperties.first
221
+ {
222
+ return first.valueProvider.value(frame: atFrame ?? currentFrame)
223
+ }
224
+ }
225
+ return nil
226
+ }
227
+
228
+ func getOriginalValue(for keypath: AnimationKeypath, atFrame: AnimationFrameTime?) -> Any? {
229
+ for layer in animationLayers {
230
+ if
231
+ let foundProperties = layer.nodeProperties(for: keypath),
232
+ let first = foundProperties.first
233
+ {
234
+ return first.originalValueProvider.value(frame: atFrame ?? currentFrame)
235
+ }
236
+ }
237
+ return nil
238
+ }
239
+
240
+ func layer(for keypath: AnimationKeypath) -> CALayer? {
241
+ for layer in animationLayers {
242
+ if let foundLayer = layer.layer(for: keypath) {
243
+ return foundLayer
244
+ }
245
+ }
214
246
  return nil
215
247
  }
248
+
249
+ func animatorNodes(for keypath: AnimationKeypath) -> [AnimatorNode]? {
250
+ var results = [AnimatorNode]()
251
+ for layer in animationLayers {
252
+ if let nodes = layer.animatorNodes(for: keypath) {
253
+ results.append(contentsOf: nodes)
254
+ }
255
+ }
256
+ if results.count == 0 {
257
+ return nil
258
+ }
259
+ return results
260
+ }
261
+
262
+ // MARK: Fileprivate
263
+
264
+ fileprivate let layerImageProvider: LayerImageProvider
265
+ fileprivate let layerTextProvider: LayerTextProvider
266
+ fileprivate let layerFontProvider: LayerFontProvider
267
+ fileprivate let logger: LottieLogger
268
+ }
269
+
270
+ // MARK: - BlankImageProvider
271
+
272
+ private class BlankImageProvider: AnimationImageProvider {
273
+ func imageForAsset(asset _: ImageAsset) -> CGImage? {
274
+ nil
275
+ }
216
276
  }
@@ -0,0 +1,47 @@
1
+ // Created by Jianjun Wu on 2022/5/12.
2
+ // Copyright © 2022 Airbnb Inc. All rights reserved.
3
+
4
+ import CoreGraphics
5
+ import Foundation
6
+
7
+ // MARK: - CachedImageProvider
8
+
9
+ private final class CachedImageProvider: AnimationImageProvider {
10
+
11
+ // MARK: Lifecycle
12
+
13
+ /// Initializes an image provider with an image provider
14
+ ///
15
+ /// - Parameter imageProvider: The provider to load image from asset
16
+ ///
17
+ public init(imageProvider: AnimationImageProvider) {
18
+ self.imageProvider = imageProvider
19
+ }
20
+
21
+ // MARK: Public
22
+
23
+ public func imageForAsset(asset: ImageAsset) -> CGImage? {
24
+ if let image = imageCache.object(forKey: asset.id as NSString) {
25
+ return image
26
+ }
27
+ if let image = imageProvider.imageForAsset(asset: asset) {
28
+ imageCache.setObject(image, forKey: asset.id as NSString)
29
+ return image
30
+ }
31
+ return nil
32
+ }
33
+
34
+ // MARK: Internal
35
+
36
+ let imageCache: NSCache<NSString, CGImage> = .init()
37
+ let imageProvider: AnimationImageProvider
38
+ }
39
+
40
+ extension AnimationImageProvider {
41
+ /// Create a cache enabled image provider which will reuse the asset image with the same asset id
42
+ /// It wraps the current provider as image loader, and uses `NSCache` to cache the images for resue.
43
+ /// The cache will be reset when the `animation` is reset.
44
+ var cachedImageProvider: AnimationImageProvider {
45
+ CachedImageProvider(imageProvider: self)
46
+ }
47
+ }
@@ -5,22 +5,24 @@
5
5
  // Created by Brandon Withrow on 1/25/19.
6
6
  //
7
7
 
8
- import Foundation
9
8
  import CoreGraphics
9
+ import Foundation
10
10
 
11
11
  extension Array where Element == LayerModel {
12
-
13
- func initializeCompositionLayers(assetLibrary: AssetLibrary?,
14
- layerImageProvider: LayerImageProvider,
15
- textProvider: AnimationTextProvider,
16
- fontProvider: AnimationFontProvider,
17
- frameRate: CGFloat) -> [CompositionLayer] {
12
+
13
+ func initializeCompositionLayers(
14
+ assetLibrary: AssetLibrary?,
15
+ layerImageProvider: LayerImageProvider,
16
+ textProvider: AnimationTextProvider,
17
+ fontProvider: AnimationFontProvider,
18
+ frameRate: CGFloat) -> [CompositionLayer]
19
+ {
18
20
  var compositionLayers = [CompositionLayer]()
19
21
  var layerMap = [Int : CompositionLayer]()
20
-
22
+
21
23
  /// Organize the assets into a dictionary of [ID : ImageAsset]
22
24
  var childLayers = [LayerModel]()
23
-
25
+
24
26
  for layer in self {
25
27
  if layer.hidden == true {
26
28
  let genericLayer = NullCompositionLayer(layer: layer)
@@ -34,22 +36,29 @@ extension Array where Element == LayerModel {
34
36
  let solidContainer = SolidCompositionLayer(solid: solidLayer)
35
37
  compositionLayers.append(solidContainer)
36
38
  layerMap[layer.index] = solidContainer
37
- } else if let precompLayer = layer as? PreCompLayerModel,
39
+ } else if
40
+ let precompLayer = layer as? PreCompLayerModel,
38
41
  let assetLibrary = assetLibrary,
39
- let precompAsset = assetLibrary.precompAssets[precompLayer.referenceID] {
40
- let precompContainer = PreCompositionLayer(precomp: precompLayer,
41
- asset: precompAsset,
42
- layerImageProvider: layerImageProvider,
43
- textProvider: textProvider,
44
- fontProvider: fontProvider,
45
- assetLibrary: assetLibrary,
46
- frameRate: frameRate)
42
+ let precompAsset = assetLibrary.precompAssets[precompLayer.referenceID]
43
+ {
44
+ let precompContainer = PreCompositionLayer(
45
+ precomp: precompLayer,
46
+ asset: precompAsset,
47
+ layerImageProvider: layerImageProvider,
48
+ textProvider: textProvider,
49
+ fontProvider: fontProvider,
50
+ assetLibrary: assetLibrary,
51
+ frameRate: frameRate)
47
52
  compositionLayers.append(precompContainer)
48
53
  layerMap[layer.index] = precompContainer
49
- } else if let imageLayer = layer as? ImageLayerModel,
54
+ } else if
55
+ let imageLayer = layer as? ImageLayerModel,
50
56
  let assetLibrary = assetLibrary,
51
- let imageAsset = assetLibrary.imageAssets[imageLayer.referenceID] {
52
- let imageContainer = ImageCompositionLayer(imageLayer: imageLayer, size: CGSize(width: imageAsset.width, height: imageAsset.height))
57
+ let imageAsset = assetLibrary.imageAssets[imageLayer.referenceID]
58
+ {
59
+ let imageContainer = ImageCompositionLayer(
60
+ imageLayer: imageLayer,
61
+ size: CGSize(width: imageAsset.width, height: imageAsset.height))
53
62
  compositionLayers.append(imageContainer)
54
63
  layerMap[layer.index] = imageContainer
55
64
  } else if let textLayer = layer as? TextLayerModel {
@@ -65,7 +74,7 @@ extension Array where Element == LayerModel {
65
74
  childLayers.append(layer)
66
75
  }
67
76
  }
68
-
77
+
69
78
  /// Now link children with their parents
70
79
  for layerModel in childLayers {
71
80
  if let parentID = layerModel.parent {
@@ -74,8 +83,8 @@ extension Array where Element == LayerModel {
74
83
  childLayer?.transformNode.parentNode = parentLayer?.transformNode
75
84
  }
76
85
  }
77
-
86
+
78
87
  return compositionLayers
79
88
  }
80
-
89
+
81
90
  }