lottie-ios 3.2.2 → 3.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/actions/setup/action.yml +32 -0
- package/.github/issue_template.md +6 -23
- package/.github/workflows/main.yml +98 -0
- package/.spi.yml +6 -0
- package/.swift-version +1 -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 +2003 -1972
- package/Lottie.xcodeproj/project.xcworkspace/contents.xcworkspacedata +1 -1
- 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 +115 -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/Lottie.xcworkspace/xcuserdata/calstephens.xcuserdatad/xcschemes/xcschememanagement.plist +30 -0
- package/Package.resolved +88 -0
- package/Package.swift +10 -15
- package/README.md +40 -60
- package/Rakefile +121 -0
- package/Sources/Private/CoreAnimation/Animations/CAAnimation+TimingConfiguration.swift +81 -0
- package/Sources/Private/CoreAnimation/Animations/CALayer+addAnimation.swift +448 -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 +210 -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 +73 -0
- package/Sources/Private/CoreAnimation/Layers/AnimationLayer.swift +83 -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 +94 -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 +302 -0
- package/Sources/Private/CoreAnimation/Layers/ShapeLayer.swift +319 -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 +93 -85
- 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 +75 -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 +61 -44
- 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 +42 -36
- package/{lottie-swift/src/Private/LayerContainers/AnimationContainer.swift → Sources/Private/MainThread/LayerContainers/MainThreadAnimationLayer.swift} +200 -140
- 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} +120 -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 +82 -67
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Extensions/ItemsExtension.swift +4 -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 +6 -6
- 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 +125 -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 +110 -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 +30 -24
- package/{lottie-swift/src/Private/NodeRenderSystem/Nodes/OutputNodes/Renderables/GradientFillRenderer.swift → Sources/Private/MainThread/NodeRenderSystem/Nodes/OutputNodes/Renderables/LegacyGradientFillRenderer.swift} +93 -66
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/OutputNodes/Renderables/StrokeRenderer.swift +23 -19
- 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 +95 -58
- 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 +108 -69
- 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 +80 -79
- 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 +27 -24
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/RenderLayers/ShapeRenderLayer.swift +34 -25
- 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/Sources/Private/Model/ShapeItems/Group.swift +48 -0
- 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 +164 -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 -48
- 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 +450 -0
- package/Sources/Private/Utility/Extensions/StringExtensions.swift +38 -0
- package/{lottie-swift/src → Sources}/Private/Utility/Helpers/AnimationContext.swift +42 -16
- package/Sources/Private/Utility/Interpolatable/InterpolatableExtensions.swift +134 -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 -143
- 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 +184 -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 +266 -0
- package/Sources/Public/Animation/AnimationView.swift +1335 -0
- package/Sources/Public/Animation/AnimationViewInitializers.swift +109 -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 +123 -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 +137 -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 +42 -26
- package/{lottie-swift/src → Sources}/Public/iOS/AnimatedControl.swift +100 -91
- package/{lottie-swift/src → Sources}/Public/iOS/AnimatedSwitch.swift +128 -94
- package/{lottie-swift/src → Sources}/Public/iOS/AnimationSubview.swift +3 -3
- package/Sources/Public/iOS/AnimationViewBase.swift +78 -0
- package/{lottie-swift/src → Sources}/Public/iOS/BundleImageProvider.swift +36 -34
- package/{lottie-swift/src → Sources}/Public/iOS/Compatibility/CompatibleAnimationKeypath.swift +4 -0
- package/{lottie-swift/src → Sources}/Public/iOS/Compatibility/CompatibleAnimationView.swift +38 -29
- package/{lottie-swift/src → Sources}/Public/iOS/FilepathImageProvider.swift +24 -21
- package/{lottie-swift/src → Sources}/Public/iOS/UIColorExtension.swift +4 -4
- 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} +31 -32
- package/Sources/Public/macOS/FilepathImageProvider.macOS.swift +67 -0
- package/Tests/AnimationKeypathTests.swift +94 -0
- package/Tests/AutomaticEngineTests.swift +57 -0
- package/Tests/BundleTests.swift +25 -0
- package/Tests/DataURLTests.swift +64 -0
- package/Tests/ParsingTests.swift +43 -0
- package/Tests/PerformanceTests.swift +215 -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 +11 -12
- package/package.json +1 -1
- package/script/test-carthage/Cartfile +1 -0
- package/script/test-carthage/Cartfile.resolved +1 -0
- package/script/test-carthage/CarthageTest/AppDelegate.swift +26 -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-macOS/AppDelegate.swift +7 -0
- package/script/test-carthage/CarthageTest-macOS/Assets.xcassets/AccentColor.colorset/Contents.json +11 -0
- package/script/test-carthage/CarthageTest-macOS/Assets.xcassets/AppIcon.appiconset/Contents.json +58 -0
- package/script/test-carthage/CarthageTest-macOS/Assets.xcassets/Contents.json +6 -0
- package/script/test-carthage/CarthageTest-macOS/Base.lproj/Main.storyboard +717 -0
- package/script/test-carthage/CarthageTest-macOS/CarthageTest_macOS.entitlements +10 -0
- package/script/test-carthage/CarthageTest-macOS/ViewController.swift +15 -0
- package/script/test-carthage/CarthageTest.xcodeproj/project.pbxproj +532 -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/project.xcworkspace/xcuserdata/calstephens.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- package/script/test-carthage/CarthageTest.xcodeproj/xcuserdata/cal.xcuserdatad/xcschemes/xcschememanagement.plist +14 -0
- package/script/test-carthage/CarthageTest.xcodeproj/xcuserdata/calstephens.xcuserdatad/xcschemes/xcschememanagement.plist +19 -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/Group.swift +0 -32
- 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 -1006
- 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,123 @@
|
|
|
1
|
+
//
|
|
2
|
+
// GradientValueProvider.swift
|
|
3
|
+
// lottie-swift
|
|
4
|
+
//
|
|
5
|
+
// Created by Enrique Bermúdez on 10/27/19.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
import CoreGraphics
|
|
9
|
+
import Foundation
|
|
10
|
+
|
|
11
|
+
/// A `ValueProvider` that returns a Gradient Color Value.
|
|
12
|
+
public final class GradientValueProvider: ValueProvider {
|
|
13
|
+
|
|
14
|
+
// MARK: Lifecycle
|
|
15
|
+
|
|
16
|
+
/// Initializes with a block provider.
|
|
17
|
+
public init(
|
|
18
|
+
block: @escaping ColorsValueBlock,
|
|
19
|
+
locations: ColorLocationsBlock? = nil)
|
|
20
|
+
{
|
|
21
|
+
self.block = block
|
|
22
|
+
locationsBlock = locations
|
|
23
|
+
colors = []
|
|
24
|
+
self.locations = []
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/// Initializes with an array of colors.
|
|
28
|
+
public init(
|
|
29
|
+
_ colors: [Color],
|
|
30
|
+
locations: [Double] = [])
|
|
31
|
+
{
|
|
32
|
+
self.colors = colors
|
|
33
|
+
self.locations = locations
|
|
34
|
+
updateValueArray()
|
|
35
|
+
hasUpdate = true
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// MARK: Public
|
|
39
|
+
|
|
40
|
+
/// Returns a [Color] for a CGFloat(Frame Time).
|
|
41
|
+
public typealias ColorsValueBlock = (CGFloat) -> [Color]
|
|
42
|
+
/// Returns a [Double](Color locations) for a CGFloat(Frame Time).
|
|
43
|
+
public typealias ColorLocationsBlock = (CGFloat) -> [Double]
|
|
44
|
+
|
|
45
|
+
/// The colors values of the provider.
|
|
46
|
+
public var colors: [Color] {
|
|
47
|
+
didSet {
|
|
48
|
+
updateValueArray()
|
|
49
|
+
hasUpdate = true
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/// The color location values of the provider.
|
|
54
|
+
public var locations: [Double] {
|
|
55
|
+
didSet {
|
|
56
|
+
updateValueArray()
|
|
57
|
+
hasUpdate = true
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// MARK: ValueProvider Protocol
|
|
62
|
+
|
|
63
|
+
public var valueType: Any.Type {
|
|
64
|
+
[Double].self
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
public var storage: ValueProviderStorage<[Double]> {
|
|
68
|
+
.closure { [self] frame in
|
|
69
|
+
hasUpdate = false
|
|
70
|
+
|
|
71
|
+
if let block = block {
|
|
72
|
+
let newColors = block(frame)
|
|
73
|
+
let newLocations = locationsBlock?(frame) ?? []
|
|
74
|
+
value = value(from: newColors, locations: newLocations)
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
return value
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
public func hasUpdate(frame _: CGFloat) -> Bool {
|
|
82
|
+
if block != nil || locationsBlock != nil {
|
|
83
|
+
return true
|
|
84
|
+
}
|
|
85
|
+
return hasUpdate
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// MARK: Private
|
|
89
|
+
|
|
90
|
+
private var hasUpdate = true
|
|
91
|
+
|
|
92
|
+
private var block: ColorsValueBlock?
|
|
93
|
+
private var locationsBlock: ColorLocationsBlock?
|
|
94
|
+
private var value: [Double] = []
|
|
95
|
+
|
|
96
|
+
private func value(from colors: [Color], locations: [Double]) -> [Double] {
|
|
97
|
+
var colorValues = [Double]()
|
|
98
|
+
var alphaValues = [Double]()
|
|
99
|
+
var shouldAddAlphaValues = false
|
|
100
|
+
|
|
101
|
+
for i in 0..<colors.count {
|
|
102
|
+
if colors[i].a < 1 { shouldAddAlphaValues = true }
|
|
103
|
+
|
|
104
|
+
let location = locations.count > i
|
|
105
|
+
? locations[i]
|
|
106
|
+
: (Double(i) / Double(colors.count - 1))
|
|
107
|
+
|
|
108
|
+
colorValues.append(location)
|
|
109
|
+
colorValues.append(colors[i].r)
|
|
110
|
+
colorValues.append(colors[i].g)
|
|
111
|
+
colorValues.append(colors[i].b)
|
|
112
|
+
|
|
113
|
+
alphaValues.append(location)
|
|
114
|
+
alphaValues.append(colors[i].a)
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
return colorValues + (shouldAddAlphaValues ? alphaValues : [])
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
private func updateValueArray() {
|
|
121
|
+
value = value(from: colors, locations: locations)
|
|
122
|
+
}
|
|
123
|
+
}
|
|
@@ -5,60 +5,65 @@
|
|
|
5
5
|
// Created by Brandon Withrow on 2/4/19.
|
|
6
6
|
//
|
|
7
7
|
|
|
8
|
-
import Foundation
|
|
9
8
|
import CoreGraphics
|
|
9
|
+
import Foundation
|
|
10
10
|
/// A `ValueProvider` that returns a CGPoint Value
|
|
11
|
-
public final class PointValueProvider:
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
public var point: CGPoint {
|
|
17
|
-
didSet {
|
|
18
|
-
hasUpdate = true
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
|
|
11
|
+
public final class PointValueProvider: ValueProvider {
|
|
12
|
+
|
|
13
|
+
// MARK: Lifecycle
|
|
14
|
+
|
|
22
15
|
/// Initializes with a block provider
|
|
23
16
|
public init(block: @escaping PointValueBlock) {
|
|
24
17
|
self.block = block
|
|
25
|
-
|
|
18
|
+
point = .zero
|
|
26
19
|
}
|
|
27
|
-
|
|
20
|
+
|
|
28
21
|
/// Initializes with a single point.
|
|
29
22
|
public init(_ point: CGPoint) {
|
|
30
23
|
self.point = point
|
|
31
|
-
|
|
24
|
+
block = nil
|
|
32
25
|
hasUpdate = true
|
|
33
26
|
}
|
|
34
|
-
|
|
27
|
+
|
|
28
|
+
// MARK: Public
|
|
29
|
+
|
|
30
|
+
/// Returns a CGPoint for a CGFloat(Frame Time)
|
|
31
|
+
public typealias PointValueBlock = (CGFloat) -> CGPoint
|
|
32
|
+
|
|
33
|
+
public var point: CGPoint {
|
|
34
|
+
didSet {
|
|
35
|
+
hasUpdate = true
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
35
39
|
// MARK: ValueProvider Protocol
|
|
36
|
-
|
|
40
|
+
|
|
37
41
|
public var valueType: Any.Type {
|
|
38
|
-
|
|
42
|
+
Vector3D.self
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
public var storage: ValueProviderStorage<Vector3D> {
|
|
46
|
+
if let block = block {
|
|
47
|
+
return .closure { frame in
|
|
48
|
+
self.hasUpdate = false
|
|
49
|
+
return block(frame).vector3dValue
|
|
50
|
+
}
|
|
51
|
+
} else {
|
|
52
|
+
hasUpdate = false
|
|
53
|
+
return .singleValue(point.vector3dValue)
|
|
54
|
+
}
|
|
39
55
|
}
|
|
40
|
-
|
|
41
|
-
public func hasUpdate(frame: CGFloat) -> Bool {
|
|
56
|
+
|
|
57
|
+
public func hasUpdate(frame _: CGFloat) -> Bool {
|
|
42
58
|
if block != nil {
|
|
43
59
|
return true
|
|
44
60
|
}
|
|
45
61
|
return hasUpdate
|
|
46
62
|
}
|
|
47
|
-
|
|
48
|
-
public func value(frame: CGFloat) -> Any {
|
|
49
|
-
hasUpdate = false
|
|
50
|
-
let newPoint: CGPoint
|
|
51
|
-
if let block = block {
|
|
52
|
-
newPoint = block(frame)
|
|
53
|
-
} else {
|
|
54
|
-
newPoint = point
|
|
55
|
-
}
|
|
56
|
-
return newPoint.vector3dValue
|
|
57
|
-
}
|
|
58
|
-
|
|
63
|
+
|
|
59
64
|
// MARK: Private
|
|
60
|
-
|
|
61
|
-
private var hasUpdate
|
|
62
|
-
|
|
65
|
+
|
|
66
|
+
private var hasUpdate = true
|
|
67
|
+
|
|
63
68
|
private var block: PointValueBlock?
|
|
64
69
|
}
|
package/{lottie-swift/src → Sources}/Public/DynamicProperties/ValueProviders/SizeValueProvider.swift
RENAMED
|
@@ -5,61 +5,66 @@
|
|
|
5
5
|
// Created by Brandon Withrow on 2/4/19.
|
|
6
6
|
//
|
|
7
7
|
|
|
8
|
-
import Foundation
|
|
9
8
|
import CoreGraphics
|
|
9
|
+
import Foundation
|
|
10
10
|
|
|
11
11
|
/// A `ValueProvider` that returns a CGSize Value
|
|
12
|
-
public final class SizeValueProvider:
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
public var size: CGSize {
|
|
18
|
-
didSet {
|
|
19
|
-
hasUpdate = true
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
|
|
12
|
+
public final class SizeValueProvider: ValueProvider {
|
|
13
|
+
|
|
14
|
+
// MARK: Lifecycle
|
|
15
|
+
|
|
23
16
|
/// Initializes with a block provider
|
|
24
17
|
public init(block: @escaping SizeValueBlock) {
|
|
25
18
|
self.block = block
|
|
26
|
-
|
|
19
|
+
size = .zero
|
|
27
20
|
}
|
|
28
|
-
|
|
21
|
+
|
|
29
22
|
/// Initializes with a single size.
|
|
30
23
|
public init(_ size: CGSize) {
|
|
31
24
|
self.size = size
|
|
32
|
-
|
|
25
|
+
block = nil
|
|
33
26
|
hasUpdate = true
|
|
34
27
|
}
|
|
35
|
-
|
|
28
|
+
|
|
29
|
+
// MARK: Public
|
|
30
|
+
|
|
31
|
+
/// Returns a CGSize for a CGFloat(Frame Time)
|
|
32
|
+
public typealias SizeValueBlock = (CGFloat) -> CGSize
|
|
33
|
+
|
|
34
|
+
public var size: CGSize {
|
|
35
|
+
didSet {
|
|
36
|
+
hasUpdate = true
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
36
40
|
// MARK: ValueProvider Protocol
|
|
37
|
-
|
|
41
|
+
|
|
38
42
|
public var valueType: Any.Type {
|
|
39
|
-
|
|
43
|
+
Vector3D.self
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
public var storage: ValueProviderStorage<Vector3D> {
|
|
47
|
+
if let block = block {
|
|
48
|
+
return .closure { frame in
|
|
49
|
+
self.hasUpdate = false
|
|
50
|
+
return block(frame).vector3dValue
|
|
51
|
+
}
|
|
52
|
+
} else {
|
|
53
|
+
hasUpdate = false
|
|
54
|
+
return .singleValue(size.vector3dValue)
|
|
55
|
+
}
|
|
40
56
|
}
|
|
41
|
-
|
|
42
|
-
public func hasUpdate(frame: CGFloat) -> Bool {
|
|
57
|
+
|
|
58
|
+
public func hasUpdate(frame _: CGFloat) -> Bool {
|
|
43
59
|
if block != nil {
|
|
44
60
|
return true
|
|
45
61
|
}
|
|
46
62
|
return hasUpdate
|
|
47
63
|
}
|
|
48
|
-
|
|
49
|
-
public func value(frame: CGFloat) -> Any {
|
|
50
|
-
hasUpdate = false
|
|
51
|
-
let newSize: CGSize
|
|
52
|
-
if let block = block {
|
|
53
|
-
newSize = block(frame)
|
|
54
|
-
} else {
|
|
55
|
-
newSize = size
|
|
56
|
-
}
|
|
57
|
-
return newSize.vector3dValue
|
|
58
|
-
}
|
|
59
|
-
|
|
64
|
+
|
|
60
65
|
// MARK: Private
|
|
61
|
-
|
|
62
|
-
private var hasUpdate
|
|
63
|
-
|
|
66
|
+
|
|
67
|
+
private var hasUpdate = true
|
|
68
|
+
|
|
64
69
|
private var block: SizeValueBlock?
|
|
65
70
|
}
|
|
@@ -6,23 +6,30 @@
|
|
|
6
6
|
// Copyright © 2020 YurtvilleProds. All rights reserved.
|
|
7
7
|
//
|
|
8
8
|
|
|
9
|
-
import Foundation
|
|
10
9
|
import CoreGraphics
|
|
11
10
|
import CoreText
|
|
11
|
+
import Foundation
|
|
12
12
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
13
|
+
// MARK: - AnimationFontProvider
|
|
14
|
+
|
|
15
|
+
/// Font provider is a protocol that is used to supply fonts to `AnimationView`.
|
|
16
|
+
///
|
|
17
17
|
public protocol AnimationFontProvider {
|
|
18
18
|
func fontFor(family: String, size: CGFloat) -> CTFont?
|
|
19
19
|
}
|
|
20
20
|
|
|
21
|
+
// MARK: - DefaultFontProvider
|
|
22
|
+
|
|
21
23
|
/// Default Font provider.
|
|
22
24
|
public final class DefaultFontProvider: AnimationFontProvider {
|
|
25
|
+
|
|
26
|
+
// MARK: Lifecycle
|
|
27
|
+
|
|
28
|
+
public init() { }
|
|
29
|
+
|
|
30
|
+
// MARK: Public
|
|
31
|
+
|
|
23
32
|
public func fontFor(family: String, size: CGFloat) -> CTFont? {
|
|
24
|
-
|
|
33
|
+
CTFontCreateWithName(family as CFString, size, nil)
|
|
25
34
|
}
|
|
26
|
-
|
|
27
|
-
public init() {}
|
|
28
35
|
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
//
|
|
2
|
+
// LottieImageProvider.swift
|
|
3
|
+
// lottie-swift
|
|
4
|
+
//
|
|
5
|
+
// Created by Brandon Withrow on 1/25/19.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
import CoreGraphics
|
|
9
|
+
import Foundation
|
|
10
|
+
|
|
11
|
+
/// Image provider is a protocol that is used to supply images to `AnimationView`.
|
|
12
|
+
///
|
|
13
|
+
/// Some animations require a reference to an image. The image provider loads and
|
|
14
|
+
/// provides those images to the `AnimationView`. Lottie includes a couple of
|
|
15
|
+
/// prebuilt Image Providers that supply images from a Bundle, or from a FilePath.
|
|
16
|
+
///
|
|
17
|
+
/// Additionally custom Image Providers can be made to load images from a URL,
|
|
18
|
+
/// or to Cache images.
|
|
19
|
+
public protocol AnimationImageProvider {
|
|
20
|
+
func imageForAsset(asset: ImageAsset) -> CGImage?
|
|
21
|
+
}
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
// Created by Cal Stephens on 1/24/22.
|
|
2
|
+
// Copyright © 2022 Airbnb Inc. All rights reserved.
|
|
3
|
+
|
|
4
|
+
import CoreGraphics
|
|
5
|
+
|
|
6
|
+
// MARK: - Interpolatable
|
|
7
|
+
|
|
8
|
+
/// A type that can be interpolated between two values
|
|
9
|
+
public protocol Interpolatable: AnyInterpolatable {
|
|
10
|
+
/// Interpolates the `self` to the given number by `amount`.
|
|
11
|
+
/// - Parameter to: The number to interpolate to.
|
|
12
|
+
/// - Parameter amount: The amount to interpolate,
|
|
13
|
+
/// relative to 0.0 (self) and 1.0 (to).
|
|
14
|
+
/// `amount` can be greater than one and less than zero,
|
|
15
|
+
/// and interpolation should not be clamped.
|
|
16
|
+
///
|
|
17
|
+
/// ```
|
|
18
|
+
/// let number = 5
|
|
19
|
+
/// let interpolated = number.interpolateTo(10, amount: 0.5)
|
|
20
|
+
/// print(interpolated) // 7.5
|
|
21
|
+
/// ```
|
|
22
|
+
///
|
|
23
|
+
/// ```
|
|
24
|
+
/// let number = 5
|
|
25
|
+
/// let interpolated = number.interpolateTo(10, amount: 1.5)
|
|
26
|
+
/// print(interpolated) // 12.5
|
|
27
|
+
/// ```
|
|
28
|
+
func interpolate(to: Self, amount: CGFloat) -> Self
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// MARK: - SpatialInterpolatable
|
|
32
|
+
|
|
33
|
+
/// A type that can be interpolated between two values,
|
|
34
|
+
/// additionally using optional `spatialOutTangent` and `spatialInTangent` values.
|
|
35
|
+
/// - If your implementation doesn't use the `spatialOutTangent` and `spatialInTangent`
|
|
36
|
+
/// parameters, prefer implementing the simpler `Interpolatable` protocol.
|
|
37
|
+
public protocol SpatialInterpolatable: AnyInterpolatable {
|
|
38
|
+
/// Interpolates the `self` to the given number by `amount`.
|
|
39
|
+
/// - Parameter to: The number to interpolate to.
|
|
40
|
+
/// - Parameter amount: The amount to interpolate,
|
|
41
|
+
/// relative to 0.0 (self) and 1.0 (to).
|
|
42
|
+
/// `amount` can be greater than one and less than zero,
|
|
43
|
+
/// and interpolation should not be clamped.
|
|
44
|
+
func interpolate(
|
|
45
|
+
to: Self,
|
|
46
|
+
amount: CGFloat,
|
|
47
|
+
spatialOutTangent: CGPoint?,
|
|
48
|
+
spatialInTangent: CGPoint?)
|
|
49
|
+
-> Self
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// MARK: - AnyInterpolatable
|
|
53
|
+
|
|
54
|
+
/// The base protocol that is implemented by both `Interpolatable` and `SpatialInterpolatable`
|
|
55
|
+
/// Types should not directly implement this protocol.
|
|
56
|
+
public protocol AnyInterpolatable {
|
|
57
|
+
/// Interpolates by calling either `Interpolatable.interpolate`
|
|
58
|
+
/// or `SpatialInterpolatable.interpolate`.
|
|
59
|
+
/// Should not be implemented or called by consumers.
|
|
60
|
+
func _interpolate(
|
|
61
|
+
to: Self,
|
|
62
|
+
amount: CGFloat,
|
|
63
|
+
spatialOutTangent: CGPoint?,
|
|
64
|
+
spatialInTangent: CGPoint?)
|
|
65
|
+
-> Self
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
extension Interpolatable {
|
|
69
|
+
public func _interpolate(
|
|
70
|
+
to: Self,
|
|
71
|
+
amount: CGFloat,
|
|
72
|
+
spatialOutTangent _: CGPoint?,
|
|
73
|
+
spatialInTangent _: CGPoint?)
|
|
74
|
+
-> Self
|
|
75
|
+
{
|
|
76
|
+
interpolate(to: to, amount: amount)
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
extension SpatialInterpolatable {
|
|
81
|
+
/// Helper that interpolates this `SpatialInterpolatable`
|
|
82
|
+
/// with `nil` spatial in/out tangents
|
|
83
|
+
public func interpolate(to: Self, amount: CGFloat) -> Self {
|
|
84
|
+
interpolate(
|
|
85
|
+
to: to,
|
|
86
|
+
amount: amount,
|
|
87
|
+
spatialOutTangent: nil,
|
|
88
|
+
spatialInTangent: nil)
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
public func _interpolate(
|
|
92
|
+
to: Self,
|
|
93
|
+
amount: CGFloat,
|
|
94
|
+
spatialOutTangent: CGPoint?,
|
|
95
|
+
spatialInTangent: CGPoint?)
|
|
96
|
+
-> Self
|
|
97
|
+
{
|
|
98
|
+
interpolate(
|
|
99
|
+
to: to,
|
|
100
|
+
amount: amount,
|
|
101
|
+
spatialOutTangent: spatialOutTangent,
|
|
102
|
+
spatialInTangent: spatialInTangent)
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// MARK: - Double + Interpolatable
|
|
107
|
+
|
|
108
|
+
extension Double: Interpolatable { }
|
|
109
|
+
|
|
110
|
+
// MARK: - CGFloat + Interpolatable
|
|
111
|
+
|
|
112
|
+
extension CGFloat: Interpolatable { }
|
|
113
|
+
|
|
114
|
+
// MARK: - Float + Interpolatable
|
|
115
|
+
|
|
116
|
+
extension Float: Interpolatable { }
|
|
117
|
+
|
|
118
|
+
extension Interpolatable where Self: BinaryFloatingPoint {
|
|
119
|
+
public func interpolate(to: Self, amount: CGFloat) -> Self {
|
|
120
|
+
self + ((to - self) * Self(amount))
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// MARK: - CGRect + Interpolatable
|
|
125
|
+
|
|
126
|
+
extension CGRect: Interpolatable {
|
|
127
|
+
public func interpolate(to: CGRect, amount: CGFloat) -> CGRect {
|
|
128
|
+
CGRect(
|
|
129
|
+
x: origin.x.interpolate(to: to.origin.x, amount: amount),
|
|
130
|
+
y: origin.y.interpolate(to: to.origin.y, amount: amount),
|
|
131
|
+
width: width.interpolate(to: to.width, amount: amount),
|
|
132
|
+
height: height.interpolate(to: to.height, amount: amount))
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// MARK: - CGSize + Interpolatable
|
|
137
|
+
|
|
138
|
+
extension CGSize: Interpolatable {
|
|
139
|
+
public func interpolate(to: CGSize, amount: CGFloat) -> CGSize {
|
|
140
|
+
CGSize(
|
|
141
|
+
width: width.interpolate(to: to.width, amount: amount),
|
|
142
|
+
height: height.interpolate(to: to.height, amount: amount))
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// MARK: - CGPoint + SpatialInterpolatable
|
|
147
|
+
|
|
148
|
+
extension CGPoint: SpatialInterpolatable {
|
|
149
|
+
public func interpolate(
|
|
150
|
+
to: CGPoint,
|
|
151
|
+
amount: CGFloat,
|
|
152
|
+
spatialOutTangent: CGPoint?,
|
|
153
|
+
spatialInTangent: CGPoint?)
|
|
154
|
+
-> CGPoint
|
|
155
|
+
{
|
|
156
|
+
guard
|
|
157
|
+
let outTan = spatialOutTangent,
|
|
158
|
+
let inTan = spatialInTangent
|
|
159
|
+
else {
|
|
160
|
+
return CGPoint(
|
|
161
|
+
x: x.interpolate(to: to.x, amount: amount),
|
|
162
|
+
y: y.interpolate(to: to.y, amount: amount))
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
let cp1 = self + outTan
|
|
166
|
+
let cp2 = to + inTan
|
|
167
|
+
return interpolate(to, outTangent: cp1, inTangent: cp2, amount: amount)
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
// MARK: - Color + Interpolatable
|
|
172
|
+
|
|
173
|
+
extension Color: Interpolatable {
|
|
174
|
+
public func interpolate(to: Color, amount: CGFloat) -> Color {
|
|
175
|
+
Color(
|
|
176
|
+
r: r.interpolate(to: to.r, amount: amount),
|
|
177
|
+
g: g.interpolate(to: to.g, amount: amount),
|
|
178
|
+
b: b.interpolate(to: to.b, amount: amount),
|
|
179
|
+
a: a.interpolate(to: to.a, amount: amount))
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
// MARK: - Vector1D + Interpolatable
|
|
184
|
+
|
|
185
|
+
extension Vector1D: Interpolatable {
|
|
186
|
+
public func interpolate(to: Vector1D, amount: CGFloat) -> Vector1D {
|
|
187
|
+
value.interpolate(to: to.value, amount: amount).vectorValue
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
// MARK: - Vector2D + SpatialInterpolatable
|
|
192
|
+
|
|
193
|
+
extension Vector2D: SpatialInterpolatable {
|
|
194
|
+
public func interpolate(
|
|
195
|
+
to: Vector2D,
|
|
196
|
+
amount: CGFloat,
|
|
197
|
+
spatialOutTangent: CGPoint?,
|
|
198
|
+
spatialInTangent: CGPoint?)
|
|
199
|
+
-> Vector2D
|
|
200
|
+
{
|
|
201
|
+
pointValue.interpolate(
|
|
202
|
+
to: to.pointValue,
|
|
203
|
+
amount: amount,
|
|
204
|
+
spatialOutTangent: spatialOutTangent,
|
|
205
|
+
spatialInTangent: spatialInTangent)
|
|
206
|
+
.vector2dValue
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
// MARK: - Vector3D + SpatialInterpolatable
|
|
211
|
+
|
|
212
|
+
extension Vector3D: SpatialInterpolatable {
|
|
213
|
+
public func interpolate(
|
|
214
|
+
to: Vector3D,
|
|
215
|
+
amount: CGFloat,
|
|
216
|
+
spatialOutTangent: CGPoint?,
|
|
217
|
+
spatialInTangent: CGPoint?)
|
|
218
|
+
-> Vector3D
|
|
219
|
+
{
|
|
220
|
+
if spatialInTangent != nil || spatialOutTangent != nil {
|
|
221
|
+
// TODO Support third dimension spatial interpolation
|
|
222
|
+
let point = pointValue.interpolate(
|
|
223
|
+
to: to.pointValue,
|
|
224
|
+
amount: amount,
|
|
225
|
+
spatialOutTangent: spatialOutTangent,
|
|
226
|
+
spatialInTangent: spatialInTangent)
|
|
227
|
+
|
|
228
|
+
return Vector3D(
|
|
229
|
+
x: point.x,
|
|
230
|
+
y: point.y,
|
|
231
|
+
z: CGFloat(z.interpolate(to: to.z, amount: amount)))
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
return Vector3D(
|
|
235
|
+
x: x.interpolate(to: to.x, amount: amount),
|
|
236
|
+
y: y.interpolate(to: to.y, amount: amount),
|
|
237
|
+
z: z.interpolate(to: to.z, amount: amount))
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
// MARK: - Array + Interpolatable, AnyInterpolatable
|
|
242
|
+
|
|
243
|
+
extension Array: Interpolatable, AnyInterpolatable where Element: Interpolatable {
|
|
244
|
+
public func interpolate(to: [Element], amount: CGFloat) -> [Element] {
|
|
245
|
+
LottieLogger.shared.assert(
|
|
246
|
+
count == to.count,
|
|
247
|
+
"When interpolating Arrays, both array sound have the same element count.")
|
|
248
|
+
|
|
249
|
+
return zip(self, to).map { lhs, rhs in
|
|
250
|
+
lhs.interpolate(to: rhs, amount: amount)
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
}
|