lottie-ios 3.2.0 → 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.
- package/.github/FUNDING.yml +1 -1
- package/.github/actions/setup/action.yml +32 -0
- package/.github/issue_template.md +6 -23
- package/.github/workflows/main.yml +95 -0
- package/.spi.yml +6 -0
- package/.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata +7 -0
- package/.swiftpm/xcode/package.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- package/.swiftpm/xcode/xcuserdata/{brandonwithrow.xcuserdatad → cal.xcuserdatad}/xcschemes/xcschememanagement.plist +25 -15
- package/.swiftpm/xcode/xcuserdata/calstephens.xcuserdatad/xcschemes/xcschememanagement.plist +14 -0
- package/Gemfile +4 -0
- package/Gemfile.lock +102 -0
- package/Lottie.xcodeproj/project.pbxproj +2005 -1974
- package/Lottie.xcodeproj/project.xcworkspace/contents.xcworkspacedata +1 -1
- package/Lottie.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +23 -0
- package/Lottie.xcodeproj/project.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- package/Lottie.xcodeproj/xcshareddata/xcschemes/{Lottie_iOS.xcscheme → Lottie (iOS).xcscheme } +15 -18
- package/Lottie.xcodeproj/xcshareddata/xcschemes/{Lottie_macOS.xcscheme → Lottie (macOS).xcscheme } +7 -20
- package/Lottie.xcodeproj/xcshareddata/xcschemes/{Lottie_tvOS.xcscheme → Lottie (tvOS).xcscheme } +5 -18
- package/Lottie.xcodeproj/xcuserdata/cal.xcuserdatad/xcschemes/xcschememanagement.plist +37 -0
- package/Lottie.xcodeproj/xcuserdata/calstephens.xcuserdatad/xcschemes/xcschememanagement.plist +24 -0
- package/Lottie.xcworkspace/contents.xcworkspacedata +10 -0
- package/Lottie.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
- package/Lottie.xcworkspace/xcshareddata/swiftpm/Package.resolved +34 -0
- package/Lottie.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- package/{Lottie.xcodeproj/xcuserdata/brandonwithrow.xcuserdatad → Lottie.xcworkspace/xcuserdata/cal.xcuserdatad}/xcdebugger/Breakpoints_v2.xcbkptlist +2 -2
- package/Lottie.xcworkspace/xcuserdata/cal.xcuserdatad/xcdebugger/Expressions.xcexplist +153 -0
- package/Lottie.xcworkspace/xcuserdata/calstephens.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- package/Lottie.xcworkspace/xcuserdata/calstephens.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +39 -0
- package/Lottie.xcworkspace/xcuserdata/calstephens.xcuserdatad/xcdebugger/Expressions.xcexplist +25 -0
- package/Mintfile +3 -0
- package/Package.swift +5 -15
- package/README.md +40 -59
- package/Rakefile +125 -0
- package/Sources/Private/CoreAnimation/Animations/CAAnimation+TimingConfiguration.swift +76 -0
- package/Sources/Private/CoreAnimation/Animations/CALayer+addAnimation.swift +322 -0
- package/Sources/Private/CoreAnimation/Animations/CombinedShapeAnimation.swift +53 -0
- package/Sources/Private/CoreAnimation/Animations/CustomPathAnimation.swift +41 -0
- package/Sources/Private/CoreAnimation/Animations/EllipseAnimation.swift +28 -0
- package/Sources/Private/CoreAnimation/Animations/GradientAnimations.swift +167 -0
- package/Sources/Private/CoreAnimation/Animations/LayerProperty.swift +229 -0
- package/Sources/Private/CoreAnimation/Animations/OpacityAnimation.swift +52 -0
- package/Sources/Private/CoreAnimation/Animations/RectangleAnimation.swift +31 -0
- package/Sources/Private/CoreAnimation/Animations/ShapeAnimation.swift +246 -0
- package/Sources/Private/CoreAnimation/Animations/StarAnimation.swift +95 -0
- package/Sources/Private/CoreAnimation/Animations/StrokeAnimation.swift +70 -0
- package/Sources/Private/CoreAnimation/Animations/TransformAnimations.swift +205 -0
- package/Sources/Private/CoreAnimation/Animations/VisibilityAnimation.swift +37 -0
- package/Sources/Private/CoreAnimation/CompatibilityTracker.swift +130 -0
- package/Sources/Private/CoreAnimation/CoreAnimationLayer.swift +492 -0
- package/Sources/Private/CoreAnimation/Extensions/CALayer+fillBounds.swift +35 -0
- package/Sources/Private/CoreAnimation/Extensions/KeyframeGroup+exactlyOneKeyframe.swift +37 -0
- package/Sources/Private/CoreAnimation/Extensions/Keyframes+combinedIfPossible.swift +61 -0
- package/Sources/Private/CoreAnimation/Layers/AnimationLayer.swift +77 -0
- package/Sources/Private/CoreAnimation/Layers/BaseAnimationLayer.swift +33 -0
- package/Sources/Private/CoreAnimation/Layers/BaseCompositionLayer.swift +87 -0
- package/Sources/Private/CoreAnimation/Layers/CALayer+setupLayerHierarchy.swift +131 -0
- package/Sources/Private/CoreAnimation/Layers/GradientRenderLayer.swift +87 -0
- package/Sources/Private/CoreAnimation/Layers/ImageLayer.swift +79 -0
- package/Sources/Private/CoreAnimation/Layers/LayerModel+makeAnimationLayer.swift +60 -0
- package/Sources/Private/CoreAnimation/Layers/MaskCompositionLayer.swift +138 -0
- package/Sources/Private/CoreAnimation/Layers/PreCompLayer.swift +140 -0
- package/Sources/Private/CoreAnimation/Layers/ShapeItemLayer.swift +259 -0
- package/Sources/Private/CoreAnimation/Layers/ShapeLayer.swift +305 -0
- package/Sources/Private/CoreAnimation/Layers/SolidLayer.swift +47 -0
- package/Sources/Private/CoreAnimation/Layers/TextLayer.swift +91 -0
- package/Sources/Private/CoreAnimation/Layers/TransformLayer.swift +11 -0
- package/Sources/Private/CoreAnimation/ValueProviderStore.swift +139 -0
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/CompositionLayer.swift +94 -86
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/ImageCompositionLayer.swift +24 -21
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/MaskContainerLayer.swift +77 -54
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/NullCompositionLayer.swift +5 -5
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/PreCompositionLayer.swift +59 -42
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/ShapeCompositionLayer.swift +22 -20
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/SolidCompositionLayer.swift +26 -17
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/TextCompositionLayer.swift +46 -35
- package/{lottie-swift/src/Private/LayerContainers/AnimationContainer.swift → Sources/Private/MainThread/LayerContainers/MainThreadAnimationLayer.swift} +203 -135
- package/Sources/Private/MainThread/LayerContainers/Utility/CachedImageProvider.swift +47 -0
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/Utility/CompositionLayersInitializer.swift +33 -24
- package/{lottie-swift/src/Private/LayerContainers/Utility/TextLayer.swift → Sources/Private/MainThread/LayerContainers/Utility/CoreTextRenderLayer.swift} +122 -106
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/Utility/InvertedMatteLayer.swift +25 -24
- package/Sources/Private/MainThread/LayerContainers/Utility/LayerFontProvider.swift +41 -0
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/Utility/LayerImageProvider.swift +20 -16
- package/Sources/Private/MainThread/LayerContainers/Utility/LayerTextProvider.swift +40 -0
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/Utility/LayerTransformNode.swift +83 -67
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Extensions/ItemsExtension.swift +6 -4
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/NodeProperty.swift +29 -21
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/Protocols/AnyNodeProperty.swift +16 -10
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/Protocols/AnyValueContainer.swift +7 -7
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/Protocols/KeypathSearchable.swift +5 -5
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/Protocols/NodePropertyMap.swift +10 -8
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/ValueContainer.swift +25 -21
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/ValueProviders/GroupInterpolator.swift +23 -17
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/ValueProviders/KeyframeInterpolator.swift +128 -108
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/ValueProviders/SingleValueProvider.swift +22 -17
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/ModifierNodes/TrimPathNode.swift +113 -79
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/OutputNodes/GroupOutputNode.swift +22 -16
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/OutputNodes/PassThroughOutputNode.swift +19 -15
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/OutputNodes/PathOutputNode.swift +22 -20
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/OutputNodes/Renderables/FillRenderer.swift +22 -23
- package/Sources/Private/MainThread/NodeRenderSystem/Nodes/OutputNodes/Renderables/GradientFillRenderer.swift +242 -0
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/OutputNodes/Renderables/GradientStrokeRenderer.swift +29 -22
- package/{lottie-swift/src/Private/NodeRenderSystem/Nodes/OutputNodes/Renderables/GradientFillRenderer.swift → Sources/Private/MainThread/NodeRenderSystem/Nodes/OutputNodes/Renderables/LegacyGradientFillRenderer.swift} +92 -65
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/OutputNodes/Renderables/StrokeRenderer.swift +22 -18
- package/Sources/Private/MainThread/NodeRenderSystem/Nodes/PathNodes/EllipseNode.swift +139 -0
- package/Sources/Private/MainThread/NodeRenderSystem/Nodes/PathNodes/PolygonNode.swift +170 -0
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/PathNodes/RectNode.swift +94 -57
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/PathNodes/ShapeNode.swift +42 -29
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/PathNodes/StarNode.swift +105 -66
- package/Sources/Private/MainThread/NodeRenderSystem/Nodes/RenderContainers/GroupNode.swift +155 -0
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/RenderNodes/FillNode.swift +51 -37
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/RenderNodes/GradientFillNode.swift +54 -42
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/RenderNodes/GradientStrokeNode.swift +65 -57
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/RenderNodes/StrokeNode.swift +84 -58
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/Text/TextAnimatorNode.swift +138 -119
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Protocols/AnimatorNode.swift +81 -80
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Protocols/PathNode.swift +5 -3
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Protocols/RenderNode.swift +22 -17
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/RenderLayers/ShapeContainerLayer.swift +26 -24
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/RenderLayers/ShapeRenderLayer.swift +32 -27
- package/Sources/Private/Model/Animation.swift +160 -0
- package/Sources/Private/Model/Assets/Asset.swift +43 -0
- package/{lottie-swift/src → Sources}/Private/Model/Assets/AssetLibrary.swift +40 -13
- package/Sources/Private/Model/Assets/ImageAsset.swift +112 -0
- package/{lottie-swift/src → Sources}/Private/Model/Assets/PrecompAsset.swift +20 -10
- package/Sources/Private/Model/DictionaryInitializable.swift +67 -0
- package/Sources/Private/Model/Extensions/Bundle.swift +34 -0
- package/{lottie-swift/src → Sources}/Private/Model/Extensions/KeyedDecodingContainerExtensions.swift +8 -4
- package/Sources/Private/Model/Keyframes/KeyframeData.swift +113 -0
- package/Sources/Private/Model/Keyframes/KeyframeGroup.swift +197 -0
- package/{lottie-swift/src → Sources}/Private/Model/Layers/ImageLayerModel.swift +21 -11
- package/Sources/Private/Model/Layers/LayerModel.swift +228 -0
- package/{lottie-swift/src → Sources}/Private/Model/Layers/PreCompLayerModel.swift +39 -22
- package/{lottie-swift/src → Sources}/Private/Model/Layers/ShapeLayerModel.swift +23 -12
- package/{lottie-swift/src → Sources}/Private/Model/Layers/SolidLayerModel.swift +31 -19
- package/{lottie-swift/src → Sources}/Private/Model/Layers/TextLayerModel.swift +33 -19
- package/Sources/Private/Model/Objects/DashPattern.swift +44 -0
- package/Sources/Private/Model/Objects/Marker.swift +33 -0
- package/Sources/Private/Model/Objects/Mask.swift +80 -0
- package/Sources/Private/Model/Objects/Transform.swift +179 -0
- package/Sources/Private/Model/ShapeItems/Ellipse.swift +75 -0
- package/Sources/Private/Model/ShapeItems/Fill.swift +74 -0
- package/Sources/Private/Model/ShapeItems/GradientFill.swift +124 -0
- package/Sources/Private/Model/ShapeItems/GradientStroke.swift +186 -0
- package/{lottie-swift/src → Sources}/Private/Model/ShapeItems/Group.swift +21 -10
- package/{lottie-swift/src → Sources}/Private/Model/ShapeItems/Merge.swift +29 -11
- package/Sources/Private/Model/ShapeItems/Rectangle.swift +73 -0
- package/Sources/Private/Model/ShapeItems/Repeater.swift +136 -0
- package/Sources/Private/Model/ShapeItems/Shape.swift +56 -0
- package/Sources/Private/Model/ShapeItems/ShapeItem.swift +163 -0
- package/Sources/Private/Model/ShapeItems/ShapeTransform.swift +136 -0
- package/Sources/Private/Model/ShapeItems/Star.swift +132 -0
- package/Sources/Private/Model/ShapeItems/Stroke.swift +102 -0
- package/Sources/Private/Model/ShapeItems/Trim.swift +78 -0
- package/Sources/Private/Model/Text/Font.swift +61 -0
- package/{lottie-swift/src → Sources}/Private/Model/Text/Glyph.swift +63 -39
- package/Sources/Private/Model/Text/TextAnimator.swift +165 -0
- package/Sources/Private/Model/Text/TextDocument.swift +123 -0
- package/Sources/Private/RootAnimationLayer.swift +51 -0
- package/{lottie-swift/src → Sources}/Private/Utility/Debugging/AnimatorNodeDebugging.swift +7 -7
- package/{lottie-swift/src → Sources}/Private/Utility/Debugging/LayerDebugging.swift +72 -47
- package/Sources/Private/Utility/Debugging/TestHelpers.swift +10 -0
- package/{lottie-swift/src → Sources}/Private/Utility/Extensions/AnimationKeypathExtension.swift +69 -59
- package/Sources/Private/Utility/Extensions/BlendMode+Filter.swift +31 -0
- package/Sources/Private/Utility/Extensions/CGColor+RGB.swift +22 -0
- package/{lottie-swift/src → Sources}/Private/Utility/Extensions/CGFloatExtensions.swift +70 -67
- package/Sources/Private/Utility/Extensions/DataExtension.swift +27 -0
- package/Sources/Private/Utility/Extensions/MathKit.swift +451 -0
- package/Sources/Private/Utility/Extensions/StringExtensions.swift +39 -0
- package/{lottie-swift/src → Sources}/Private/Utility/Helpers/AnimationContext.swift +42 -16
- package/Sources/Private/Utility/Interpolatable/InterpolatableExtensions.swift +135 -0
- package/{lottie-swift/src → Sources}/Private/Utility/Interpolatable/KeyframeExtensions.swift +13 -10
- package/Sources/Private/Utility/Interpolatable/KeyframeGroup+Extensions.swift +59 -0
- package/{lottie-swift/src → Sources}/Private/Utility/Primitives/BezierPath.swift +229 -142
- package/Sources/Private/Utility/Primitives/CGPointExtension.swift +35 -0
- package/{lottie-swift/src → Sources}/Private/Utility/Primitives/ColorExtension.swift +46 -14
- package/{lottie-swift/src → Sources}/Private/Utility/Primitives/CompoundBezierPath.swift +58 -49
- package/Sources/Private/Utility/Primitives/CurveVertex.swift +186 -0
- package/Sources/Private/Utility/Primitives/PathElement.swift +75 -0
- package/Sources/Private/Utility/Primitives/UnitBezier.swift +115 -0
- package/Sources/Private/Utility/Primitives/VectorsExtensions.swift +341 -0
- package/Sources/Public/Animation/AnimationPublic.swift +269 -0
- package/Sources/Public/Animation/AnimationView.swift +1315 -0
- package/Sources/Public/Animation/AnimationViewInitializers.swift +107 -0
- package/Sources/Public/AnimationCache/AnimationCacheProvider.swift +22 -0
- package/{lottie-swift/src → Sources}/Public/AnimationCache/LRUAnimationCache.swift +22 -18
- package/Sources/Public/DynamicProperties/AnimationKeypath.swift +49 -0
- package/Sources/Public/DynamicProperties/AnyValueProvider.swift +132 -0
- package/{lottie-swift/src → Sources}/Public/DynamicProperties/ValueProviders/ColorValueProvider.swift +54 -36
- package/{lottie-swift/src → Sources}/Public/DynamicProperties/ValueProviders/FloatValueProvider.swift +40 -36
- package/Sources/Public/DynamicProperties/ValueProviders/GradientValueProvider.swift +125 -0
- package/{lottie-swift/src → Sources}/Public/DynamicProperties/ValueProviders/PointValueProvider.swift +40 -35
- package/{lottie-swift/src → Sources}/Public/DynamicProperties/ValueProviders/SizeValueProvider.swift +40 -35
- package/{lottie-swift/src → Sources}/Public/FontProvider/AnimationFontProvider.swift +15 -8
- package/Sources/Public/ImageProvider/AnimationImageProvider.swift +21 -0
- package/Sources/Public/Keyframes/Interpolatable.swift +253 -0
- package/Sources/Public/Keyframes/Keyframe.swift +92 -0
- package/Sources/Public/Logging/LottieLogger.swift +124 -0
- package/Sources/Public/LottieConfiguration.swift +143 -0
- package/{lottie-swift/src → Sources}/Public/Primitives/AnimationTime.swift +1 -1
- package/{lottie-swift/src → Sources}/Public/Primitives/Color.swift +10 -6
- package/{lottie-swift/src → Sources}/Public/Primitives/Vectors.swift +13 -12
- package/Sources/Public/TextProvider/AnimationTextProvider.swift +53 -0
- package/{lottie-swift/src → Sources}/Public/iOS/AnimatedButton.swift +37 -27
- package/{lottie-swift/src → Sources}/Public/iOS/AnimatedControl.swift +103 -92
- package/{lottie-swift/src → Sources}/Public/iOS/AnimatedSwitch.swift +124 -93
- package/{lottie-swift/src → Sources}/Public/iOS/AnimationSubview.swift +4 -4
- package/Sources/Public/iOS/AnimationViewBase.swift +78 -0
- package/{lottie-swift/src → Sources}/Public/iOS/BundleImageProvider.swift +38 -35
- package/{lottie-swift/src → Sources}/Public/iOS/Compatibility/CompatibleAnimationKeypath.swift +5 -1
- package/{lottie-swift/src → Sources}/Public/iOS/Compatibility/CompatibleAnimationView.swift +39 -30
- package/{lottie-swift/src → Sources}/Public/iOS/FilepathImageProvider.swift +25 -21
- package/{lottie-swift/src → Sources}/Public/iOS/UIColorExtension.swift +5 -5
- package/{lottie-swift/src/Public/MacOS/AnimationSubview.swift → Sources/Public/macOS/AnimationSubview.macOS.swift} +4 -5
- package/{lottie-swift/src/Public/MacOS/LottieView.swift → Sources/Public/macOS/AnimationViewBase.macOS.swift} +58 -50
- package/{lottie-swift/src/Public/MacOS/BundleImageProvider.swift → Sources/Public/macOS/BundleImageProvider.macOS.swift} +32 -32
- package/Sources/Public/macOS/FilepathImageProvider.macOS.swift +69 -0
- package/Tests/AnimationKeypathTests.swift +94 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~-7Vi1RszY1XYnR2CCkEwIpKG8NwwA9zsZEz_WD7Dv6kKh4RC7N7ob8NIRVHGUJKp7eXxlpeI_gzD87Pcs_2u0g== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~-SKV2drO-SFlrlh-wrzECDMkUSr-aF1lV9h-5onOy94zSTsD-oI45s0-KpOK45L-kq3hRY7v9vm-xmh00_eheg== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~-_CU_vuaiFfObSeDFfmp7GuB20ThMSAL-P_RUMowiQLbdu-y0bU9upIm3q8g6XmXUG5hP6J1az0Ma5Hi_rhhRg== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~03aPYP6VHJjZj5DlphGarj0xdw43qu09Onx5SReZoPvg9zh5uL212E-KWfGct9jf6JG0JFV2tdbBi7X_8bH9aw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~1Z82GPBBPc1VLvn4O7V5glb6lgyXteNlDREUzV_TPymM4ra4UkBMklzV90lEqoYRCDuRVzaQHaDYbmYp3-8CFw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~1mFDCboXpUu9pSHAiVGr1O_QgqEEtvJp_LUhickxLZo0Z5pj3fvadn1l2MzEOd4bFsVBZifUvcyPa7dzlMWF-A== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~2_L9PUjv2JDKu1n8bDLb4XLB-yex6ZVjDDMwfuKAr7teDw-SKgLgkW6H-m_gjWChIVdB4vW6yvHP7XJxvXtRNA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~4VqMqsI5lOfxRppnud6-VDWcNsU8J7VgFCJfW2dXPwOcAkvU-I8Um5yp9n0Zv6nr3VmcxYggaVMDFfR0U_vjKw== +1 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~4krT4ZMzDOu34msFUq0Xod142kw4pAeSWX4JSxlsjOI0Wanu3343qeespgFi61MTWq1DdH9XXspVKqGlGm_fyw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~5_aJsdP-e3dRTAUnH-y1U2plaCuUi1vyHriaZuNK0xFe8wGl9Qft6uLCX2Qt6CRBKJQluEe9o0uRWw1eb42FHQ== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~8b0bSqV7eND54zvHvu1v2Htpm7yn-BOEFw5d3mITJrXWNykJ5BTR9WbrD80JEctNcT-rDqO2xfrQk1tFWeY6Sw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~9u8KAGpgtSm-mQ12Py8RZUbYbDlBhM3w1I2MQO53K2CSn6IePp7g65DBcdXTYMfG1bgoJ-6x30fjnGe-2UYsDQ== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~Bw7uMs4wqB9ahfEqGii2FkQ9pvZmG6HGe2hmbAT2wyM5hpn8Xh5dELysMcEz6hEsqmn6HdRdLOLZhC_fNaXzgA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~BwUq2xXQYuE8ya6HT6lfNsdtEjz5AKGf8GvLY6VBxQyIY1vgj_Gov-3NeM69OS66BQRDK0PG9H4Oyg0R48E4vg== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~EkDVUR6dcnzxV_lYjkrJ5QGMVTCvb_upAoBF6DBu61sQkGvZN3fSRTsJ1XfJIZO-JUzdNoVA3D_CcvokL0gnQg== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~FUkcLSJ8RAuPenM4HFG1R-sN5-cDBGcTxgR2jaVCna7xV0ZTyBHriB1Nn59mariNlJDiCoBtMUQEmauGxWtfBA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~FqsuZe4RVLOOVUYLTL-GTIohZ8TdSfxx7m2KJtLYFPGOdE4XorTX7Oc7kXbhghPRppXT3jW-slI37M34YNEvLQ== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~G4F_NtyTj3i46fmKm0NorHAeq8tYWWYf6uv5yC1DwzdpWVoYbOPufmFNvdEbxZt4AMdV0gKx3HI46EAXNOQVFg== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~GxetzGUNDgaBBXcTmLK6p9JBDX3I3QPshshbui1IaEWvJbQko-E36tCKwaJYHbleAWz9FqkAM_Tqx3YOmSVkVg== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~H1Wjd5kKWDW4t3SDodxiHV72V8WT0xwPubw5cJTNLkPRLgaILFPh-dpy8EOUNgy1KzrDujFsm9EcTsbuqtMPLA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~JpI5MH4zCgebUHFpXVn4zjtsGtMNnO7BQZWfNARAB5UWa9gqz6YXHR3uLCJ_AvJ3lh53BUVkavsx9TY2FMmxbA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~JujNYkJtcux0Ni4QnR64zu4Wz_zYjyKvYaYZm5ypxTLPSzF3_jNE_NO4sdbDamF8wEqWoky1uf4ZE0JT3L607A== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~KJSEA6DKnb2_FRPSqKZGh41eo-C8x448J9kEBrH012bUrZfOSDvrgmIrU0Vz7Ri3gaS9aKKmSaVMvXsHSlTJVA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~MStOwu3jBlJtcRnxrseVOuhI4kCj--ggFPG7sqrq5w1hjrI3bVyD-bm1Jwyx0noY3wT1rHDEvaGWnV2qsGjGwg== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~McsJ8kFVf3IjhgXIRdw8Xx-EXgbV071bmlj2BBnk52xrWl3sEeiIyxwUsF7mIWvMRWfcFfu4VGHYyqfk2BeHXw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~NHt9fVe4kDdbxnglKcEwXaRK-WsYEOaD23Kbl8SJPRMYHr_Z6SJd_HmG3BROHHR_M6TgSmucONpDJdTj5tjuFw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~Nfo2iwCPcfAcOBIVyoUAK0-PIfr5qYxIKZt-uaSaTBdrTNxAuJ1ItmeDPZ3VdJJmxD_c22No7x482bdd3_yYtw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~S2Qlu11xBhEd5aGSzWsnw1TR8u8PiOF93GO0j5bfNoAFCVzxKOwhRFoIXba2EpQnLQqFdIKyhWN3l70A4GPHmg== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~W7a7M37RO9jgck2zeR0471Pm7e8K0Kqj5tXEouDjvqKZXSrWxMaWD28oqkKKYAiU4608R4S9mM11KyphljdMSw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~XUo1oyPCrlL7CA74wG-OzQ06VOWJYWvHGFHU7keZN1SKaIXjHX5qi_kBzjG_rBCi89-S8GVmCy7S3PHSjG8SbQ== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~Xh0VmDvFNMELHu08-vrs54pegVyUwwDRxx_nXkwyD0NjnYozyqcGAKAr_QWHmw6F8XyuWg51M9KGpJJIFzzGuw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~Xve-wMBp_lxVUgD9qH5GwieGP9cAWtm0xULZvdGjBRUMvaevmpCB5gnbMBuIXAO6a1c9v6WUq0jNVX7ut5HvOw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~ZU1XkZFgnEE22CXEF-pOlcj5f10x-KM1Vw9d4IOLu-NiTZcz7koYPixhdrB1PJr8J-h9NpJmfqEastfxamA1jQ== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~_YkNYEHTsbbtFILJpzH3HenH0t4ShI25dIMdve541CF5bl-jPF3X3F7tq-t5dvP0TEkATsOJdLQdBp1xv4Q-ag== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~boy6mpn2jkwm60jjgQ0TG25UqRdN46LzmgTVCrpy6nBOgkLCGkGHcbceiwjU1itS_vj3-iQX0ZnrWOQrPyfHNA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~bwzpVZ9hAqGDHhXs2FRA82dfGfLmc7-m0uQhZDDfHHO7hQ17M_Np341BZX4WDLhYYS4cdUgaDodlNpdfpG3nXw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~cBxe-9PpAGFdAsYkmdN3lJVqEliLcRYlyoAov0aPZfJGwUr_cOm3XpjO7nmf_2eLf8UAx-rycjnJzw07xLrNCA== +1 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~dirWk6W4Pav1oyciuflfJlRu0iuxbYOmrpQapOJ0mV9C1SQ-jvDRv_7h753Cy18-SwULARUdWsyUy3yNNvxF7w== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~ebwZVjSEHroc9jtIm4jd_h_YAqEBcOkAZ4HPNJT8pLCldjRcTq-obQLakxXOhfuoOBlYBoZLuO-Y0lskeZRYKw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~gfcRcmRIr0h09d0jiZsA7nUeQv2XtapxuYEXZy1Z9um0tTJQvz-O5ef5f7zhLenLvjnDtDtlY_aY4Hvpce6e1Q== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~hgOgiVCyv2R0W-f0qKw5xYPeUwj8_ccCM9vKH_7vAQcCO9t8BwR1APGRBv20AONmp-PYMXmtgsBlQkNBRBpdQA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~hrhCl-YRAAr8ByNB_LCgEBsVNHMp92gTIUknetpUHMjcXl4Hpn_uY-h6C45oga0ZALnfGCo6iKTmiPLa4Qvnpg== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~n2yoR7JsyL4DSUwmjnpE4Iq9Qi_eeZrmpPU8cdehDFKfESK7nwxXxfrSMQbk0BQ2lgGPadoRcd1-qr1xVz97jA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~nMCcZm8WvPogyO_nuJ926Q3Q2dqVMN2LdjEL1Kq2wJ_RG-rH-e_6v41l1xZbCsQTa3XykQdEiXNc0HtAvT6IRA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~oc3C7xkUt-OWDL6rrsxs-seS4Fu1bqBWAAXCHalgShaGg9MUrOiRbHT2DcAnhyQFKx6x5FRbvjmYoQWrQiXJZA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~p-ihj7SEgkDXpMu9hvKE_wiX9cvtwyXrdIn964BfedXHKGpC6o7mMPxEyC0kRPVi_EZs_MRV5bAPEpl5h5we0g== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~qlhO_D9oE8uSKH-mZqyRF9pp4Zv1Tv0dIYcqrH4hb1VWlIxcdxmg2j0M8496cQeFXC5bn_JMXdBlD-d6cnFF8w== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~tjpiyIxJR_boTdUNrtFDuKIZoY84fI4lA1oMJbq9e2ZmYKIK5FeRN2O8cV_yMOYJGr4lbv03kTmT70mCjUc2_Q== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~wULeoj18eEKJWAKx1uFQVwS48cUGFcYPRJQj1Ro5XNJsWCwppGSCdIPhwifD6Z2f_j3zfI2SmC2Gg81sBXXW7g== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~zrEihMys4NVV5rx6FmuzEGO2TjloI3OiC7yzIhvqYoRo43ibb2F-Km6Jf4NX-ac62pOLBYZRcjQTvYMpn75_oA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~-7Vi1RszY1XYnR2CCkEwIpKG8NwwA9zsZEz_WD7Dv6kKh4RC7N7ob8NIRVHGUJKp7eXxlpeI_gzD87Pcs_2u0g== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~-SKV2drO-SFlrlh-wrzECDMkUSr-aF1lV9h-5onOy94zSTsD-oI45s0-KpOK45L-kq3hRY7v9vm-xmh00_eheg== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~-_CU_vuaiFfObSeDFfmp7GuB20ThMSAL-P_RUMowiQLbdu-y0bU9upIm3q8g6XmXUG5hP6J1az0Ma5Hi_rhhRg== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~03aPYP6VHJjZj5DlphGarj0xdw43qu09Onx5SReZoPvg9zh5uL212E-KWfGct9jf6JG0JFV2tdbBi7X_8bH9aw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~1Z82GPBBPc1VLvn4O7V5glb6lgyXteNlDREUzV_TPymM4ra4UkBMklzV90lEqoYRCDuRVzaQHaDYbmYp3-8CFw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~1mFDCboXpUu9pSHAiVGr1O_QgqEEtvJp_LUhickxLZo0Z5pj3fvadn1l2MzEOd4bFsVBZifUvcyPa7dzlMWF-A== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~2_L9PUjv2JDKu1n8bDLb4XLB-yex6ZVjDDMwfuKAr7teDw-SKgLgkW6H-m_gjWChIVdB4vW6yvHP7XJxvXtRNA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~4VqMqsI5lOfxRppnud6-VDWcNsU8J7VgFCJfW2dXPwOcAkvU-I8Um5yp9n0Zv6nr3VmcxYggaVMDFfR0U_vjKw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~4krT4ZMzDOu34msFUq0Xod142kw4pAeSWX4JSxlsjOI0Wanu3343qeespgFi61MTWq1DdH9XXspVKqGlGm_fyw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~5_aJsdP-e3dRTAUnH-y1U2plaCuUi1vyHriaZuNK0xFe8wGl9Qft6uLCX2Qt6CRBKJQluEe9o0uRWw1eb42FHQ== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~8b0bSqV7eND54zvHvu1v2Htpm7yn-BOEFw5d3mITJrXWNykJ5BTR9WbrD80JEctNcT-rDqO2xfrQk1tFWeY6Sw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~9u8KAGpgtSm-mQ12Py8RZUbYbDlBhM3w1I2MQO53K2CSn6IePp7g65DBcdXTYMfG1bgoJ-6x30fjnGe-2UYsDQ== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~Bw7uMs4wqB9ahfEqGii2FkQ9pvZmG6HGe2hmbAT2wyM5hpn8Xh5dELysMcEz6hEsqmn6HdRdLOLZhC_fNaXzgA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~BwUq2xXQYuE8ya6HT6lfNsdtEjz5AKGf8GvLY6VBxQyIY1vgj_Gov-3NeM69OS66BQRDK0PG9H4Oyg0R48E4vg== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~EkDVUR6dcnzxV_lYjkrJ5QGMVTCvb_upAoBF6DBu61sQkGvZN3fSRTsJ1XfJIZO-JUzdNoVA3D_CcvokL0gnQg== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~FUkcLSJ8RAuPenM4HFG1R-sN5-cDBGcTxgR2jaVCna7xV0ZTyBHriB1Nn59mariNlJDiCoBtMUQEmauGxWtfBA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~FqsuZe4RVLOOVUYLTL-GTIohZ8TdSfxx7m2KJtLYFPGOdE4XorTX7Oc7kXbhghPRppXT3jW-slI37M34YNEvLQ== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~G4F_NtyTj3i46fmKm0NorHAeq8tYWWYf6uv5yC1DwzdpWVoYbOPufmFNvdEbxZt4AMdV0gKx3HI46EAXNOQVFg== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~GxetzGUNDgaBBXcTmLK6p9JBDX3I3QPshshbui1IaEWvJbQko-E36tCKwaJYHbleAWz9FqkAM_Tqx3YOmSVkVg== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~H1Wjd5kKWDW4t3SDodxiHV72V8WT0xwPubw5cJTNLkPRLgaILFPh-dpy8EOUNgy1KzrDujFsm9EcTsbuqtMPLA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~JpI5MH4zCgebUHFpXVn4zjtsGtMNnO7BQZWfNARAB5UWa9gqz6YXHR3uLCJ_AvJ3lh53BUVkavsx9TY2FMmxbA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~JujNYkJtcux0Ni4QnR64zu4Wz_zYjyKvYaYZm5ypxTLPSzF3_jNE_NO4sdbDamF8wEqWoky1uf4ZE0JT3L607A== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~KJSEA6DKnb2_FRPSqKZGh41eo-C8x448J9kEBrH012bUrZfOSDvrgmIrU0Vz7Ri3gaS9aKKmSaVMvXsHSlTJVA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~MStOwu3jBlJtcRnxrseVOuhI4kCj--ggFPG7sqrq5w1hjrI3bVyD-bm1Jwyx0noY3wT1rHDEvaGWnV2qsGjGwg== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~McsJ8kFVf3IjhgXIRdw8Xx-EXgbV071bmlj2BBnk52xrWl3sEeiIyxwUsF7mIWvMRWfcFfu4VGHYyqfk2BeHXw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~NHt9fVe4kDdbxnglKcEwXaRK-WsYEOaD23Kbl8SJPRMYHr_Z6SJd_HmG3BROHHR_M6TgSmucONpDJdTj5tjuFw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~Nfo2iwCPcfAcOBIVyoUAK0-PIfr5qYxIKZt-uaSaTBdrTNxAuJ1ItmeDPZ3VdJJmxD_c22No7x482bdd3_yYtw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~S2Qlu11xBhEd5aGSzWsnw1TR8u8PiOF93GO0j5bfNoAFCVzxKOwhRFoIXba2EpQnLQqFdIKyhWN3l70A4GPHmg== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~W7a7M37RO9jgck2zeR0471Pm7e8K0Kqj5tXEouDjvqKZXSrWxMaWD28oqkKKYAiU4608R4S9mM11KyphljdMSw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~XUo1oyPCrlL7CA74wG-OzQ06VOWJYWvHGFHU7keZN1SKaIXjHX5qi_kBzjG_rBCi89-S8GVmCy7S3PHSjG8SbQ== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~Xh0VmDvFNMELHu08-vrs54pegVyUwwDRxx_nXkwyD0NjnYozyqcGAKAr_QWHmw6F8XyuWg51M9KGpJJIFzzGuw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~Xve-wMBp_lxVUgD9qH5GwieGP9cAWtm0xULZvdGjBRUMvaevmpCB5gnbMBuIXAO6a1c9v6WUq0jNVX7ut5HvOw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~ZU1XkZFgnEE22CXEF-pOlcj5f10x-KM1Vw9d4IOLu-NiTZcz7koYPixhdrB1PJr8J-h9NpJmfqEastfxamA1jQ== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~_YkNYEHTsbbtFILJpzH3HenH0t4ShI25dIMdve541CF5bl-jPF3X3F7tq-t5dvP0TEkATsOJdLQdBp1xv4Q-ag== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~boy6mpn2jkwm60jjgQ0TG25UqRdN46LzmgTVCrpy6nBOgkLCGkGHcbceiwjU1itS_vj3-iQX0ZnrWOQrPyfHNA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~bwzpVZ9hAqGDHhXs2FRA82dfGfLmc7-m0uQhZDDfHHO7hQ17M_Np341BZX4WDLhYYS4cdUgaDodlNpdfpG3nXw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~cBxe-9PpAGFdAsYkmdN3lJVqEliLcRYlyoAov0aPZfJGwUr_cOm3XpjO7nmf_2eLf8UAx-rycjnJzw07xLrNCA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~dirWk6W4Pav1oyciuflfJlRu0iuxbYOmrpQapOJ0mV9C1SQ-jvDRv_7h753Cy18-SwULARUdWsyUy3yNNvxF7w== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~ebwZVjSEHroc9jtIm4jd_h_YAqEBcOkAZ4HPNJT8pLCldjRcTq-obQLakxXOhfuoOBlYBoZLuO-Y0lskeZRYKw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~gfcRcmRIr0h09d0jiZsA7nUeQv2XtapxuYEXZy1Z9um0tTJQvz-O5ef5f7zhLenLvjnDtDtlY_aY4Hvpce6e1Q== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~hgOgiVCyv2R0W-f0qKw5xYPeUwj8_ccCM9vKH_7vAQcCO9t8BwR1APGRBv20AONmp-PYMXmtgsBlQkNBRBpdQA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~hrhCl-YRAAr8ByNB_LCgEBsVNHMp92gTIUknetpUHMjcXl4Hpn_uY-h6C45oga0ZALnfGCo6iKTmiPLa4Qvnpg== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~n2yoR7JsyL4DSUwmjnpE4Iq9Qi_eeZrmpPU8cdehDFKfESK7nwxXxfrSMQbk0BQ2lgGPadoRcd1-qr1xVz97jA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~nMCcZm8WvPogyO_nuJ926Q3Q2dqVMN2LdjEL1Kq2wJ_RG-rH-e_6v41l1xZbCsQTa3XykQdEiXNc0HtAvT6IRA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~oc3C7xkUt-OWDL6rrsxs-seS4Fu1bqBWAAXCHalgShaGg9MUrOiRbHT2DcAnhyQFKx6x5FRbvjmYoQWrQiXJZA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~p-ihj7SEgkDXpMu9hvKE_wiX9cvtwyXrdIn964BfedXHKGpC6o7mMPxEyC0kRPVi_EZs_MRV5bAPEpl5h5we0g== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~qlhO_D9oE8uSKH-mZqyRF9pp4Zv1Tv0dIYcqrH4hb1VWlIxcdxmg2j0M8496cQeFXC5bn_JMXdBlD-d6cnFF8w== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~tjpiyIxJR_boTdUNrtFDuKIZoY84fI4lA1oMJbq9e2ZmYKIK5FeRN2O8cV_yMOYJGr4lbv03kTmT70mCjUc2_Q== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~wULeoj18eEKJWAKx1uFQVwS48cUGFcYPRJQj1Ro5XNJsWCwppGSCdIPhwifD6Z2f_j3zfI2SmC2Gg81sBXXW7g== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~zrEihMys4NVV5rx6FmuzEGO2TjloI3OiC7yzIhvqYoRo43ibb2F-Km6Jf4NX-ac62pOLBYZRcjQTvYMpn75_oA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Info.plist +29 -0
- package/Tests/AutomaticEngineTests.swift +57 -0
- package/Tests/BundleTests.swift +25 -0
- package/Tests/DataURLTests.swift +64 -0
- package/Tests/ParsingTests.swift +42 -0
- package/Tests/PerformanceTests.swift +215 -0
- package/Tests/Samples/9squares_AlBoardman.json +1 -0
- package/Tests/Samples/Boat_Loader.json +1 -0
- package/Tests/Samples/HamburgerArrow.json +1 -0
- package/Tests/Samples/IconTransitions.json +1 -0
- package/Tests/Samples/Images/dog.png +0 -0
- package/Tests/Samples/Issues/issue_1403.json +1 -0
- package/Tests/Samples/Issues/issue_1407.json +1 -0
- package/Tests/Samples/Issues/issue_1488.json +1 -0
- package/Tests/Samples/Issues/issue_1505.json +1 -0
- package/Tests/Samples/Issues/issue_1628.json +1 -0
- package/Tests/Samples/Issues/pr_1536.json +1 -0
- package/Tests/Samples/Issues/pr_1563.json +8439 -0
- package/Tests/Samples/Issues/pr_1592.json +5527 -0
- package/Tests/Samples/Issues/pr_1599.json +738 -0
- package/Tests/Samples/Issues/pr_1604_1.json +1 -0
- package/Tests/Samples/Issues/pr_1604_2.json +1 -0
- package/Tests/Samples/LottieFiles/LICENSE.md +14 -0
- package/Tests/Samples/LottieFiles/bounce_strokes.json +1 -0
- package/Tests/Samples/LottieFiles/cactus.json +1 -0
- package/Tests/Samples/LottieFiles/dog_car_ride.json +1 -0
- package/Tests/Samples/LottieFiles/draft_icon.json +1 -0
- package/Tests/Samples/LottieFiles/gradient_1.json +1 -0
- package/Tests/Samples/LottieFiles/gradient_2.json +1 -0
- package/Tests/Samples/LottieFiles/gradient_pill.json +1 -0
- package/Tests/Samples/LottieFiles/gradient_shapes.json +1 -0
- package/Tests/Samples/LottieFiles/gradient_square.json +1 -0
- package/Tests/Samples/LottieFiles/growth.json +1 -0
- package/Tests/Samples/LottieFiles/infinity_loader.json +1 -0
- package/Tests/Samples/LottieFiles/loading_dots_1.json +1 -0
- package/Tests/Samples/LottieFiles/loading_dots_2.json +1 -0
- package/Tests/Samples/LottieFiles/loading_dots_3.json +1 -0
- package/Tests/Samples/LottieFiles/loading_gradient_strokes.json +1 -0
- package/Tests/Samples/LottieFiles/settings_slider.json +1 -0
- package/Tests/Samples/LottieFiles/shop.json +1 -0
- package/Tests/Samples/LottieFiles/step_loader.json +1 -0
- package/Tests/Samples/LottieLogo1.json +1 -0
- package/Tests/Samples/LottieLogo1_masked.json +1 -0
- package/Tests/Samples/LottieLogo2.json +1 -0
- package/Tests/Samples/MotionCorpse_Jrcanest.json +1 -0
- package/Tests/Samples/Nonanimating/BasicLayers.json +1 -0
- package/Tests/Samples/Nonanimating/DisableNodesTest.json +1 -0
- package/Tests/Samples/Nonanimating/FirstText.json +1 -0
- package/Tests/Samples/Nonanimating/GeometryTransformTest.json +1 -0
- package/Tests/Samples/Nonanimating/Text_AnimatedProperties.json +1 -0
- package/Tests/Samples/Nonanimating/Text_Glyph.json +1 -0
- package/Tests/Samples/Nonanimating/Text_NoAnimation.json +1 -0
- package/Tests/Samples/Nonanimating/Text_NoGlyph.json +1 -0
- package/Tests/Samples/Nonanimating/Zoom.json +1 -0
- package/Tests/Samples/Nonanimating/_dog.json +1 -0
- package/Tests/Samples/Nonanimating/base64Test.json +1 -0
- package/Tests/Samples/Nonanimating/blend_mode_test.json +1 -0
- package/Tests/Samples/Nonanimating/keypathTest.json +1 -0
- package/Tests/Samples/Nonanimating/verifyLineHeight.json +1 -0
- package/Tests/Samples/PinJump.json +1 -0
- package/Tests/Samples/Private/BrokenLottieFiles/growth_man.json +874 -0
- package/Tests/Samples/Private/BrokenLottieFiles/rocket.json +1 -0
- package/Tests/Samples/Private/China_EmptyState_Itinerary.json +1 -0
- package/Tests/Samples/Private/LoaderHourglass.json +12070 -0
- package/Tests/Samples/Private/README.md +7 -0
- package/Tests/Samples/Private/Urgency/alarm_animated.json +1 -0
- package/Tests/Samples/Private/Urgency/diamond_animated.json +1 -0
- package/Tests/Samples/Private/Urgency/eye_animated.json +1 -0
- package/Tests/Samples/Private/Urgency/light_bulb_animated.json +1 -0
- package/Tests/Samples/Private/Urgency/light_bulb_static.json +1 -0
- package/Tests/Samples/Private/Urgency/piggy_bank_static.json +1 -0
- package/Tests/Samples/Private/Urgency/price_tag_legacy.json +1 -0
- package/Tests/Samples/Private/Urgency/rausch_alarm.json +1 -0
- package/Tests/Samples/Private/Urgency/rausch_alert.json +1 -0
- package/Tests/Samples/Private/Urgency/rausch_clock.json +1 -0
- package/Tests/Samples/Private/Urgency/rausch_diamond.json +1 -0
- package/Tests/Samples/Private/Urgency/rausch_money.json +1 -0
- package/Tests/Samples/Private/Urgency/rausch_piggy_bank.json +1 -0
- package/Tests/Samples/Private/Urgency/rausch_tag.json +1 -0
- package/Tests/Samples/Private/Urgency/red_envelope_animated.json +1 -0
- package/Tests/Samples/Private/Urgency/tag_animated.json +1 -0
- package/Tests/Samples/Private/Urgency/trophy_animated.json +1 -0
- package/Tests/Samples/Private/Urgency/wings_key_animated.json +1 -0
- package/Tests/Samples/Private/_flexible.json +1 -0
- package/Tests/Samples/Private/aircover.json +1 -0
- package/Tests/Samples/Private/belo_spin_rausch.json +1 -0
- package/Tests/Samples/Private/celebration.json +2821 -0
- package/Tests/Samples/Private/checkbox.json +1 -0
- package/Tests/Samples/Private/checkbox_small.json +1 -0
- package/Tests/Samples/Private/getting_your_trip_ready.json +3540 -0
- package/Tests/Samples/Private/gradient_afternoon.json +1 -0
- package/Tests/Samples/Private/gradient_brand.json +1 -0
- package/Tests/Samples/Private/gradient_evening.json +1 -0
- package/Tests/Samples/Private/gradient_morning.json +1 -0
- package/Tests/Samples/Private/issue_1467.json +1 -0
- package/Tests/Samples/Private/loading_dots.json +1 -0
- package/Tests/Samples/Private/loading_dots_small.json +1 -0
- package/Tests/Samples/Private/payment_loader.json +1 -0
- package/Tests/Samples/Private/radio_button.json +1 -0
- package/Tests/Samples/Private/selfie_intro.json +1 -0
- package/Tests/Samples/Private/stepper_add.json +1 -0
- package/Tests/Samples/Private/stepper_subtract.json +1 -0
- package/Tests/Samples/Private/switch.json +1 -0
- package/Tests/Samples/Private/thumb.json +1 -0
- package/Tests/Samples/Private/toggle_no.json +1 -0
- package/Tests/Samples/Private/toggle_yes.json +1 -0
- package/Tests/Samples/Private/user_error_black_and_white.json +1 -0
- package/Tests/Samples/Private/user_error_cut_off.json +1 -0
- package/Tests/Samples/Switch.json +1 -0
- package/Tests/Samples/Switch_States.json +1 -0
- package/Tests/Samples/TwitterHeart.json +1 -0
- package/Tests/Samples/TwitterHeartButton.json +1 -0
- package/Tests/Samples/TypeFace/A.json +1 -0
- package/Tests/Samples/TypeFace/Apostrophe.json +1 -0
- package/Tests/Samples/TypeFace/B.json +1 -0
- package/Tests/Samples/TypeFace/BlinkingCursor.json +1 -0
- package/Tests/Samples/TypeFace/C.json +1 -0
- package/Tests/Samples/TypeFace/Colon.json +1 -0
- package/Tests/Samples/TypeFace/Comma.json +1 -0
- package/Tests/Samples/TypeFace/D.json +1 -0
- package/Tests/Samples/TypeFace/E.json +1 -0
- package/Tests/Samples/TypeFace/F.json +1 -0
- package/Tests/Samples/TypeFace/G.json +1 -0
- package/Tests/Samples/TypeFace/H.json +1 -0
- package/Tests/Samples/TypeFace/I.json +1 -0
- package/Tests/Samples/TypeFace/J.json +1 -0
- package/Tests/Samples/TypeFace/K.json +1 -0
- package/Tests/Samples/TypeFace/L.json +1 -0
- package/Tests/Samples/TypeFace/M.json +1 -0
- package/Tests/Samples/TypeFace/N.json +1 -0
- package/Tests/Samples/TypeFace/O.json +1 -0
- package/Tests/Samples/TypeFace/P.json +1 -0
- package/Tests/Samples/TypeFace/Q.json +1 -0
- package/Tests/Samples/TypeFace/R.json +1 -0
- package/Tests/Samples/TypeFace/S.json +1 -0
- package/Tests/Samples/TypeFace/T.json +1 -0
- package/Tests/Samples/TypeFace/U.json +1 -0
- package/Tests/Samples/TypeFace/V.json +1 -0
- package/Tests/Samples/TypeFace/W.json +1 -0
- package/Tests/Samples/TypeFace/X.json +1 -0
- package/Tests/Samples/TypeFace/Y.json +1 -0
- package/Tests/Samples/TypeFace/Z.json +1 -0
- package/Tests/Samples/Watermelon.json +1 -0
- package/Tests/Samples/setValueTest.json +1 -0
- package/Tests/Samples/timeremap.json +1 -0
- package/Tests/Samples/vcTransition1.json +1 -0
- package/Tests/Samples/vcTransition2.json +1 -0
- package/Tests/SnapshotConfiguration.swift +153 -0
- package/Tests/SnapshotTests.swift +265 -0
- package/Tests/Utils/Bundle+Module.swift +30 -0
- package/Tests/Utils/HardcodedFontProvider.swift +19 -0
- package/Tests/Utils/HardcodedImageProvider.swift +23 -0
- package/Tests/Utils/Snapshotting+presentationLayer.swift +47 -0
- package/Tests/ValueProvidersTests.swift +27 -0
- package/lottie-ios.podspec +12 -12
- package/package.json +1 -1
- package/script/lint/airbnb.swiftformat +68 -0
- package/script/lint/swiftlint.yml +38 -0
- package/script/test-carthage/Cartfile +1 -0
- package/script/test-carthage/Cartfile.resolved +1 -0
- package/script/test-carthage/Carthage/Build/.lottie-ios.version +19 -0
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/Info.plist +46 -0
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/BCSymbolMaps/BF971162-BE99-3507-B5B3-11947DC6B176.bcsymbolmap +14778 -0
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/Lottie.framework/Headers/Lottie-Swift.h +673 -0
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/Lottie.framework/Info.plist +0 -0
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/Lottie.framework/Lottie +0 -0
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/Lottie.framework/Modules/Lottie.swiftmodule/arm64-apple-ios.swiftdoc +0 -0
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/Lottie.framework/Modules/Lottie.swiftmodule/arm64-apple-ios.swiftmodule +0 -0
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/Lottie.framework/Modules/Lottie.swiftmodule/arm64.swiftdoc +0 -0
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/Lottie.framework/Modules/Lottie.swiftmodule/arm64.swiftmodule +0 -0
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/Lottie.framework/Modules/module.modulemap +4 -0
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/dSYMs/Lottie.framework.dSYM/Contents/Info.plist +20 -0
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/dSYMs/Lottie.framework.dSYM/Contents/Resources/DWARF/Lottie +0 -0
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Headers/Lottie-Swift.h +1352 -0
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Info.plist +0 -0
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Lottie +0 -0
- 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
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/Lottie.swiftmodule/Project/arm64.swiftsourceinfo +0 -0
- 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
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/Lottie.swiftmodule/Project/x86_64.swiftsourceinfo +0 -0
- 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
- 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
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/Lottie.swiftmodule/arm64.swiftdoc +0 -0
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/Lottie.swiftmodule/arm64.swiftmodule +0 -0
- 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
- 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
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/Lottie.swiftmodule/x86_64.swiftdoc +0 -0
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/Lottie.swiftmodule/x86_64.swiftmodule +0 -0
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/module.modulemap +4 -0
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/_CodeSignature/CodeResources +256 -0
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/dSYMs/Lottie.framework.dSYM/Contents/Info.plist +20 -0
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/dSYMs/Lottie.framework.dSYM/Contents/Resources/DWARF/Lottie +0 -0
- package/script/test-carthage/Carthage/Checkouts/lottie-ios/Lottie.xcodeproj/project.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- package/script/test-carthage/Carthage/Checkouts/lottie-ios/Lottie.xcodeproj/xcuserdata/cal.xcuserdatad/xcschemes/xcschememanagement.plist +37 -0
- package/script/test-carthage/Carthage/Checkouts/lottie-ios/Lottie.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- package/script/test-carthage/CarthageTest/AppDelegate.swift +27 -0
- package/script/test-carthage/CarthageTest/Assets.xcassets/AccentColor.colorset/Contents.json +11 -0
- package/script/test-carthage/CarthageTest/Assets.xcassets/AppIcon.appiconset/Contents.json +98 -0
- package/script/test-carthage/CarthageTest/Assets.xcassets/Contents.json +6 -0
- package/script/test-carthage/CarthageTest/Base.lproj/LaunchScreen.storyboard +25 -0
- package/script/test-carthage/CarthageTest/Base.lproj/Main.storyboard +24 -0
- package/script/test-carthage/CarthageTest/Info.plist +66 -0
- package/script/test-carthage/CarthageTest/SceneDelegate.swift +10 -0
- package/script/test-carthage/CarthageTest/ViewController.swift +15 -0
- package/script/test-carthage/CarthageTest.xcodeproj/project.pbxproj +378 -0
- package/script/test-carthage/CarthageTest.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
- package/script/test-carthage/CarthageTest.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
- package/script/test-carthage/CarthageTest.xcodeproj/project.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- package/script/test-carthage/CarthageTest.xcodeproj/xcuserdata/cal.xcuserdatad/xcschemes/xcschememanagement.plist +14 -0
- package/script/test-carthage/Mintfile +1 -0
- package/script/test-spm/LottieSPM.xcworkspace/contents.xcworkspacedata +7 -0
- package/script/test-spm/LottieSPM.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- package/script/test-spm/Mintfile +1 -0
- package/.swiftpm/xcode/package.xcworkspace/xcuserdata/brandonwithrow.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- package/Lottie/Info.plist +0 -22
- package/Lottie.xcodeproj/project.xcworkspace/xcuserdata/brandonwithrow.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- package/Lottie.xcodeproj/xcuserdata/brandonwithrow.xcuserdatad/xcschemes/LottieLibraryMacOS.xcscheme +0 -80
- package/Lottie.xcodeproj/xcuserdata/brandonwithrow.xcuserdatad/xcschemes/xcschememanagement.plist +0 -57
- package/lottie-swift/Assets/.gitkeep +0 -0
- package/lottie-swift/src/Private/LayerContainers/Utility/LayerFontProvider.swift +0 -37
- package/lottie-swift/src/Private/LayerContainers/Utility/LayerTextProvider.swift +0 -36
- package/lottie-swift/src/Private/Model/Animation.swift +0 -107
- package/lottie-swift/src/Private/Model/Assets/Asset.swift +0 -27
- package/lottie-swift/src/Private/Model/Assets/ImageAsset.swift +0 -48
- package/lottie-swift/src/Private/Model/Keyframes/Keyframe.swift +0 -128
- package/lottie-swift/src/Private/Model/Keyframes/KeyframeGroup.swift +0 -108
- package/lottie-swift/src/Private/Model/Layers/LayerModel.swift +0 -150
- package/lottie-swift/src/Private/Model/Objects/DashPattern.swift +0 -24
- package/lottie-swift/src/Private/Model/Objects/Marker.swift +0 -23
- package/lottie-swift/src/Private/Model/Objects/Mask.swift +0 -48
- package/lottie-swift/src/Private/Model/Objects/Transform.swift +0 -105
- package/lottie-swift/src/Private/Model/ShapeItems/Ellipse.swift +0 -50
- package/lottie-swift/src/Private/Model/ShapeItems/FillI.swift +0 -49
- package/lottie-swift/src/Private/Model/ShapeItems/GradientFill.swift +0 -86
- package/lottie-swift/src/Private/Model/ShapeItems/GradientStroke.swift +0 -125
- package/lottie-swift/src/Private/Model/ShapeItems/Rectangle.swift +0 -50
- package/lottie-swift/src/Private/Model/ShapeItems/Repeater.swift +0 -80
- package/lottie-swift/src/Private/Model/ShapeItems/Shape.swift +0 -37
- package/lottie-swift/src/Private/Model/ShapeItems/ShapeItem.swift +0 -95
- package/lottie-swift/src/Private/Model/ShapeItems/ShapeTransform.swift +0 -68
- package/lottie-swift/src/Private/Model/ShapeItems/Star.swift +0 -86
- package/lottie-swift/src/Private/Model/ShapeItems/Stroke.swift +0 -67
- package/lottie-swift/src/Private/Model/ShapeItems/Trim.swift +0 -53
- package/lottie-swift/src/Private/Model/Text/Font.swift +0 -35
- package/lottie-swift/src/Private/Model/Text/TextAnimator.swift +0 -99
- package/lottie-swift/src/Private/Model/Text/TextDocument.swift +0 -70
- package/lottie-swift/src/Private/NodeRenderSystem/Nodes/PathNodes/EllipseNode.swift +0 -109
- package/lottie-swift/src/Private/NodeRenderSystem/Nodes/PathNodes/PolygonNode.swift +0 -132
- package/lottie-swift/src/Private/NodeRenderSystem/Nodes/RenderContainers/GroupNode.swift +0 -141
- package/lottie-swift/src/Private/Utility/Extensions/MathKit.swift +0 -539
- package/lottie-swift/src/Private/Utility/Extensions/StringExtensions.swift +0 -32
- package/lottie-swift/src/Private/Utility/Interpolatable/Interpolatable.swift +0 -18
- package/lottie-swift/src/Private/Utility/Interpolatable/InterpolatableExtensions.swift +0 -170
- package/lottie-swift/src/Private/Utility/Primitives/CurveVertex.swift +0 -177
- package/lottie-swift/src/Private/Utility/Primitives/PathElement.swift +0 -68
- package/lottie-swift/src/Private/Utility/Primitives/VectorsExtensions.swift +0 -218
- package/lottie-swift/src/Public/Animation/AnimationPublic.swift +0 -196
- package/lottie-swift/src/Public/Animation/AnimationView.swift +0 -1007
- package/lottie-swift/src/Public/Animation/AnimationViewInitializers.swift +0 -83
- package/lottie-swift/src/Public/AnimationCache/AnimationCacheProvider.swift +0 -24
- package/lottie-swift/src/Public/DynamicProperties/AnimationKeypath.swift +0 -46
- package/lottie-swift/src/Public/DynamicProperties/AnyValueProvider.swift +0 -29
- package/lottie-swift/src/Public/DynamicProperties/ValueProviders/GradientValueProvider.swift +0 -114
- package/lottie-swift/src/Public/ImageProvider/AnimationImageProvider.swift +0 -23
- package/lottie-swift/src/Public/MacOS/FilepathImageProvider.swift +0 -67
- package/lottie-swift/src/Public/TextProvider/AnimationTextProvider.swift +0 -39
- package/lottie-swift/src/Public/iOS/LottieView.swift +0 -62
- 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
|
+
}
|