lottie-ios 3.2.3 → 3.4.0

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 (584) 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 +95 -0
  4. package/.spi.yml +6 -0
  5. package/.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata +7 -0
  6. package/.swiftpm/xcode/package.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  7. package/.swiftpm/xcode/xcuserdata/{brandonwithrow.xcuserdatad → cal.xcuserdatad}/xcschemes/xcschememanagement.plist +25 -15
  8. package/.swiftpm/xcode/xcuserdata/calstephens.xcuserdatad/xcschemes/xcschememanagement.plist +14 -0
  9. package/Gemfile +4 -0
  10. package/Gemfile.lock +102 -0
  11. package/Lottie.xcodeproj/project.pbxproj +2005 -1974
  12. package/Lottie.xcodeproj/project.xcworkspace/contents.xcworkspacedata +1 -1
  13. package/Lottie.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +23 -0
  14. package/Lottie.xcodeproj/project.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  15. package/Lottie.xcodeproj/xcshareddata/xcschemes/{Lottie_iOS.xcscheme → Lottie (iOS).xcscheme } +15 -18
  16. package/Lottie.xcodeproj/xcshareddata/xcschemes/{Lottie_macOS.xcscheme → Lottie (macOS).xcscheme } +7 -20
  17. package/Lottie.xcodeproj/xcshareddata/xcschemes/{Lottie_tvOS.xcscheme → Lottie (tvOS).xcscheme } +5 -18
  18. package/Lottie.xcodeproj/xcuserdata/cal.xcuserdatad/xcschemes/xcschememanagement.plist +37 -0
  19. package/Lottie.xcodeproj/xcuserdata/calstephens.xcuserdatad/xcschemes/xcschememanagement.plist +24 -0
  20. package/Lottie.xcworkspace/contents.xcworkspacedata +10 -0
  21. package/Lottie.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
  22. package/Lottie.xcworkspace/xcshareddata/swiftpm/Package.resolved +34 -0
  23. package/Lottie.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  24. package/{Lottie.xcodeproj/xcuserdata/brandonwithrow.xcuserdatad → Lottie.xcworkspace/xcuserdata/cal.xcuserdatad}/xcdebugger/Breakpoints_v2.xcbkptlist +2 -2
  25. package/Lottie.xcworkspace/xcuserdata/cal.xcuserdatad/xcdebugger/Expressions.xcexplist +153 -0
  26. package/Lottie.xcworkspace/xcuserdata/calstephens.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  27. package/Lottie.xcworkspace/xcuserdata/calstephens.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +39 -0
  28. package/Lottie.xcworkspace/xcuserdata/calstephens.xcuserdatad/xcdebugger/Expressions.xcexplist +25 -0
  29. package/Mintfile +3 -0
  30. package/Package.swift +5 -15
  31. package/README.md +40 -59
  32. package/Rakefile +125 -0
  33. package/Sources/Private/CoreAnimation/Animations/CAAnimation+TimingConfiguration.swift +76 -0
  34. package/Sources/Private/CoreAnimation/Animations/CALayer+addAnimation.swift +322 -0
  35. package/Sources/Private/CoreAnimation/Animations/CombinedShapeAnimation.swift +53 -0
  36. package/Sources/Private/CoreAnimation/Animations/CustomPathAnimation.swift +41 -0
  37. package/Sources/Private/CoreAnimation/Animations/EllipseAnimation.swift +28 -0
  38. package/Sources/Private/CoreAnimation/Animations/GradientAnimations.swift +167 -0
  39. package/Sources/Private/CoreAnimation/Animations/LayerProperty.swift +229 -0
  40. package/Sources/Private/CoreAnimation/Animations/OpacityAnimation.swift +52 -0
  41. package/Sources/Private/CoreAnimation/Animations/RectangleAnimation.swift +31 -0
  42. package/Sources/Private/CoreAnimation/Animations/ShapeAnimation.swift +246 -0
  43. package/Sources/Private/CoreAnimation/Animations/StarAnimation.swift +95 -0
  44. package/Sources/Private/CoreAnimation/Animations/StrokeAnimation.swift +70 -0
  45. package/Sources/Private/CoreAnimation/Animations/TransformAnimations.swift +205 -0
  46. package/Sources/Private/CoreAnimation/Animations/VisibilityAnimation.swift +37 -0
  47. package/Sources/Private/CoreAnimation/CompatibilityTracker.swift +130 -0
  48. package/Sources/Private/CoreAnimation/CoreAnimationLayer.swift +492 -0
  49. package/Sources/Private/CoreAnimation/Extensions/CALayer+fillBounds.swift +35 -0
  50. package/Sources/Private/CoreAnimation/Extensions/KeyframeGroup+exactlyOneKeyframe.swift +37 -0
  51. package/Sources/Private/CoreAnimation/Extensions/Keyframes+combinedIfPossible.swift +61 -0
  52. package/Sources/Private/CoreAnimation/Layers/AnimationLayer.swift +77 -0
  53. package/Sources/Private/CoreAnimation/Layers/BaseAnimationLayer.swift +33 -0
  54. package/Sources/Private/CoreAnimation/Layers/BaseCompositionLayer.swift +87 -0
  55. package/Sources/Private/CoreAnimation/Layers/CALayer+setupLayerHierarchy.swift +131 -0
  56. package/Sources/Private/CoreAnimation/Layers/GradientRenderLayer.swift +87 -0
  57. package/Sources/Private/CoreAnimation/Layers/ImageLayer.swift +79 -0
  58. package/Sources/Private/CoreAnimation/Layers/LayerModel+makeAnimationLayer.swift +60 -0
  59. package/Sources/Private/CoreAnimation/Layers/MaskCompositionLayer.swift +138 -0
  60. package/Sources/Private/CoreAnimation/Layers/PreCompLayer.swift +140 -0
  61. package/Sources/Private/CoreAnimation/Layers/ShapeItemLayer.swift +259 -0
  62. package/Sources/Private/CoreAnimation/Layers/ShapeLayer.swift +305 -0
  63. package/Sources/Private/CoreAnimation/Layers/SolidLayer.swift +47 -0
  64. package/Sources/Private/CoreAnimation/Layers/TextLayer.swift +91 -0
  65. package/Sources/Private/CoreAnimation/Layers/TransformLayer.swift +11 -0
  66. package/Sources/Private/CoreAnimation/ValueProviderStore.swift +139 -0
  67. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/CompositionLayer.swift +93 -85
  68. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/ImageCompositionLayer.swift +24 -21
  69. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/MaskContainerLayer.swift +77 -54
  70. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/NullCompositionLayer.swift +5 -5
  71. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/PreCompositionLayer.swift +57 -41
  72. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/ShapeCompositionLayer.swift +22 -20
  73. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/SolidCompositionLayer.swift +26 -17
  74. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/TextCompositionLayer.swift +42 -36
  75. package/{lottie-swift/src/Private/LayerContainers/AnimationContainer.swift → Sources/Private/MainThread/LayerContainers/MainThreadAnimationLayer.swift} +201 -140
  76. package/Sources/Private/MainThread/LayerContainers/Utility/CachedImageProvider.swift +47 -0
  77. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/Utility/CompositionLayersInitializer.swift +33 -24
  78. package/{lottie-swift/src/Private/LayerContainers/Utility/TextLayer.swift → Sources/Private/MainThread/LayerContainers/Utility/CoreTextRenderLayer.swift} +119 -105
  79. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/Utility/InvertedMatteLayer.swift +25 -24
  80. package/Sources/Private/MainThread/LayerContainers/Utility/LayerFontProvider.swift +41 -0
  81. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/Utility/LayerImageProvider.swift +20 -16
  82. package/Sources/Private/MainThread/LayerContainers/Utility/LayerTextProvider.swift +40 -0
  83. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/Utility/LayerTransformNode.swift +83 -67
  84. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Extensions/ItemsExtension.swift +6 -4
  85. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/NodeProperty.swift +29 -21
  86. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/Protocols/AnyNodeProperty.swift +16 -10
  87. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/Protocols/AnyValueContainer.swift +6 -6
  88. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/Protocols/KeypathSearchable.swift +5 -5
  89. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/Protocols/NodePropertyMap.swift +10 -8
  90. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/ValueContainer.swift +25 -21
  91. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/ValueProviders/GroupInterpolator.swift +23 -17
  92. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/ValueProviders/KeyframeInterpolator.swift +128 -108
  93. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/ValueProviders/SingleValueProvider.swift +22 -17
  94. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/ModifierNodes/TrimPathNode.swift +113 -79
  95. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/OutputNodes/GroupOutputNode.swift +22 -16
  96. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/OutputNodes/PassThroughOutputNode.swift +19 -15
  97. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/OutputNodes/PathOutputNode.swift +22 -20
  98. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/OutputNodes/Renderables/FillRenderer.swift +22 -23
  99. package/Sources/Private/MainThread/NodeRenderSystem/Nodes/OutputNodes/Renderables/GradientFillRenderer.swift +242 -0
  100. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/OutputNodes/Renderables/GradientStrokeRenderer.swift +29 -22
  101. package/{lottie-swift/src/Private/NodeRenderSystem/Nodes/OutputNodes/Renderables/GradientFillRenderer.swift → Sources/Private/MainThread/NodeRenderSystem/Nodes/OutputNodes/Renderables/LegacyGradientFillRenderer.swift} +92 -65
  102. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/OutputNodes/Renderables/StrokeRenderer.swift +22 -18
  103. package/Sources/Private/MainThread/NodeRenderSystem/Nodes/PathNodes/EllipseNode.swift +139 -0
  104. package/Sources/Private/MainThread/NodeRenderSystem/Nodes/PathNodes/PolygonNode.swift +170 -0
  105. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/PathNodes/RectNode.swift +94 -57
  106. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/PathNodes/ShapeNode.swift +42 -29
  107. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/PathNodes/StarNode.swift +105 -66
  108. package/Sources/Private/MainThread/NodeRenderSystem/Nodes/RenderContainers/GroupNode.swift +155 -0
  109. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/RenderNodes/FillNode.swift +51 -37
  110. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/RenderNodes/GradientFillNode.swift +54 -42
  111. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/RenderNodes/GradientStrokeNode.swift +65 -57
  112. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/RenderNodes/StrokeNode.swift +84 -58
  113. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/Text/TextAnimatorNode.swift +138 -119
  114. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Protocols/AnimatorNode.swift +80 -79
  115. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Protocols/PathNode.swift +5 -3
  116. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Protocols/RenderNode.swift +22 -17
  117. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/RenderLayers/ShapeContainerLayer.swift +26 -23
  118. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/RenderLayers/ShapeRenderLayer.swift +35 -25
  119. package/Sources/Private/Model/Animation.swift +160 -0
  120. package/Sources/Private/Model/Assets/Asset.swift +43 -0
  121. package/{lottie-swift/src → Sources}/Private/Model/Assets/AssetLibrary.swift +40 -13
  122. package/Sources/Private/Model/Assets/ImageAsset.swift +112 -0
  123. package/{lottie-swift/src → Sources}/Private/Model/Assets/PrecompAsset.swift +20 -10
  124. package/Sources/Private/Model/DictionaryInitializable.swift +67 -0
  125. package/Sources/Private/Model/Extensions/Bundle.swift +34 -0
  126. package/{lottie-swift/src → Sources}/Private/Model/Extensions/KeyedDecodingContainerExtensions.swift +8 -4
  127. package/Sources/Private/Model/Keyframes/KeyframeData.swift +113 -0
  128. package/Sources/Private/Model/Keyframes/KeyframeGroup.swift +197 -0
  129. package/{lottie-swift/src → Sources}/Private/Model/Layers/ImageLayerModel.swift +21 -11
  130. package/Sources/Private/Model/Layers/LayerModel.swift +228 -0
  131. package/{lottie-swift/src → Sources}/Private/Model/Layers/PreCompLayerModel.swift +39 -22
  132. package/{lottie-swift/src → Sources}/Private/Model/Layers/ShapeLayerModel.swift +23 -12
  133. package/{lottie-swift/src → Sources}/Private/Model/Layers/SolidLayerModel.swift +31 -19
  134. package/{lottie-swift/src → Sources}/Private/Model/Layers/TextLayerModel.swift +33 -19
  135. package/Sources/Private/Model/Objects/DashPattern.swift +44 -0
  136. package/Sources/Private/Model/Objects/Marker.swift +33 -0
  137. package/Sources/Private/Model/Objects/Mask.swift +80 -0
  138. package/Sources/Private/Model/Objects/Transform.swift +179 -0
  139. package/Sources/Private/Model/ShapeItems/Ellipse.swift +75 -0
  140. package/Sources/Private/Model/ShapeItems/Fill.swift +74 -0
  141. package/Sources/Private/Model/ShapeItems/GradientFill.swift +124 -0
  142. package/Sources/Private/Model/ShapeItems/GradientStroke.swift +186 -0
  143. package/{lottie-swift/src → Sources}/Private/Model/ShapeItems/Group.swift +21 -10
  144. package/{lottie-swift/src → Sources}/Private/Model/ShapeItems/Merge.swift +29 -11
  145. package/Sources/Private/Model/ShapeItems/Rectangle.swift +73 -0
  146. package/Sources/Private/Model/ShapeItems/Repeater.swift +136 -0
  147. package/Sources/Private/Model/ShapeItems/Shape.swift +56 -0
  148. package/Sources/Private/Model/ShapeItems/ShapeItem.swift +163 -0
  149. package/Sources/Private/Model/ShapeItems/ShapeTransform.swift +136 -0
  150. package/Sources/Private/Model/ShapeItems/Star.swift +132 -0
  151. package/Sources/Private/Model/ShapeItems/Stroke.swift +102 -0
  152. package/Sources/Private/Model/ShapeItems/Trim.swift +78 -0
  153. package/Sources/Private/Model/Text/Font.swift +61 -0
  154. package/{lottie-swift/src → Sources}/Private/Model/Text/Glyph.swift +63 -39
  155. package/Sources/Private/Model/Text/TextAnimator.swift +165 -0
  156. package/Sources/Private/Model/Text/TextDocument.swift +123 -0
  157. package/Sources/Private/RootAnimationLayer.swift +51 -0
  158. package/{lottie-swift/src → Sources}/Private/Utility/Debugging/AnimatorNodeDebugging.swift +7 -7
  159. package/{lottie-swift/src → Sources}/Private/Utility/Debugging/LayerDebugging.swift +72 -47
  160. package/Sources/Private/Utility/Debugging/TestHelpers.swift +10 -0
  161. package/{lottie-swift/src → Sources}/Private/Utility/Extensions/AnimationKeypathExtension.swift +69 -59
  162. package/Sources/Private/Utility/Extensions/BlendMode+Filter.swift +31 -0
  163. package/Sources/Private/Utility/Extensions/CGColor+RGB.swift +22 -0
  164. package/{lottie-swift/src → Sources}/Private/Utility/Extensions/CGFloatExtensions.swift +70 -67
  165. package/Sources/Private/Utility/Extensions/DataExtension.swift +27 -0
  166. package/Sources/Private/Utility/Extensions/MathKit.swift +451 -0
  167. package/Sources/Private/Utility/Extensions/StringExtensions.swift +39 -0
  168. package/{lottie-swift/src → Sources}/Private/Utility/Helpers/AnimationContext.swift +42 -16
  169. package/Sources/Private/Utility/Interpolatable/InterpolatableExtensions.swift +135 -0
  170. package/{lottie-swift/src → Sources}/Private/Utility/Interpolatable/KeyframeExtensions.swift +13 -10
  171. package/Sources/Private/Utility/Interpolatable/KeyframeGroup+Extensions.swift +59 -0
  172. package/{lottie-swift/src → Sources}/Private/Utility/Primitives/BezierPath.swift +229 -142
  173. package/Sources/Private/Utility/Primitives/CGPointExtension.swift +35 -0
  174. package/{lottie-swift/src → Sources}/Private/Utility/Primitives/ColorExtension.swift +46 -14
  175. package/{lottie-swift/src → Sources}/Private/Utility/Primitives/CompoundBezierPath.swift +58 -49
  176. package/Sources/Private/Utility/Primitives/CurveVertex.swift +186 -0
  177. package/Sources/Private/Utility/Primitives/PathElement.swift +75 -0
  178. package/Sources/Private/Utility/Primitives/UnitBezier.swift +115 -0
  179. package/Sources/Private/Utility/Primitives/VectorsExtensions.swift +341 -0
  180. package/Sources/Public/Animation/AnimationPublic.swift +269 -0
  181. package/Sources/Public/Animation/AnimationView.swift +1315 -0
  182. package/Sources/Public/Animation/AnimationViewInitializers.swift +107 -0
  183. package/Sources/Public/AnimationCache/AnimationCacheProvider.swift +22 -0
  184. package/{lottie-swift/src → Sources}/Public/AnimationCache/LRUAnimationCache.swift +22 -18
  185. package/Sources/Public/DynamicProperties/AnimationKeypath.swift +49 -0
  186. package/Sources/Public/DynamicProperties/AnyValueProvider.swift +132 -0
  187. package/{lottie-swift/src → Sources}/Public/DynamicProperties/ValueProviders/ColorValueProvider.swift +54 -36
  188. package/{lottie-swift/src → Sources}/Public/DynamicProperties/ValueProviders/FloatValueProvider.swift +40 -36
  189. package/Sources/Public/DynamicProperties/ValueProviders/GradientValueProvider.swift +125 -0
  190. package/{lottie-swift/src → Sources}/Public/DynamicProperties/ValueProviders/PointValueProvider.swift +40 -35
  191. package/{lottie-swift/src → Sources}/Public/DynamicProperties/ValueProviders/SizeValueProvider.swift +40 -35
  192. package/{lottie-swift/src → Sources}/Public/FontProvider/AnimationFontProvider.swift +15 -8
  193. package/Sources/Public/ImageProvider/AnimationImageProvider.swift +21 -0
  194. package/Sources/Public/Keyframes/Interpolatable.swift +253 -0
  195. package/Sources/Public/Keyframes/Keyframe.swift +92 -0
  196. package/Sources/Public/Logging/LottieLogger.swift +124 -0
  197. package/Sources/Public/LottieConfiguration.swift +143 -0
  198. package/{lottie-swift/src → Sources}/Public/Primitives/AnimationTime.swift +1 -1
  199. package/{lottie-swift/src → Sources}/Public/Primitives/Color.swift +10 -6
  200. package/{lottie-swift/src → Sources}/Public/Primitives/Vectors.swift +13 -12
  201. package/Sources/Public/TextProvider/AnimationTextProvider.swift +53 -0
  202. package/{lottie-swift/src → Sources}/Public/iOS/AnimatedButton.swift +36 -26
  203. package/{lottie-swift/src → Sources}/Public/iOS/AnimatedControl.swift +102 -91
  204. package/{lottie-swift/src → Sources}/Public/iOS/AnimatedSwitch.swift +123 -92
  205. package/{lottie-swift/src → Sources}/Public/iOS/AnimationSubview.swift +3 -3
  206. package/Sources/Public/iOS/AnimationViewBase.swift +78 -0
  207. package/{lottie-swift/src → Sources}/Public/iOS/BundleImageProvider.swift +37 -34
  208. package/{lottie-swift/src → Sources}/Public/iOS/Compatibility/CompatibleAnimationKeypath.swift +4 -0
  209. package/{lottie-swift/src → Sources}/Public/iOS/Compatibility/CompatibleAnimationView.swift +38 -29
  210. package/{lottie-swift/src → Sources}/Public/iOS/FilepathImageProvider.swift +24 -20
  211. package/{lottie-swift/src → Sources}/Public/iOS/UIColorExtension.swift +4 -4
  212. package/{lottie-swift/src/Public/MacOS/AnimationSubview.swift → Sources/Public/macOS/AnimationSubview.macOS.swift} +4 -5
  213. package/{lottie-swift/src/Public/MacOS/LottieView.swift → Sources/Public/macOS/AnimationViewBase.macOS.swift} +58 -50
  214. package/{lottie-swift/src/Public/MacOS/BundleImageProvider.swift → Sources/Public/macOS/BundleImageProvider.macOS.swift} +32 -32
  215. package/Sources/Public/macOS/FilepathImageProvider.macOS.swift +69 -0
  216. package/Tests/AnimationKeypathTests.swift +94 -0
  217. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~-7Vi1RszY1XYnR2CCkEwIpKG8NwwA9zsZEz_WD7Dv6kKh4RC7N7ob8NIRVHGUJKp7eXxlpeI_gzD87Pcs_2u0g== +0 -0
  218. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~-SKV2drO-SFlrlh-wrzECDMkUSr-aF1lV9h-5onOy94zSTsD-oI45s0-KpOK45L-kq3hRY7v9vm-xmh00_eheg== +0 -0
  219. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~-_CU_vuaiFfObSeDFfmp7GuB20ThMSAL-P_RUMowiQLbdu-y0bU9upIm3q8g6XmXUG5hP6J1az0Ma5Hi_rhhRg== +0 -0
  220. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~03aPYP6VHJjZj5DlphGarj0xdw43qu09Onx5SReZoPvg9zh5uL212E-KWfGct9jf6JG0JFV2tdbBi7X_8bH9aw== +0 -0
  221. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~1Z82GPBBPc1VLvn4O7V5glb6lgyXteNlDREUzV_TPymM4ra4UkBMklzV90lEqoYRCDuRVzaQHaDYbmYp3-8CFw== +0 -0
  222. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~1mFDCboXpUu9pSHAiVGr1O_QgqEEtvJp_LUhickxLZo0Z5pj3fvadn1l2MzEOd4bFsVBZifUvcyPa7dzlMWF-A== +0 -0
  223. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~2_L9PUjv2JDKu1n8bDLb4XLB-yex6ZVjDDMwfuKAr7teDw-SKgLgkW6H-m_gjWChIVdB4vW6yvHP7XJxvXtRNA== +0 -0
  224. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~4VqMqsI5lOfxRppnud6-VDWcNsU8J7VgFCJfW2dXPwOcAkvU-I8Um5yp9n0Zv6nr3VmcxYggaVMDFfR0U_vjKw== +1 -0
  225. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~4krT4ZMzDOu34msFUq0Xod142kw4pAeSWX4JSxlsjOI0Wanu3343qeespgFi61MTWq1DdH9XXspVKqGlGm_fyw== +0 -0
  226. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~5_aJsdP-e3dRTAUnH-y1U2plaCuUi1vyHriaZuNK0xFe8wGl9Qft6uLCX2Qt6CRBKJQluEe9o0uRWw1eb42FHQ== +0 -0
  227. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~8b0bSqV7eND54zvHvu1v2Htpm7yn-BOEFw5d3mITJrXWNykJ5BTR9WbrD80JEctNcT-rDqO2xfrQk1tFWeY6Sw== +0 -0
  228. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~9u8KAGpgtSm-mQ12Py8RZUbYbDlBhM3w1I2MQO53K2CSn6IePp7g65DBcdXTYMfG1bgoJ-6x30fjnGe-2UYsDQ== +0 -0
  229. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~Bw7uMs4wqB9ahfEqGii2FkQ9pvZmG6HGe2hmbAT2wyM5hpn8Xh5dELysMcEz6hEsqmn6HdRdLOLZhC_fNaXzgA== +0 -0
  230. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~BwUq2xXQYuE8ya6HT6lfNsdtEjz5AKGf8GvLY6VBxQyIY1vgj_Gov-3NeM69OS66BQRDK0PG9H4Oyg0R48E4vg== +0 -0
  231. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~EkDVUR6dcnzxV_lYjkrJ5QGMVTCvb_upAoBF6DBu61sQkGvZN3fSRTsJ1XfJIZO-JUzdNoVA3D_CcvokL0gnQg== +0 -0
  232. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~FUkcLSJ8RAuPenM4HFG1R-sN5-cDBGcTxgR2jaVCna7xV0ZTyBHriB1Nn59mariNlJDiCoBtMUQEmauGxWtfBA== +0 -0
  233. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~FqsuZe4RVLOOVUYLTL-GTIohZ8TdSfxx7m2KJtLYFPGOdE4XorTX7Oc7kXbhghPRppXT3jW-slI37M34YNEvLQ== +0 -0
  234. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~G4F_NtyTj3i46fmKm0NorHAeq8tYWWYf6uv5yC1DwzdpWVoYbOPufmFNvdEbxZt4AMdV0gKx3HI46EAXNOQVFg== +0 -0
  235. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~GxetzGUNDgaBBXcTmLK6p9JBDX3I3QPshshbui1IaEWvJbQko-E36tCKwaJYHbleAWz9FqkAM_Tqx3YOmSVkVg== +0 -0
  236. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~H1Wjd5kKWDW4t3SDodxiHV72V8WT0xwPubw5cJTNLkPRLgaILFPh-dpy8EOUNgy1KzrDujFsm9EcTsbuqtMPLA== +0 -0
  237. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~JpI5MH4zCgebUHFpXVn4zjtsGtMNnO7BQZWfNARAB5UWa9gqz6YXHR3uLCJ_AvJ3lh53BUVkavsx9TY2FMmxbA== +0 -0
  238. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~JujNYkJtcux0Ni4QnR64zu4Wz_zYjyKvYaYZm5ypxTLPSzF3_jNE_NO4sdbDamF8wEqWoky1uf4ZE0JT3L607A== +0 -0
  239. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~KJSEA6DKnb2_FRPSqKZGh41eo-C8x448J9kEBrH012bUrZfOSDvrgmIrU0Vz7Ri3gaS9aKKmSaVMvXsHSlTJVA== +0 -0
  240. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~MStOwu3jBlJtcRnxrseVOuhI4kCj--ggFPG7sqrq5w1hjrI3bVyD-bm1Jwyx0noY3wT1rHDEvaGWnV2qsGjGwg== +0 -0
  241. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~McsJ8kFVf3IjhgXIRdw8Xx-EXgbV071bmlj2BBnk52xrWl3sEeiIyxwUsF7mIWvMRWfcFfu4VGHYyqfk2BeHXw== +0 -0
  242. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~NHt9fVe4kDdbxnglKcEwXaRK-WsYEOaD23Kbl8SJPRMYHr_Z6SJd_HmG3BROHHR_M6TgSmucONpDJdTj5tjuFw== +0 -0
  243. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~Nfo2iwCPcfAcOBIVyoUAK0-PIfr5qYxIKZt-uaSaTBdrTNxAuJ1ItmeDPZ3VdJJmxD_c22No7x482bdd3_yYtw== +0 -0
  244. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~S2Qlu11xBhEd5aGSzWsnw1TR8u8PiOF93GO0j5bfNoAFCVzxKOwhRFoIXba2EpQnLQqFdIKyhWN3l70A4GPHmg== +0 -0
  245. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~W7a7M37RO9jgck2zeR0471Pm7e8K0Kqj5tXEouDjvqKZXSrWxMaWD28oqkKKYAiU4608R4S9mM11KyphljdMSw== +0 -0
  246. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~XUo1oyPCrlL7CA74wG-OzQ06VOWJYWvHGFHU7keZN1SKaIXjHX5qi_kBzjG_rBCi89-S8GVmCy7S3PHSjG8SbQ== +0 -0
  247. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~Xh0VmDvFNMELHu08-vrs54pegVyUwwDRxx_nXkwyD0NjnYozyqcGAKAr_QWHmw6F8XyuWg51M9KGpJJIFzzGuw== +0 -0
  248. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~Xve-wMBp_lxVUgD9qH5GwieGP9cAWtm0xULZvdGjBRUMvaevmpCB5gnbMBuIXAO6a1c9v6WUq0jNVX7ut5HvOw== +0 -0
  249. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~ZU1XkZFgnEE22CXEF-pOlcj5f10x-KM1Vw9d4IOLu-NiTZcz7koYPixhdrB1PJr8J-h9NpJmfqEastfxamA1jQ== +0 -0
  250. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~_YkNYEHTsbbtFILJpzH3HenH0t4ShI25dIMdve541CF5bl-jPF3X3F7tq-t5dvP0TEkATsOJdLQdBp1xv4Q-ag== +0 -0
  251. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~boy6mpn2jkwm60jjgQ0TG25UqRdN46LzmgTVCrpy6nBOgkLCGkGHcbceiwjU1itS_vj3-iQX0ZnrWOQrPyfHNA== +0 -0
  252. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~bwzpVZ9hAqGDHhXs2FRA82dfGfLmc7-m0uQhZDDfHHO7hQ17M_Np341BZX4WDLhYYS4cdUgaDodlNpdfpG3nXw== +0 -0
  253. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~cBxe-9PpAGFdAsYkmdN3lJVqEliLcRYlyoAov0aPZfJGwUr_cOm3XpjO7nmf_2eLf8UAx-rycjnJzw07xLrNCA== +1 -0
  254. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~dirWk6W4Pav1oyciuflfJlRu0iuxbYOmrpQapOJ0mV9C1SQ-jvDRv_7h753Cy18-SwULARUdWsyUy3yNNvxF7w== +0 -0
  255. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~ebwZVjSEHroc9jtIm4jd_h_YAqEBcOkAZ4HPNJT8pLCldjRcTq-obQLakxXOhfuoOBlYBoZLuO-Y0lskeZRYKw== +0 -0
  256. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~gfcRcmRIr0h09d0jiZsA7nUeQv2XtapxuYEXZy1Z9um0tTJQvz-O5ef5f7zhLenLvjnDtDtlY_aY4Hvpce6e1Q== +0 -0
  257. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~hgOgiVCyv2R0W-f0qKw5xYPeUwj8_ccCM9vKH_7vAQcCO9t8BwR1APGRBv20AONmp-PYMXmtgsBlQkNBRBpdQA== +0 -0
  258. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~hrhCl-YRAAr8ByNB_LCgEBsVNHMp92gTIUknetpUHMjcXl4Hpn_uY-h6C45oga0ZALnfGCo6iKTmiPLa4Qvnpg== +0 -0
  259. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~n2yoR7JsyL4DSUwmjnpE4Iq9Qi_eeZrmpPU8cdehDFKfESK7nwxXxfrSMQbk0BQ2lgGPadoRcd1-qr1xVz97jA== +0 -0
  260. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~nMCcZm8WvPogyO_nuJ926Q3Q2dqVMN2LdjEL1Kq2wJ_RG-rH-e_6v41l1xZbCsQTa3XykQdEiXNc0HtAvT6IRA== +0 -0
  261. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~oc3C7xkUt-OWDL6rrsxs-seS4Fu1bqBWAAXCHalgShaGg9MUrOiRbHT2DcAnhyQFKx6x5FRbvjmYoQWrQiXJZA== +0 -0
  262. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~p-ihj7SEgkDXpMu9hvKE_wiX9cvtwyXrdIn964BfedXHKGpC6o7mMPxEyC0kRPVi_EZs_MRV5bAPEpl5h5we0g== +0 -0
  263. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~qlhO_D9oE8uSKH-mZqyRF9pp4Zv1Tv0dIYcqrH4hb1VWlIxcdxmg2j0M8496cQeFXC5bn_JMXdBlD-d6cnFF8w== +0 -0
  264. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~tjpiyIxJR_boTdUNrtFDuKIZoY84fI4lA1oMJbq9e2ZmYKIK5FeRN2O8cV_yMOYJGr4lbv03kTmT70mCjUc2_Q== +0 -0
  265. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~wULeoj18eEKJWAKx1uFQVwS48cUGFcYPRJQj1Ro5XNJsWCwppGSCdIPhwifD6Z2f_j3zfI2SmC2Gg81sBXXW7g== +0 -0
  266. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~zrEihMys4NVV5rx6FmuzEGO2TjloI3OiC7yzIhvqYoRo43ibb2F-Km6Jf4NX-ac62pOLBYZRcjQTvYMpn75_oA== +0 -0
  267. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~-7Vi1RszY1XYnR2CCkEwIpKG8NwwA9zsZEz_WD7Dv6kKh4RC7N7ob8NIRVHGUJKp7eXxlpeI_gzD87Pcs_2u0g== +0 -0
  268. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~-SKV2drO-SFlrlh-wrzECDMkUSr-aF1lV9h-5onOy94zSTsD-oI45s0-KpOK45L-kq3hRY7v9vm-xmh00_eheg== +0 -0
  269. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~-_CU_vuaiFfObSeDFfmp7GuB20ThMSAL-P_RUMowiQLbdu-y0bU9upIm3q8g6XmXUG5hP6J1az0Ma5Hi_rhhRg== +0 -0
  270. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~03aPYP6VHJjZj5DlphGarj0xdw43qu09Onx5SReZoPvg9zh5uL212E-KWfGct9jf6JG0JFV2tdbBi7X_8bH9aw== +0 -0
  271. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~1Z82GPBBPc1VLvn4O7V5glb6lgyXteNlDREUzV_TPymM4ra4UkBMklzV90lEqoYRCDuRVzaQHaDYbmYp3-8CFw== +0 -0
  272. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~1mFDCboXpUu9pSHAiVGr1O_QgqEEtvJp_LUhickxLZo0Z5pj3fvadn1l2MzEOd4bFsVBZifUvcyPa7dzlMWF-A== +0 -0
  273. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~2_L9PUjv2JDKu1n8bDLb4XLB-yex6ZVjDDMwfuKAr7teDw-SKgLgkW6H-m_gjWChIVdB4vW6yvHP7XJxvXtRNA== +0 -0
  274. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~4VqMqsI5lOfxRppnud6-VDWcNsU8J7VgFCJfW2dXPwOcAkvU-I8Um5yp9n0Zv6nr3VmcxYggaVMDFfR0U_vjKw== +0 -0
  275. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~4krT4ZMzDOu34msFUq0Xod142kw4pAeSWX4JSxlsjOI0Wanu3343qeespgFi61MTWq1DdH9XXspVKqGlGm_fyw== +0 -0
  276. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~5_aJsdP-e3dRTAUnH-y1U2plaCuUi1vyHriaZuNK0xFe8wGl9Qft6uLCX2Qt6CRBKJQluEe9o0uRWw1eb42FHQ== +0 -0
  277. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~8b0bSqV7eND54zvHvu1v2Htpm7yn-BOEFw5d3mITJrXWNykJ5BTR9WbrD80JEctNcT-rDqO2xfrQk1tFWeY6Sw== +0 -0
  278. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~9u8KAGpgtSm-mQ12Py8RZUbYbDlBhM3w1I2MQO53K2CSn6IePp7g65DBcdXTYMfG1bgoJ-6x30fjnGe-2UYsDQ== +0 -0
  279. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~Bw7uMs4wqB9ahfEqGii2FkQ9pvZmG6HGe2hmbAT2wyM5hpn8Xh5dELysMcEz6hEsqmn6HdRdLOLZhC_fNaXzgA== +0 -0
  280. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~BwUq2xXQYuE8ya6HT6lfNsdtEjz5AKGf8GvLY6VBxQyIY1vgj_Gov-3NeM69OS66BQRDK0PG9H4Oyg0R48E4vg== +0 -0
  281. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~EkDVUR6dcnzxV_lYjkrJ5QGMVTCvb_upAoBF6DBu61sQkGvZN3fSRTsJ1XfJIZO-JUzdNoVA3D_CcvokL0gnQg== +0 -0
  282. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~FUkcLSJ8RAuPenM4HFG1R-sN5-cDBGcTxgR2jaVCna7xV0ZTyBHriB1Nn59mariNlJDiCoBtMUQEmauGxWtfBA== +0 -0
  283. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~FqsuZe4RVLOOVUYLTL-GTIohZ8TdSfxx7m2KJtLYFPGOdE4XorTX7Oc7kXbhghPRppXT3jW-slI37M34YNEvLQ== +0 -0
  284. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~G4F_NtyTj3i46fmKm0NorHAeq8tYWWYf6uv5yC1DwzdpWVoYbOPufmFNvdEbxZt4AMdV0gKx3HI46EAXNOQVFg== +0 -0
  285. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~GxetzGUNDgaBBXcTmLK6p9JBDX3I3QPshshbui1IaEWvJbQko-E36tCKwaJYHbleAWz9FqkAM_Tqx3YOmSVkVg== +0 -0
  286. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~H1Wjd5kKWDW4t3SDodxiHV72V8WT0xwPubw5cJTNLkPRLgaILFPh-dpy8EOUNgy1KzrDujFsm9EcTsbuqtMPLA== +0 -0
  287. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~JpI5MH4zCgebUHFpXVn4zjtsGtMNnO7BQZWfNARAB5UWa9gqz6YXHR3uLCJ_AvJ3lh53BUVkavsx9TY2FMmxbA== +0 -0
  288. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~JujNYkJtcux0Ni4QnR64zu4Wz_zYjyKvYaYZm5ypxTLPSzF3_jNE_NO4sdbDamF8wEqWoky1uf4ZE0JT3L607A== +0 -0
  289. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~KJSEA6DKnb2_FRPSqKZGh41eo-C8x448J9kEBrH012bUrZfOSDvrgmIrU0Vz7Ri3gaS9aKKmSaVMvXsHSlTJVA== +0 -0
  290. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~MStOwu3jBlJtcRnxrseVOuhI4kCj--ggFPG7sqrq5w1hjrI3bVyD-bm1Jwyx0noY3wT1rHDEvaGWnV2qsGjGwg== +0 -0
  291. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~McsJ8kFVf3IjhgXIRdw8Xx-EXgbV071bmlj2BBnk52xrWl3sEeiIyxwUsF7mIWvMRWfcFfu4VGHYyqfk2BeHXw== +0 -0
  292. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~NHt9fVe4kDdbxnglKcEwXaRK-WsYEOaD23Kbl8SJPRMYHr_Z6SJd_HmG3BROHHR_M6TgSmucONpDJdTj5tjuFw== +0 -0
  293. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~Nfo2iwCPcfAcOBIVyoUAK0-PIfr5qYxIKZt-uaSaTBdrTNxAuJ1ItmeDPZ3VdJJmxD_c22No7x482bdd3_yYtw== +0 -0
  294. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~S2Qlu11xBhEd5aGSzWsnw1TR8u8PiOF93GO0j5bfNoAFCVzxKOwhRFoIXba2EpQnLQqFdIKyhWN3l70A4GPHmg== +0 -0
  295. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~W7a7M37RO9jgck2zeR0471Pm7e8K0Kqj5tXEouDjvqKZXSrWxMaWD28oqkKKYAiU4608R4S9mM11KyphljdMSw== +0 -0
  296. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~XUo1oyPCrlL7CA74wG-OzQ06VOWJYWvHGFHU7keZN1SKaIXjHX5qi_kBzjG_rBCi89-S8GVmCy7S3PHSjG8SbQ== +0 -0
  297. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~Xh0VmDvFNMELHu08-vrs54pegVyUwwDRxx_nXkwyD0NjnYozyqcGAKAr_QWHmw6F8XyuWg51M9KGpJJIFzzGuw== +0 -0
  298. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~Xve-wMBp_lxVUgD9qH5GwieGP9cAWtm0xULZvdGjBRUMvaevmpCB5gnbMBuIXAO6a1c9v6WUq0jNVX7ut5HvOw== +0 -0
  299. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~ZU1XkZFgnEE22CXEF-pOlcj5f10x-KM1Vw9d4IOLu-NiTZcz7koYPixhdrB1PJr8J-h9NpJmfqEastfxamA1jQ== +0 -0
  300. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~_YkNYEHTsbbtFILJpzH3HenH0t4ShI25dIMdve541CF5bl-jPF3X3F7tq-t5dvP0TEkATsOJdLQdBp1xv4Q-ag== +0 -0
  301. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~boy6mpn2jkwm60jjgQ0TG25UqRdN46LzmgTVCrpy6nBOgkLCGkGHcbceiwjU1itS_vj3-iQX0ZnrWOQrPyfHNA== +0 -0
  302. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~bwzpVZ9hAqGDHhXs2FRA82dfGfLmc7-m0uQhZDDfHHO7hQ17M_Np341BZX4WDLhYYS4cdUgaDodlNpdfpG3nXw== +0 -0
  303. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~cBxe-9PpAGFdAsYkmdN3lJVqEliLcRYlyoAov0aPZfJGwUr_cOm3XpjO7nmf_2eLf8UAx-rycjnJzw07xLrNCA== +0 -0
  304. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~dirWk6W4Pav1oyciuflfJlRu0iuxbYOmrpQapOJ0mV9C1SQ-jvDRv_7h753Cy18-SwULARUdWsyUy3yNNvxF7w== +0 -0
  305. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~ebwZVjSEHroc9jtIm4jd_h_YAqEBcOkAZ4HPNJT8pLCldjRcTq-obQLakxXOhfuoOBlYBoZLuO-Y0lskeZRYKw== +0 -0
  306. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~gfcRcmRIr0h09d0jiZsA7nUeQv2XtapxuYEXZy1Z9um0tTJQvz-O5ef5f7zhLenLvjnDtDtlY_aY4Hvpce6e1Q== +0 -0
  307. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~hgOgiVCyv2R0W-f0qKw5xYPeUwj8_ccCM9vKH_7vAQcCO9t8BwR1APGRBv20AONmp-PYMXmtgsBlQkNBRBpdQA== +0 -0
  308. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~hrhCl-YRAAr8ByNB_LCgEBsVNHMp92gTIUknetpUHMjcXl4Hpn_uY-h6C45oga0ZALnfGCo6iKTmiPLa4Qvnpg== +0 -0
  309. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~n2yoR7JsyL4DSUwmjnpE4Iq9Qi_eeZrmpPU8cdehDFKfESK7nwxXxfrSMQbk0BQ2lgGPadoRcd1-qr1xVz97jA== +0 -0
  310. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~nMCcZm8WvPogyO_nuJ926Q3Q2dqVMN2LdjEL1Kq2wJ_RG-rH-e_6v41l1xZbCsQTa3XykQdEiXNc0HtAvT6IRA== +0 -0
  311. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~oc3C7xkUt-OWDL6rrsxs-seS4Fu1bqBWAAXCHalgShaGg9MUrOiRbHT2DcAnhyQFKx6x5FRbvjmYoQWrQiXJZA== +0 -0
  312. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~p-ihj7SEgkDXpMu9hvKE_wiX9cvtwyXrdIn964BfedXHKGpC6o7mMPxEyC0kRPVi_EZs_MRV5bAPEpl5h5we0g== +0 -0
  313. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~qlhO_D9oE8uSKH-mZqyRF9pp4Zv1Tv0dIYcqrH4hb1VWlIxcdxmg2j0M8496cQeFXC5bn_JMXdBlD-d6cnFF8w== +0 -0
  314. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~tjpiyIxJR_boTdUNrtFDuKIZoY84fI4lA1oMJbq9e2ZmYKIK5FeRN2O8cV_yMOYJGr4lbv03kTmT70mCjUc2_Q== +0 -0
  315. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~wULeoj18eEKJWAKx1uFQVwS48cUGFcYPRJQj1Ro5XNJsWCwppGSCdIPhwifD6Z2f_j3zfI2SmC2Gg81sBXXW7g== +0 -0
  316. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~zrEihMys4NVV5rx6FmuzEGO2TjloI3OiC7yzIhvqYoRo43ibb2F-Km6Jf4NX-ac62pOLBYZRcjQTvYMpn75_oA== +0 -0
  317. package/Tests/Artifacts/LottieTests.xcresult/Info.plist +29 -0
  318. package/Tests/AutomaticEngineTests.swift +57 -0
  319. package/Tests/BundleTests.swift +25 -0
  320. package/Tests/DataURLTests.swift +64 -0
  321. package/Tests/ParsingTests.swift +42 -0
  322. package/Tests/PerformanceTests.swift +215 -0
  323. package/Tests/Samples/9squares_AlBoardman.json +1 -0
  324. package/Tests/Samples/Boat_Loader.json +1 -0
  325. package/Tests/Samples/HamburgerArrow.json +1 -0
  326. package/Tests/Samples/IconTransitions.json +1 -0
  327. package/Tests/Samples/Images/dog.png +0 -0
  328. package/Tests/Samples/Issues/issue_1403.json +1 -0
  329. package/Tests/Samples/Issues/issue_1407.json +1 -0
  330. package/Tests/Samples/Issues/issue_1488.json +1 -0
  331. package/Tests/Samples/Issues/issue_1505.json +1 -0
  332. package/Tests/Samples/Issues/issue_1628.json +1 -0
  333. package/Tests/Samples/Issues/pr_1536.json +1 -0
  334. package/Tests/Samples/Issues/pr_1563.json +8439 -0
  335. package/Tests/Samples/Issues/pr_1592.json +5527 -0
  336. package/Tests/Samples/Issues/pr_1599.json +738 -0
  337. package/Tests/Samples/Issues/pr_1604_1.json +1 -0
  338. package/Tests/Samples/Issues/pr_1604_2.json +1 -0
  339. package/Tests/Samples/LottieFiles/LICENSE.md +14 -0
  340. package/Tests/Samples/LottieFiles/bounce_strokes.json +1 -0
  341. package/Tests/Samples/LottieFiles/cactus.json +1 -0
  342. package/Tests/Samples/LottieFiles/dog_car_ride.json +1 -0
  343. package/Tests/Samples/LottieFiles/draft_icon.json +1 -0
  344. package/Tests/Samples/LottieFiles/gradient_1.json +1 -0
  345. package/Tests/Samples/LottieFiles/gradient_2.json +1 -0
  346. package/Tests/Samples/LottieFiles/gradient_pill.json +1 -0
  347. package/Tests/Samples/LottieFiles/gradient_shapes.json +1 -0
  348. package/Tests/Samples/LottieFiles/gradient_square.json +1 -0
  349. package/Tests/Samples/LottieFiles/growth.json +1 -0
  350. package/Tests/Samples/LottieFiles/infinity_loader.json +1 -0
  351. package/Tests/Samples/LottieFiles/loading_dots_1.json +1 -0
  352. package/Tests/Samples/LottieFiles/loading_dots_2.json +1 -0
  353. package/Tests/Samples/LottieFiles/loading_dots_3.json +1 -0
  354. package/Tests/Samples/LottieFiles/loading_gradient_strokes.json +1 -0
  355. package/Tests/Samples/LottieFiles/settings_slider.json +1 -0
  356. package/Tests/Samples/LottieFiles/shop.json +1 -0
  357. package/Tests/Samples/LottieFiles/step_loader.json +1 -0
  358. package/Tests/Samples/LottieLogo1.json +1 -0
  359. package/Tests/Samples/LottieLogo1_masked.json +1 -0
  360. package/Tests/Samples/LottieLogo2.json +1 -0
  361. package/Tests/Samples/MotionCorpse_Jrcanest.json +1 -0
  362. package/Tests/Samples/Nonanimating/BasicLayers.json +1 -0
  363. package/Tests/Samples/Nonanimating/DisableNodesTest.json +1 -0
  364. package/Tests/Samples/Nonanimating/FirstText.json +1 -0
  365. package/Tests/Samples/Nonanimating/GeometryTransformTest.json +1 -0
  366. package/Tests/Samples/Nonanimating/Text_AnimatedProperties.json +1 -0
  367. package/Tests/Samples/Nonanimating/Text_Glyph.json +1 -0
  368. package/Tests/Samples/Nonanimating/Text_NoAnimation.json +1 -0
  369. package/Tests/Samples/Nonanimating/Text_NoGlyph.json +1 -0
  370. package/Tests/Samples/Nonanimating/Zoom.json +1 -0
  371. package/Tests/Samples/Nonanimating/_dog.json +1 -0
  372. package/Tests/Samples/Nonanimating/base64Test.json +1 -0
  373. package/Tests/Samples/Nonanimating/blend_mode_test.json +1 -0
  374. package/Tests/Samples/Nonanimating/keypathTest.json +1 -0
  375. package/Tests/Samples/Nonanimating/verifyLineHeight.json +1 -0
  376. package/Tests/Samples/PinJump.json +1 -0
  377. package/Tests/Samples/Private/BrokenLottieFiles/growth_man.json +874 -0
  378. package/Tests/Samples/Private/BrokenLottieFiles/rocket.json +1 -0
  379. package/Tests/Samples/Private/China_EmptyState_Itinerary.json +1 -0
  380. package/Tests/Samples/Private/LoaderHourglass.json +12070 -0
  381. package/Tests/Samples/Private/README.md +7 -0
  382. package/Tests/Samples/Private/Urgency/alarm_animated.json +1 -0
  383. package/Tests/Samples/Private/Urgency/diamond_animated.json +1 -0
  384. package/Tests/Samples/Private/Urgency/eye_animated.json +1 -0
  385. package/Tests/Samples/Private/Urgency/light_bulb_animated.json +1 -0
  386. package/Tests/Samples/Private/Urgency/light_bulb_static.json +1 -0
  387. package/Tests/Samples/Private/Urgency/piggy_bank_static.json +1 -0
  388. package/Tests/Samples/Private/Urgency/price_tag_legacy.json +1 -0
  389. package/Tests/Samples/Private/Urgency/rausch_alarm.json +1 -0
  390. package/Tests/Samples/Private/Urgency/rausch_alert.json +1 -0
  391. package/Tests/Samples/Private/Urgency/rausch_clock.json +1 -0
  392. package/Tests/Samples/Private/Urgency/rausch_diamond.json +1 -0
  393. package/Tests/Samples/Private/Urgency/rausch_money.json +1 -0
  394. package/Tests/Samples/Private/Urgency/rausch_piggy_bank.json +1 -0
  395. package/Tests/Samples/Private/Urgency/rausch_tag.json +1 -0
  396. package/Tests/Samples/Private/Urgency/red_envelope_animated.json +1 -0
  397. package/Tests/Samples/Private/Urgency/tag_animated.json +1 -0
  398. package/Tests/Samples/Private/Urgency/trophy_animated.json +1 -0
  399. package/Tests/Samples/Private/Urgency/wings_key_animated.json +1 -0
  400. package/Tests/Samples/Private/_flexible.json +1 -0
  401. package/Tests/Samples/Private/aircover.json +1 -0
  402. package/Tests/Samples/Private/belo_spin_rausch.json +1 -0
  403. package/Tests/Samples/Private/celebration.json +2821 -0
  404. package/Tests/Samples/Private/checkbox.json +1 -0
  405. package/Tests/Samples/Private/checkbox_small.json +1 -0
  406. package/Tests/Samples/Private/getting_your_trip_ready.json +3540 -0
  407. package/Tests/Samples/Private/gradient_afternoon.json +1 -0
  408. package/Tests/Samples/Private/gradient_brand.json +1 -0
  409. package/Tests/Samples/Private/gradient_evening.json +1 -0
  410. package/Tests/Samples/Private/gradient_morning.json +1 -0
  411. package/Tests/Samples/Private/issue_1467.json +1 -0
  412. package/Tests/Samples/Private/loading_dots.json +1 -0
  413. package/Tests/Samples/Private/loading_dots_small.json +1 -0
  414. package/Tests/Samples/Private/payment_loader.json +1 -0
  415. package/Tests/Samples/Private/radio_button.json +1 -0
  416. package/Tests/Samples/Private/selfie_intro.json +1 -0
  417. package/Tests/Samples/Private/stepper_add.json +1 -0
  418. package/Tests/Samples/Private/stepper_subtract.json +1 -0
  419. package/Tests/Samples/Private/switch.json +1 -0
  420. package/Tests/Samples/Private/thumb.json +1 -0
  421. package/Tests/Samples/Private/toggle_no.json +1 -0
  422. package/Tests/Samples/Private/toggle_yes.json +1 -0
  423. package/Tests/Samples/Private/user_error_black_and_white.json +1 -0
  424. package/Tests/Samples/Private/user_error_cut_off.json +1 -0
  425. package/Tests/Samples/Switch.json +1 -0
  426. package/Tests/Samples/Switch_States.json +1 -0
  427. package/Tests/Samples/TwitterHeart.json +1 -0
  428. package/Tests/Samples/TwitterHeartButton.json +1 -0
  429. package/Tests/Samples/TypeFace/A.json +1 -0
  430. package/Tests/Samples/TypeFace/Apostrophe.json +1 -0
  431. package/Tests/Samples/TypeFace/B.json +1 -0
  432. package/Tests/Samples/TypeFace/BlinkingCursor.json +1 -0
  433. package/Tests/Samples/TypeFace/C.json +1 -0
  434. package/Tests/Samples/TypeFace/Colon.json +1 -0
  435. package/Tests/Samples/TypeFace/Comma.json +1 -0
  436. package/Tests/Samples/TypeFace/D.json +1 -0
  437. package/Tests/Samples/TypeFace/E.json +1 -0
  438. package/Tests/Samples/TypeFace/F.json +1 -0
  439. package/Tests/Samples/TypeFace/G.json +1 -0
  440. package/Tests/Samples/TypeFace/H.json +1 -0
  441. package/Tests/Samples/TypeFace/I.json +1 -0
  442. package/Tests/Samples/TypeFace/J.json +1 -0
  443. package/Tests/Samples/TypeFace/K.json +1 -0
  444. package/Tests/Samples/TypeFace/L.json +1 -0
  445. package/Tests/Samples/TypeFace/M.json +1 -0
  446. package/Tests/Samples/TypeFace/N.json +1 -0
  447. package/Tests/Samples/TypeFace/O.json +1 -0
  448. package/Tests/Samples/TypeFace/P.json +1 -0
  449. package/Tests/Samples/TypeFace/Q.json +1 -0
  450. package/Tests/Samples/TypeFace/R.json +1 -0
  451. package/Tests/Samples/TypeFace/S.json +1 -0
  452. package/Tests/Samples/TypeFace/T.json +1 -0
  453. package/Tests/Samples/TypeFace/U.json +1 -0
  454. package/Tests/Samples/TypeFace/V.json +1 -0
  455. package/Tests/Samples/TypeFace/W.json +1 -0
  456. package/Tests/Samples/TypeFace/X.json +1 -0
  457. package/Tests/Samples/TypeFace/Y.json +1 -0
  458. package/Tests/Samples/TypeFace/Z.json +1 -0
  459. package/Tests/Samples/Watermelon.json +1 -0
  460. package/Tests/Samples/setValueTest.json +1 -0
  461. package/Tests/Samples/timeremap.json +1 -0
  462. package/Tests/Samples/vcTransition1.json +1 -0
  463. package/Tests/Samples/vcTransition2.json +1 -0
  464. package/Tests/SnapshotConfiguration.swift +153 -0
  465. package/Tests/SnapshotTests.swift +265 -0
  466. package/Tests/Utils/Bundle+Module.swift +30 -0
  467. package/Tests/Utils/HardcodedFontProvider.swift +19 -0
  468. package/Tests/Utils/HardcodedImageProvider.swift +23 -0
  469. package/Tests/Utils/Snapshotting+presentationLayer.swift +47 -0
  470. package/Tests/ValueProvidersTests.swift +27 -0
  471. package/lottie-ios.podspec +12 -12
  472. package/package.json +1 -1
  473. package/script/lint/airbnb.swiftformat +68 -0
  474. package/script/lint/swiftlint.yml +38 -0
  475. package/script/test-carthage/Cartfile +1 -0
  476. package/script/test-carthage/Cartfile.resolved +1 -0
  477. package/script/test-carthage/Carthage/Build/.lottie-ios.version +19 -0
  478. package/script/test-carthage/Carthage/Build/Lottie.xcframework/Info.plist +46 -0
  479. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/BCSymbolMaps/BF971162-BE99-3507-B5B3-11947DC6B176.bcsymbolmap +14778 -0
  480. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/Lottie.framework/Headers/Lottie-Swift.h +673 -0
  481. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/Lottie.framework/Info.plist +0 -0
  482. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/Lottie.framework/Lottie +0 -0
  483. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/Lottie.framework/Modules/Lottie.swiftmodule/arm64-apple-ios.swiftdoc +0 -0
  484. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/Lottie.framework/Modules/Lottie.swiftmodule/arm64-apple-ios.swiftmodule +0 -0
  485. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/Lottie.framework/Modules/Lottie.swiftmodule/arm64.swiftdoc +0 -0
  486. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/Lottie.framework/Modules/Lottie.swiftmodule/arm64.swiftmodule +0 -0
  487. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/Lottie.framework/Modules/module.modulemap +4 -0
  488. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/dSYMs/Lottie.framework.dSYM/Contents/Info.plist +20 -0
  489. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/dSYMs/Lottie.framework.dSYM/Contents/Resources/DWARF/Lottie +0 -0
  490. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Headers/Lottie-Swift.h +1352 -0
  491. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Info.plist +0 -0
  492. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Lottie +0 -0
  493. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/Lottie.swiftmodule/Project/arm64-apple-ios-simulator.swiftsourceinfo +0 -0
  494. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/Lottie.swiftmodule/Project/arm64.swiftsourceinfo +0 -0
  495. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/Lottie.swiftmodule/Project/x86_64-apple-ios-simulator.swiftsourceinfo +0 -0
  496. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/Lottie.swiftmodule/Project/x86_64.swiftsourceinfo +0 -0
  497. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/Lottie.swiftmodule/arm64-apple-ios-simulator.swiftdoc +0 -0
  498. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/Lottie.swiftmodule/arm64-apple-ios-simulator.swiftmodule +0 -0
  499. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/Lottie.swiftmodule/arm64.swiftdoc +0 -0
  500. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/Lottie.swiftmodule/arm64.swiftmodule +0 -0
  501. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/Lottie.swiftmodule/x86_64-apple-ios-simulator.swiftdoc +0 -0
  502. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/Lottie.swiftmodule/x86_64-apple-ios-simulator.swiftmodule +0 -0
  503. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/Lottie.swiftmodule/x86_64.swiftdoc +0 -0
  504. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/Lottie.swiftmodule/x86_64.swiftmodule +0 -0
  505. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/module.modulemap +4 -0
  506. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/_CodeSignature/CodeResources +256 -0
  507. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/dSYMs/Lottie.framework.dSYM/Contents/Info.plist +20 -0
  508. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/dSYMs/Lottie.framework.dSYM/Contents/Resources/DWARF/Lottie +0 -0
  509. package/script/test-carthage/Carthage/Checkouts/lottie-ios/Lottie.xcodeproj/project.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  510. package/script/test-carthage/Carthage/Checkouts/lottie-ios/Lottie.xcodeproj/xcuserdata/cal.xcuserdatad/xcschemes/xcschememanagement.plist +37 -0
  511. package/script/test-carthage/Carthage/Checkouts/lottie-ios/Lottie.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  512. package/script/test-carthage/CarthageTest/AppDelegate.swift +27 -0
  513. package/script/test-carthage/CarthageTest/Assets.xcassets/AccentColor.colorset/Contents.json +11 -0
  514. package/script/test-carthage/CarthageTest/Assets.xcassets/AppIcon.appiconset/Contents.json +98 -0
  515. package/script/test-carthage/CarthageTest/Assets.xcassets/Contents.json +6 -0
  516. package/script/test-carthage/CarthageTest/Base.lproj/LaunchScreen.storyboard +25 -0
  517. package/script/test-carthage/CarthageTest/Base.lproj/Main.storyboard +24 -0
  518. package/script/test-carthage/CarthageTest/Info.plist +66 -0
  519. package/script/test-carthage/CarthageTest/SceneDelegate.swift +10 -0
  520. package/script/test-carthage/CarthageTest/ViewController.swift +15 -0
  521. package/script/test-carthage/CarthageTest.xcodeproj/project.pbxproj +378 -0
  522. package/script/test-carthage/CarthageTest.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
  523. package/script/test-carthage/CarthageTest.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
  524. package/script/test-carthage/CarthageTest.xcodeproj/project.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  525. package/script/test-carthage/CarthageTest.xcodeproj/xcuserdata/cal.xcuserdatad/xcschemes/xcschememanagement.plist +14 -0
  526. package/script/test-carthage/Mintfile +1 -0
  527. package/script/test-spm/LottieSPM.xcworkspace/contents.xcworkspacedata +7 -0
  528. package/script/test-spm/LottieSPM.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  529. package/script/test-spm/Mintfile +1 -0
  530. package/.swiftpm/xcode/package.xcworkspace/xcuserdata/brandonwithrow.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  531. package/Lottie/Info.plist +0 -22
  532. package/Lottie.xcodeproj/project.xcworkspace/xcuserdata/brandonwithrow.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  533. package/Lottie.xcodeproj/xcuserdata/brandonwithrow.xcuserdatad/xcschemes/LottieLibraryMacOS.xcscheme +0 -80
  534. package/Lottie.xcodeproj/xcuserdata/brandonwithrow.xcuserdatad/xcschemes/xcschememanagement.plist +0 -57
  535. package/lottie-swift/Assets/.gitkeep +0 -0
  536. package/lottie-swift/src/Private/LayerContainers/Utility/LayerFontProvider.swift +0 -37
  537. package/lottie-swift/src/Private/LayerContainers/Utility/LayerTextProvider.swift +0 -36
  538. package/lottie-swift/src/Private/Model/Animation.swift +0 -107
  539. package/lottie-swift/src/Private/Model/Assets/Asset.swift +0 -27
  540. package/lottie-swift/src/Private/Model/Assets/ImageAsset.swift +0 -48
  541. package/lottie-swift/src/Private/Model/Keyframes/Keyframe.swift +0 -128
  542. package/lottie-swift/src/Private/Model/Keyframes/KeyframeGroup.swift +0 -108
  543. package/lottie-swift/src/Private/Model/Layers/LayerModel.swift +0 -150
  544. package/lottie-swift/src/Private/Model/Objects/DashPattern.swift +0 -24
  545. package/lottie-swift/src/Private/Model/Objects/Marker.swift +0 -23
  546. package/lottie-swift/src/Private/Model/Objects/Mask.swift +0 -48
  547. package/lottie-swift/src/Private/Model/Objects/Transform.swift +0 -105
  548. package/lottie-swift/src/Private/Model/ShapeItems/Ellipse.swift +0 -50
  549. package/lottie-swift/src/Private/Model/ShapeItems/FillI.swift +0 -49
  550. package/lottie-swift/src/Private/Model/ShapeItems/GradientFill.swift +0 -86
  551. package/lottie-swift/src/Private/Model/ShapeItems/GradientStroke.swift +0 -125
  552. package/lottie-swift/src/Private/Model/ShapeItems/Rectangle.swift +0 -50
  553. package/lottie-swift/src/Private/Model/ShapeItems/Repeater.swift +0 -80
  554. package/lottie-swift/src/Private/Model/ShapeItems/Shape.swift +0 -37
  555. package/lottie-swift/src/Private/Model/ShapeItems/ShapeItem.swift +0 -95
  556. package/lottie-swift/src/Private/Model/ShapeItems/ShapeTransform.swift +0 -68
  557. package/lottie-swift/src/Private/Model/ShapeItems/Star.swift +0 -86
  558. package/lottie-swift/src/Private/Model/ShapeItems/Stroke.swift +0 -67
  559. package/lottie-swift/src/Private/Model/ShapeItems/Trim.swift +0 -53
  560. package/lottie-swift/src/Private/Model/Text/Font.swift +0 -35
  561. package/lottie-swift/src/Private/Model/Text/TextAnimator.swift +0 -99
  562. package/lottie-swift/src/Private/Model/Text/TextDocument.swift +0 -70
  563. package/lottie-swift/src/Private/NodeRenderSystem/Nodes/PathNodes/EllipseNode.swift +0 -109
  564. package/lottie-swift/src/Private/NodeRenderSystem/Nodes/PathNodes/PolygonNode.swift +0 -132
  565. package/lottie-swift/src/Private/NodeRenderSystem/Nodes/RenderContainers/GroupNode.swift +0 -141
  566. package/lottie-swift/src/Private/Utility/Extensions/MathKit.swift +0 -539
  567. package/lottie-swift/src/Private/Utility/Extensions/StringExtensions.swift +0 -32
  568. package/lottie-swift/src/Private/Utility/Interpolatable/Interpolatable.swift +0 -18
  569. package/lottie-swift/src/Private/Utility/Interpolatable/InterpolatableExtensions.swift +0 -170
  570. package/lottie-swift/src/Private/Utility/Primitives/CurveVertex.swift +0 -177
  571. package/lottie-swift/src/Private/Utility/Primitives/PathElement.swift +0 -68
  572. package/lottie-swift/src/Private/Utility/Primitives/VectorsExtensions.swift +0 -218
  573. package/lottie-swift/src/Public/Animation/AnimationPublic.swift +0 -196
  574. package/lottie-swift/src/Public/Animation/AnimationView.swift +0 -1006
  575. package/lottie-swift/src/Public/Animation/AnimationViewInitializers.swift +0 -83
  576. package/lottie-swift/src/Public/AnimationCache/AnimationCacheProvider.swift +0 -24
  577. package/lottie-swift/src/Public/DynamicProperties/AnimationKeypath.swift +0 -46
  578. package/lottie-swift/src/Public/DynamicProperties/AnyValueProvider.swift +0 -29
  579. package/lottie-swift/src/Public/DynamicProperties/ValueProviders/GradientValueProvider.swift +0 -114
  580. package/lottie-swift/src/Public/ImageProvider/AnimationImageProvider.swift +0 -23
  581. package/lottie-swift/src/Public/MacOS/FilepathImageProvider.swift +0 -67
  582. package/lottie-swift/src/Public/TextProvider/AnimationTextProvider.swift +0 -39
  583. package/lottie-swift/src/Public/iOS/LottieView.swift +0 -62
  584. package/lottie-swift-testing.podspec +0 -32
@@ -0,0 +1,130 @@
1
+ // Created by Cal Stephens on 5/4/22.
2
+ // Copyright © 2022 Airbnb Inc. All rights reserved.
3
+
4
+ // MARK: - CompatibilityIssue
5
+
6
+ /// A compatibility issue that was encountered while setting up an animation with the Core Animation engine
7
+ struct CompatibilityIssue: CustomStringConvertible {
8
+ let message: String
9
+ let context: String
10
+
11
+ var description: String {
12
+ "[\(context)] \(message)"
13
+ }
14
+ }
15
+
16
+ // MARK: - CompatibilityTracker
17
+
18
+ /// A type that tracks whether or not an animation is compatible with the Core Animation engine
19
+ final class CompatibilityTracker {
20
+
21
+ // MARK: Lifecycle
22
+
23
+ init(mode: Mode, logger: LottieLogger) {
24
+ self.mode = mode
25
+ self.logger = logger
26
+ }
27
+
28
+ // MARK: Internal
29
+
30
+ /// How compatibility issues should be handled
31
+ enum Mode {
32
+ /// When a compatibility issue is encountered, an error will be thrown immediately,
33
+ /// aborting the animation setup process as soon as possible.
34
+ case abort
35
+
36
+ /// When a compatibility issue is encountered, it is stored in `CompatibilityTracker.issues`
37
+ case track
38
+ }
39
+
40
+ enum Error: Swift.Error {
41
+ case encounteredCompatibilityIssue(CompatibilityIssue)
42
+ }
43
+
44
+ /// Records a compatibility issue that will be reported according to `CompatibilityTracker.Mode`
45
+ func logIssue(message: String, context: String) throws {
46
+ logger.assert(!context.isEmpty, "Compatibility issue context is unexpectedly empty")
47
+
48
+ let issue = CompatibilityIssue(
49
+ // Compatibility messages are usually written in source files using multi-line strings,
50
+ // but converting them to be a single line makes it easier to read the ultimate log output.
51
+ message: message.replacingOccurrences(of: "\n", with: " "),
52
+ context: context)
53
+
54
+ switch mode {
55
+ case .abort:
56
+ throw CompatibilityTracker.Error.encounteredCompatibilityIssue(issue)
57
+ case .track:
58
+ issues.append(issue)
59
+ }
60
+ }
61
+
62
+ /// Asserts that a condition is true, otherwise logs a compatibility issue that will be reported
63
+ /// according to `CompatibilityTracker.Mode`
64
+ func assert(
65
+ _ condition: Bool,
66
+ _ message: @autoclosure () -> String,
67
+ context: @autoclosure () -> String)
68
+ throws
69
+ {
70
+ if !condition {
71
+ try logIssue(message: message(), context: context())
72
+ }
73
+ }
74
+
75
+ /// Reports the compatibility issues that were recorded when setting up the animation,
76
+ /// and clears the set of tracked issues.
77
+ func reportCompatibilityIssues(_ handler: ([CompatibilityIssue]) -> Void) {
78
+ handler(issues)
79
+ issues = []
80
+ }
81
+
82
+ // MARK: Private
83
+
84
+ private let mode: Mode
85
+ private let logger: LottieLogger
86
+
87
+ /// Compatibility issues encountered while setting up the animation
88
+ private var issues = [CompatibilityIssue]()
89
+
90
+ }
91
+
92
+ // MARK: - CompatibilityTrackerProviding
93
+
94
+ protocol CompatibilityTrackerProviding {
95
+ var compatibilityTracker: CompatibilityTracker { get }
96
+ var compatibilityIssueContext: String { get }
97
+ }
98
+
99
+ extension CompatibilityTrackerProviding {
100
+ /// Records a compatibility issue that will be reported according to `CompatibilityTracker.Mode`
101
+ func logCompatibilityIssue(_ message: String) throws {
102
+ try compatibilityTracker.logIssue(message: message, context: compatibilityIssueContext)
103
+ }
104
+
105
+ /// Asserts that a condition is true, otherwise logs a compatibility issue that will be reported
106
+ /// according to `CompatibilityTracker.Mode`
107
+ func compatibilityAssert(
108
+ _ condition: Bool,
109
+ _ message: @autoclosure () -> String)
110
+ throws
111
+ {
112
+ try compatibilityTracker.assert(condition, message(), context: compatibilityIssueContext)
113
+ }
114
+ }
115
+
116
+ // MARK: - LayerContext + CompatibilityTrackerProviding
117
+
118
+ extension LayerContext: CompatibilityTrackerProviding {
119
+ var compatibilityIssueContext: String {
120
+ layerName
121
+ }
122
+ }
123
+
124
+ // MARK: - LayerAnimationContext + CompatibilityTrackerProviding
125
+
126
+ extension LayerAnimationContext: CompatibilityTrackerProviding {
127
+ var compatibilityIssueContext: String {
128
+ currentKeypath.fullPath
129
+ }
130
+ }
@@ -0,0 +1,492 @@
1
+ // Created by Cal Stephens on 12/13/21.
2
+ // Copyright © 2021 Airbnb Inc. All rights reserved.
3
+
4
+ import Foundation
5
+ import QuartzCore
6
+
7
+ // MARK: - CoreAnimationLayer
8
+
9
+ /// The root `CALayer` of the Core Animation rendering engine
10
+ final class CoreAnimationLayer: BaseAnimationLayer {
11
+
12
+ // MARK: Lifecycle
13
+
14
+ /// Initializes a `CALayer` that renders the given animation using `CAAnimation`s.
15
+ /// - This initializer is throwing, but will only throw when using
16
+ /// `CompatibilityTracker.Mode.abort`.
17
+ init(
18
+ animation: Animation,
19
+ imageProvider: AnimationImageProvider,
20
+ fontProvider: AnimationFontProvider,
21
+ compatibilityTrackerMode: CompatibilityTracker.Mode,
22
+ logger: LottieLogger)
23
+ throws
24
+ {
25
+ self.animation = animation
26
+ self.imageProvider = imageProvider
27
+ self.fontProvider = fontProvider
28
+ self.logger = logger
29
+ compatibilityTracker = CompatibilityTracker(mode: compatibilityTrackerMode, logger: logger)
30
+ valueProviderStore = ValueProviderStore(logger: logger)
31
+ super.init()
32
+
33
+ setup()
34
+ try setupChildLayers()
35
+ }
36
+
37
+ /// Called by CoreAnimation to create a shadow copy of this layer
38
+ /// More details: https://developer.apple.com/documentation/quartzcore/calayer/1410842-init
39
+ override init(layer: Any) {
40
+ guard let typedLayer = layer as? Self else {
41
+ fatalError("init(layer:) incorrectly called with \(type(of: layer))")
42
+ }
43
+
44
+ animation = typedLayer.animation
45
+ currentAnimationConfiguration = typedLayer.currentAnimationConfiguration
46
+ imageProvider = typedLayer.imageProvider
47
+ fontProvider = typedLayer.fontProvider
48
+ didSetUpAnimation = typedLayer.didSetUpAnimation
49
+ compatibilityTracker = typedLayer.compatibilityTracker
50
+ logger = typedLayer.logger
51
+ valueProviderStore = typedLayer.valueProviderStore
52
+ super.init(layer: typedLayer)
53
+ }
54
+
55
+ required init?(coder _: NSCoder) {
56
+ fatalError("init(coder:) has not been implemented")
57
+ }
58
+
59
+ // MARK: Internal
60
+
61
+ /// Timing-related configuration to apply to this layer's child `CAAnimation`s
62
+ /// - This is effectively a configurable subset of `CAMediaTiming`
63
+ struct CAMediaTimingConfiguration: Equatable {
64
+ var autoreverses = false
65
+ var repeatCount: Float = 0
66
+ var speed: Float = 1
67
+ var timeOffset: TimeInterval = 0
68
+ }
69
+
70
+ enum PlaybackState: Equatable {
71
+ /// The animation is playing in real-time
72
+ case playing
73
+ /// The animation is statically displaying a specific frame
74
+ case paused(frame: AnimationFrameTime)
75
+ }
76
+
77
+ /// Configuration used by the `playAnimation` method
78
+ struct AnimationConfiguration: Equatable {
79
+ var animationContext: AnimationContext
80
+ var timingConfiguration: CAMediaTimingConfiguration
81
+ var logHierarchyKeypaths = false
82
+ }
83
+
84
+ /// A closure that is called after this layer sets up its animation.
85
+ /// If the animation setup was unsuccessful and encountered compatibility issues,
86
+ /// those issues are included in this call.
87
+ var didSetUpAnimation: (([CompatibilityIssue]) -> Void)?
88
+
89
+ /// The `AnimationImageProvider` that `ImageLayer`s use to retrieve images,
90
+ /// referenced by name in the animation json.
91
+ var imageProvider: AnimationImageProvider {
92
+ didSet { reloadImages() }
93
+ }
94
+
95
+ /// The `FontProvider` that `TextLayer`s use to retrieve the `CTFont`
96
+ /// that they should use to render their text content
97
+ var fontProvider: AnimationFontProvider {
98
+ didSet { reloadFonts() }
99
+ }
100
+
101
+ /// Queues the animation with the given timing configuration
102
+ /// to begin playing at the next `display()` call.
103
+ /// - This batches together animations so that even if `playAnimation`
104
+ /// is called multiple times in the same run loop cycle, the animation
105
+ /// will only be set up a single time.
106
+ func playAnimation(
107
+ configuration: AnimationConfiguration,
108
+ playbackState: PlaybackState = .playing)
109
+ {
110
+ pendingAnimationConfiguration = (
111
+ animationConfiguration: configuration,
112
+ playbackState: playbackState)
113
+
114
+ setNeedsDisplay()
115
+ }
116
+
117
+ override func layoutSublayers() {
118
+ super.layoutSublayers()
119
+
120
+ // If no animation has been set up yet, display the first frame
121
+ // now that the layer hierarchy has been setup and laid out
122
+ if
123
+ pendingAnimationConfiguration == nil,
124
+ currentAnimationConfiguration == nil,
125
+ bounds.size != .zero
126
+ {
127
+ currentFrame = animation.frameTime(forProgress: animationProgress)
128
+ }
129
+ }
130
+
131
+ override func display() {
132
+ // We intentionally don't call `super.display()`, since this layer
133
+ // doesn't directly render any content.
134
+ // - This fixes an issue where certain animations would unexpectedly
135
+ // allocate a very large amount of memory (400mb+).
136
+ // - Alternatively this layer could subclass `CATransformLayer`,
137
+ // but this causes Core Animation to emit unnecessary logs.
138
+ if let pendingAnimationConfiguration = pendingAnimationConfiguration {
139
+ self.pendingAnimationConfiguration = nil
140
+
141
+ do {
142
+ try setupAnimation(for: pendingAnimationConfiguration.animationConfiguration)
143
+ } catch {
144
+ if case CompatibilityTracker.Error.encounteredCompatibilityIssue(let compatibilityIssue) = error {
145
+ // Even though the animation setup failed, we still update the layer's playback state
146
+ // so it can be read by the parent `AnimationView` when handling this error
147
+ currentPlaybackState = pendingAnimationConfiguration.playbackState
148
+
149
+ didSetUpAnimation?([compatibilityIssue])
150
+ return
151
+ }
152
+ }
153
+
154
+ currentPlaybackState = pendingAnimationConfiguration.playbackState
155
+
156
+ compatibilityTracker.reportCompatibilityIssues { compatibilityIssues in
157
+ didSetUpAnimation?(compatibilityIssues)
158
+ }
159
+ }
160
+ }
161
+
162
+ // MARK: Private
163
+
164
+ /// The configuration for the most recent animation which has been
165
+ /// queued by calling `playAnimation` but not yet actually set up
166
+ private var pendingAnimationConfiguration: (
167
+ animationConfiguration: AnimationConfiguration,
168
+ playbackState: PlaybackState)?
169
+
170
+ /// Configuration for the animation that is currently setup in this layer
171
+ private var currentAnimationConfiguration: AnimationConfiguration?
172
+
173
+ /// The current progress of the placeholder `CAAnimation`,
174
+ /// which is also the realtime animation progress of this layer's animation
175
+ @objc private var animationProgress: CGFloat = 0
176
+
177
+ private let animation: Animation
178
+ private let valueProviderStore: ValueProviderStore
179
+ private let compatibilityTracker: CompatibilityTracker
180
+ private let logger: LottieLogger
181
+
182
+ /// The current playback state of the animation that is displayed in this layer
183
+ private var currentPlaybackState: PlaybackState? {
184
+ didSet {
185
+ guard playbackState != oldValue else { return }
186
+
187
+ switch playbackState {
188
+ case .playing, nil:
189
+ timeOffset = 0
190
+ case .paused(let frame):
191
+ timeOffset = animation.time(forFrame: frame)
192
+ }
193
+ }
194
+ }
195
+
196
+ /// The current or pending playback state of the animation displayed in this layer
197
+ private var playbackState: PlaybackState? {
198
+ pendingAnimationConfiguration?.playbackState ?? currentPlaybackState
199
+ }
200
+
201
+ /// Context used when setting up and configuring sublayers
202
+ private var layerContext: LayerContext {
203
+ LayerContext(
204
+ animation: animation,
205
+ imageProvider: imageProvider,
206
+ fontProvider: fontProvider,
207
+ compatibilityTracker: compatibilityTracker,
208
+ layerName: "root layer")
209
+ }
210
+
211
+ private func setup() {
212
+ bounds = animation.bounds
213
+ }
214
+
215
+ private func setupChildLayers() throws {
216
+ try setupLayerHierarchy(
217
+ for: animation.layers,
218
+ context: layerContext)
219
+ }
220
+
221
+ /// Immediately builds and begins playing `CAAnimation`s for each sublayer
222
+ private func setupAnimation(for configuration: AnimationConfiguration) throws {
223
+ // Remove any existing animations from the layer hierarchy
224
+ removeAnimations()
225
+
226
+ currentAnimationConfiguration = configuration
227
+
228
+ let layerContext = LayerAnimationContext(
229
+ animation: animation,
230
+ timingConfiguration: configuration.timingConfiguration,
231
+ startFrame: configuration.animationContext.playFrom,
232
+ endFrame: configuration.animationContext.playTo,
233
+ valueProviderStore: valueProviderStore,
234
+ compatibilityTracker: compatibilityTracker,
235
+ logger: logger,
236
+ currentKeypath: AnimationKeypath(keys: []),
237
+ logHierarchyKeypaths: configuration.logHierarchyKeypaths)
238
+
239
+ // Perform a layout pass if necessary so all of the sublayers
240
+ // have the most up-to-date sizing information
241
+ layoutIfNeeded()
242
+
243
+ // Set the speed of this layer, which will be inherited
244
+ // by all sublayers and their animations.
245
+ // - This is required to support scrubbing with a speed of 0
246
+ speed = configuration.timingConfiguration.speed
247
+
248
+ // Setup a placeholder animation to let us track the realtime animation progress
249
+ setupPlaceholderAnimation(context: layerContext)
250
+
251
+ // Set up the new animations with the current `TimingConfiguration`
252
+ for animationLayer in sublayers ?? [] {
253
+ try (animationLayer as? AnimationLayer)?.setupAnimations(context: layerContext)
254
+ }
255
+ }
256
+
257
+ /// Sets up a placeholder `CABasicAnimation` that tracks the current
258
+ /// progress of this animation (between 0 and 1). This lets us provide
259
+ /// realtime animation progress via `self.currentFrame`.
260
+ private func setupPlaceholderAnimation(context: LayerAnimationContext) {
261
+ let animationProgressTracker = CABasicAnimation(keyPath: #keyPath(animationProgress))
262
+ animationProgressTracker.fromValue = 0
263
+ animationProgressTracker.toValue = 1
264
+
265
+ let timedProgressAnimation = animationProgressTracker.timed(with: context, for: self)
266
+ timedProgressAnimation.delegate = currentAnimationConfiguration?.animationContext.closure
267
+ add(timedProgressAnimation, forKey: #keyPath(animationProgress))
268
+ }
269
+
270
+ // Removes the current `CAAnimation`s, and rebuilds new animations
271
+ // using the same configuration as the previous animations.
272
+ private func rebuildCurrentAnimation(with newConfiguration: AnimationConfiguration? = nil) {
273
+ guard
274
+ let currentConfiguration = currentAnimationConfiguration,
275
+ let playbackState = playbackState,
276
+ // Don't replace any pending animations that are queued to begin
277
+ // on the next run loop cycle, since an existing pending animation
278
+ // will cause the animation to be rebuilt anyway.
279
+ pendingAnimationConfiguration == nil
280
+ else {
281
+ // If we already have a pending animation setup pass, but a new configuration was provided,
282
+ // replace the pending configuration with the new configuration
283
+ if let newConfiguration = newConfiguration {
284
+ pendingAnimationConfiguration?.animationConfiguration = newConfiguration
285
+ }
286
+
287
+ return
288
+ }
289
+
290
+ removeAnimations()
291
+
292
+ switch playbackState {
293
+ case .paused(let frame):
294
+ currentFrame = frame
295
+
296
+ case .playing:
297
+ playAnimation(configuration: newConfiguration ?? currentConfiguration)
298
+ }
299
+ }
300
+
301
+ }
302
+
303
+ // MARK: RootAnimationLayer
304
+
305
+ extension CoreAnimationLayer: RootAnimationLayer {
306
+
307
+ var primaryAnimationKey: AnimationKey {
308
+ .specific(#keyPath(animationProgress))
309
+ }
310
+
311
+ var isAnimationPlaying: Bool? {
312
+ switch playbackState {
313
+ case .playing:
314
+ return true
315
+ case nil, .paused:
316
+ return false
317
+ }
318
+ }
319
+
320
+ var currentFrame: AnimationFrameTime {
321
+ get {
322
+ switch playbackState {
323
+ case .playing, nil:
324
+ return animation.frameTime(forProgress: (presentation() ?? self).animationProgress)
325
+ case .paused(let frame):
326
+ return frame
327
+ }
328
+ }
329
+ set {
330
+ // We can display a specific frame of the animation by setting
331
+ // `timeOffset` of this layer. This requires setting up the layer hierarchy
332
+ // with a specific configuration (speed=0, etc) at least once. But if
333
+ // the layer hierarchy is already set up correctly, we can update the
334
+ // `timeOffset` very cheaply.
335
+ let requiredAnimationConfiguration = AnimationConfiguration(
336
+ animationContext: AnimationContext(
337
+ playFrom: animation.startFrame,
338
+ playTo: animation.endFrame,
339
+ closure: nil),
340
+ timingConfiguration: CAMediaTimingConfiguration(speed: 0))
341
+
342
+ if
343
+ pendingAnimationConfiguration == nil,
344
+ currentAnimationConfiguration == requiredAnimationConfiguration
345
+ {
346
+ currentPlaybackState = .paused(frame: newValue)
347
+ }
348
+
349
+ else {
350
+ playAnimation(
351
+ configuration: requiredAnimationConfiguration,
352
+ playbackState: .paused(frame: newValue))
353
+ }
354
+ }
355
+ }
356
+
357
+ var renderScale: CGFloat {
358
+ get { contentsScale }
359
+ set {
360
+ contentsScale = newValue
361
+
362
+ for sublayer in allSublayers {
363
+ sublayer.contentsScale = newValue
364
+ }
365
+ }
366
+ }
367
+
368
+ var respectAnimationFrameRate: Bool {
369
+ get { false }
370
+ set {
371
+ logger.assertionFailure("""
372
+ The Core Animation rendering engine currently doesn't support `respectAnimationFrameRate`)
373
+ """)
374
+ }
375
+ }
376
+
377
+ var _animationLayers: [CALayer] {
378
+ (sublayers ?? []).filter { $0 is AnimationLayer }
379
+ }
380
+
381
+ var textProvider: AnimationTextProvider {
382
+ get { DictionaryTextProvider([:]) }
383
+ set {
384
+ logger.assertionFailure("""
385
+ The Core Animation rendering engine currently doesn't support `textProvider`s")
386
+ """)
387
+ }
388
+ }
389
+
390
+ func reloadImages() {
391
+ // When the image provider changes, we have to update all `ImageLayer`s
392
+ // so they can query the most up-to-date image from the new image provider.
393
+ for sublayer in allSublayers {
394
+ if let imageLayer = sublayer as? ImageLayer {
395
+ imageLayer.setupImage(context: layerContext)
396
+ }
397
+ }
398
+ }
399
+
400
+ func reloadFonts() {
401
+ // When the text provider changes, we have to update all `TextLayer`s
402
+ // so they can query the most up-to-date font from the new font provider.
403
+ for sublayer in allSublayers {
404
+ if let textLayer = sublayer as? TextLayer {
405
+ try? textLayer.configureRenderLayer(with: layerContext)
406
+ }
407
+ }
408
+ }
409
+
410
+ func forceDisplayUpdate() {
411
+ // Unimplemented / unused
412
+ }
413
+
414
+ func logHierarchyKeypaths() {
415
+ guard var configuration = pendingAnimationConfiguration?.animationConfiguration ?? currentAnimationConfiguration else {
416
+ logger.info("Cannot log hierarchy keypaths until animation has been set up at least once")
417
+ return
418
+ }
419
+
420
+ logger.info("Lottie: Rebuilding animation with hierarchy keypath logging enabled")
421
+
422
+ // Rebuild the animation with `logHierarchyKeypaths = true` so the `ValueProviderStore` will log any keypath lookups that occur.
423
+ // This allows the consumer to know what keypaths can be customized in their animation.
424
+ configuration.logHierarchyKeypaths = true
425
+ rebuildCurrentAnimation(with: configuration)
426
+ displayIfNeeded()
427
+ }
428
+
429
+ func setValueProvider(_ valueProvider: AnyValueProvider, keypath: AnimationKeypath) {
430
+ valueProviderStore.setValueProvider(valueProvider, keypath: keypath)
431
+
432
+ // We need to rebuild the current animation after registering a value provider,
433
+ // since any existing `CAAnimation`s could now be out of date.
434
+ rebuildCurrentAnimation()
435
+ }
436
+
437
+ func getValue(for _: AnimationKeypath, atFrame _: AnimationFrameTime?) -> Any? {
438
+ logger.assertionFailure("""
439
+ The Core Animation rendering engine doesn't support querying values for individual frames
440
+ """)
441
+ return nil
442
+ }
443
+
444
+ func getOriginalValue(for _: AnimationKeypath, atFrame _: AnimationFrameTime?) -> Any? {
445
+ logger.assertionFailure("""
446
+ The Core Animation rendering engine doesn't support querying values for individual frames
447
+ """)
448
+ return nil
449
+ }
450
+
451
+ func layer(for _: AnimationKeypath) -> CALayer? {
452
+ logger.assertionFailure("""
453
+ The Core Animation rendering engine doesn't support retrieving `CALayer`s by keypath
454
+ """)
455
+ return nil
456
+ }
457
+
458
+ func animatorNodes(for _: AnimationKeypath) -> [AnimatorNode]? {
459
+ logger.assertionFailure("""
460
+ The Core Animation rendering engine does not use `AnimatorNode`s
461
+ """)
462
+ return nil
463
+ }
464
+
465
+ func removeAnimations() {
466
+ currentAnimationConfiguration = nil
467
+ currentPlaybackState = nil
468
+ removeAllAnimations()
469
+
470
+ for sublayer in allSublayers {
471
+ sublayer.removeAllAnimations()
472
+ }
473
+ }
474
+
475
+ }
476
+
477
+ // MARK: - CALayer + allSublayers
478
+
479
+ extension CALayer {
480
+ /// All of the layers in the layer tree that are descendants from this later
481
+ @nonobjc
482
+ var allSublayers: [CALayer] {
483
+ var allSublayers: [CALayer] = []
484
+
485
+ for sublayer in sublayers ?? [] {
486
+ allSublayers.append(sublayer)
487
+ allSublayers.append(contentsOf: sublayer.allSublayers)
488
+ }
489
+
490
+ return allSublayers
491
+ }
492
+ }
@@ -0,0 +1,35 @@
1
+ // Created by Cal Stephens on 12/15/21.
2
+ // Copyright © 2021 Airbnb Inc. All rights reserved.
3
+
4
+ import QuartzCore
5
+
6
+ // MARK: - CALayer + fillBoundsOfSuperlayer
7
+
8
+ extension CALayer {
9
+ /// Updates the `bounds` of this layer to fill the bounds of its `superlayer`
10
+ /// without setting `frame` (which is not permitted if the layer can rotate)
11
+ @nonobjc
12
+ func fillBoundsOfSuperlayer() {
13
+ guard let superlayer = superlayer else { return }
14
+
15
+ if let customLayerLayer = self as? CustomLayoutLayer {
16
+ customLayerLayer.layout(superlayerBounds: superlayer.bounds)
17
+ }
18
+
19
+ else {
20
+ // By default the `anchorPoint` of a layer is `CGPoint(x: 0.5, y: 0.5)`.
21
+ // Setting it to `.zero` makes the layer have the same coordinate space
22
+ // as its superlayer, which lets use use `superlayer.bounds` directly.
23
+ anchorPoint = .zero
24
+
25
+ bounds = superlayer.bounds
26
+ }
27
+ }
28
+ }
29
+
30
+ // MARK: - CustomLayoutLayer
31
+
32
+ /// A `CALayer` that sets a custom `bounds` and `anchorPoint` relative to its superlayer
33
+ protocol CustomLayoutLayer: CALayer {
34
+ func layout(superlayerBounds: CGRect)
35
+ }
@@ -0,0 +1,37 @@
1
+ // Created by Cal Stephens on 1/11/22.
2
+ // Copyright © 2022 Airbnb Inc. All rights reserved.
3
+
4
+ // MARK: - KeyframeGroup + exactlyOneKeyframe
5
+
6
+ extension KeyframeGroup {
7
+ /// Retrieves the first `Keyframe` from this group,
8
+ /// and asserts that there are not any extra keyframes that would be ignored
9
+ ///
10
+ /// - There are several places in Lottie animation definitions where multiple
11
+ /// sets of keyframe timings can be provided for properties that have to
12
+ /// be applied to a single `CALayer` property (for example, the definition for a
13
+ /// `Rectangle` technically lets you animate `size`, `position`, and `cornerRadius`
14
+ /// separately, but these all have to be combined into a single `CAKeyframeAnimation`
15
+ /// on the `CAShapeLayer.path` property.
16
+ ///
17
+ /// - In those sorts of cases, we currently choose one one `KeyframeGroup` to provide the
18
+ /// timing information, and disallow simultaneous animations on the other properties.
19
+ ///
20
+ func exactlyOneKeyframe(
21
+ context: CompatibilityTrackerProviding,
22
+ description: String,
23
+ fileID _: StaticString = #fileID,
24
+ line _: UInt = #line)
25
+ throws
26
+ -> Keyframe<T>
27
+ {
28
+ try context.compatibilityAssert(
29
+ keyframes.count == 1,
30
+ """
31
+ The Core Animation rendering engine does not support animating multiple keyframes
32
+ for \(description) values (due to limitations of Core Animation `CAKeyframeAnimation`s).
33
+ """)
34
+
35
+ return keyframes[0]
36
+ }
37
+ }