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,109 @@
|
|
|
1
|
+
//
|
|
2
|
+
// AnimationViewInitializers.swift
|
|
3
|
+
// lottie-swift-iOS
|
|
4
|
+
//
|
|
5
|
+
// Created by Brandon Withrow on 2/6/19.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
import Foundation
|
|
9
|
+
|
|
10
|
+
extension AnimationView {
|
|
11
|
+
|
|
12
|
+
// MARK: Lifecycle
|
|
13
|
+
|
|
14
|
+
/// Loads a Lottie animation from a JSON file in the supplied bundle.
|
|
15
|
+
///
|
|
16
|
+
/// - Parameter name: The string name of the lottie animation with no file
|
|
17
|
+
/// extension provided.
|
|
18
|
+
/// - Parameter bundle: The bundle in which the animation is located.
|
|
19
|
+
/// Defaults to the Main bundle.
|
|
20
|
+
/// - Parameter imageProvider: An image provider for the animation's image data.
|
|
21
|
+
/// If none is supplied Lottie will search in the supplied bundle for images.
|
|
22
|
+
public convenience init(
|
|
23
|
+
name: String,
|
|
24
|
+
bundle: Bundle = Bundle.main,
|
|
25
|
+
imageProvider: AnimationImageProvider? = nil,
|
|
26
|
+
animationCache: AnimationCacheProvider? = LRUAnimationCache.sharedCache,
|
|
27
|
+
configuration: LottieConfiguration = .shared)
|
|
28
|
+
{
|
|
29
|
+
let animation = Animation.named(name, bundle: bundle, subdirectory: nil, animationCache: animationCache)
|
|
30
|
+
let provider = imageProvider ?? BundleImageProvider(bundle: bundle, searchPath: nil)
|
|
31
|
+
self.init(animation: animation, imageProvider: provider, configuration: configuration)
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/// Loads a Lottie animation from a JSON file in a specific path on disk.
|
|
35
|
+
///
|
|
36
|
+
/// - Parameter name: The absolute path of the Lottie Animation.
|
|
37
|
+
/// - Parameter imageProvider: An image provider for the animation's image data.
|
|
38
|
+
/// If none is supplied Lottie will search in the supplied filepath for images.
|
|
39
|
+
public convenience init(
|
|
40
|
+
filePath: String,
|
|
41
|
+
imageProvider: AnimationImageProvider? = nil,
|
|
42
|
+
animationCache: AnimationCacheProvider? = LRUAnimationCache.sharedCache,
|
|
43
|
+
configuration: LottieConfiguration = .shared)
|
|
44
|
+
{
|
|
45
|
+
let animation = Animation.filepath(filePath, animationCache: animationCache)
|
|
46
|
+
let provider = imageProvider ??
|
|
47
|
+
FilepathImageProvider(filepath: URL(fileURLWithPath: filePath).deletingLastPathComponent().path)
|
|
48
|
+
self.init(animation: animation, imageProvider: provider, configuration: configuration)
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/// Loads a Lottie animation asynchronously from the URL
|
|
52
|
+
///
|
|
53
|
+
/// - Parameter url: The url to load the animation from.
|
|
54
|
+
/// - Parameter imageProvider: An image provider for the animation's image data.
|
|
55
|
+
/// If none is supplied Lottie will search in the main bundle for images.
|
|
56
|
+
/// - Parameter closure: A closure to be called when the animation has loaded.
|
|
57
|
+
public convenience init(
|
|
58
|
+
url: URL,
|
|
59
|
+
imageProvider: AnimationImageProvider? = nil,
|
|
60
|
+
closure: @escaping AnimationView.DownloadClosure,
|
|
61
|
+
animationCache: AnimationCacheProvider? = LRUAnimationCache.sharedCache,
|
|
62
|
+
configuration: LottieConfiguration = .shared)
|
|
63
|
+
{
|
|
64
|
+
if let animationCache = animationCache, let animation = animationCache.animation(forKey: url.absoluteString) {
|
|
65
|
+
self.init(animation: animation, imageProvider: imageProvider, configuration: configuration)
|
|
66
|
+
closure(nil)
|
|
67
|
+
} else {
|
|
68
|
+
self.init(animation: nil, imageProvider: imageProvider, configuration: configuration)
|
|
69
|
+
|
|
70
|
+
Animation.loadedFrom(url: url, closure: { animation in
|
|
71
|
+
if let animation = animation {
|
|
72
|
+
self.animation = animation
|
|
73
|
+
closure(nil)
|
|
74
|
+
} else {
|
|
75
|
+
closure(LottieDownloadError.downloadFailed)
|
|
76
|
+
}
|
|
77
|
+
}, animationCache: animationCache)
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/// Loads a Lottie animation from a JSON file located in the Asset catalog of the supplied bundle.
|
|
82
|
+
/// - Parameter name: The string name of the lottie animation in the asset catalog.
|
|
83
|
+
/// - Parameter bundle: The bundle in which the animation is located.
|
|
84
|
+
/// Defaults to the Main bundle.
|
|
85
|
+
/// - Parameter imageProvider: An image provider for the animation's image data.
|
|
86
|
+
/// If none is supplied Lottie will search in the supplied bundle for images.
|
|
87
|
+
public convenience init(
|
|
88
|
+
asset name: String,
|
|
89
|
+
bundle: Bundle = Bundle.main,
|
|
90
|
+
imageProvider: AnimationImageProvider? = nil,
|
|
91
|
+
animationCache: AnimationCacheProvider? = LRUAnimationCache.sharedCache,
|
|
92
|
+
configuration: LottieConfiguration = .shared)
|
|
93
|
+
{
|
|
94
|
+
let animation = Animation.asset(name, bundle: bundle, animationCache: animationCache)
|
|
95
|
+
let provider = imageProvider ?? BundleImageProvider(bundle: bundle, searchPath: nil)
|
|
96
|
+
self.init(animation: animation, imageProvider: provider, configuration: configuration)
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// MARK: Public
|
|
100
|
+
|
|
101
|
+
public typealias DownloadClosure = (Error?) -> Void
|
|
102
|
+
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// MARK: - LottieDownloadError
|
|
106
|
+
|
|
107
|
+
enum LottieDownloadError: Error {
|
|
108
|
+
case downloadFailed
|
|
109
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
//
|
|
2
|
+
// AnimationCacheProvider.swift
|
|
3
|
+
// lottie-swift
|
|
4
|
+
//
|
|
5
|
+
// Created by Brandon Withrow on 2/5/19.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
import Foundation
|
|
9
|
+
/// `AnimationCacheProvider` is a protocol that describes an Animation Cache.
|
|
10
|
+
/// Animation Cache is used when loading `Animation` models. Using an Animation Cache
|
|
11
|
+
/// can increase performance when loading an animation multiple times.
|
|
12
|
+
///
|
|
13
|
+
/// Lottie comes with a prebuilt LRU Animation Cache.
|
|
14
|
+
public protocol AnimationCacheProvider {
|
|
15
|
+
|
|
16
|
+
func animation(forKey: String) -> Animation?
|
|
17
|
+
|
|
18
|
+
func setAnimation(_ animation: Animation, forKey: String)
|
|
19
|
+
|
|
20
|
+
func clearCache()
|
|
21
|
+
|
|
22
|
+
}
|
|
@@ -7,28 +7,30 @@
|
|
|
7
7
|
|
|
8
8
|
import Foundation
|
|
9
9
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
The default size of the cache is 100.
|
|
15
|
-
*/
|
|
10
|
+
/// An Animation Cache that will store animations up to `cacheSize`.
|
|
11
|
+
///
|
|
12
|
+
/// Once `cacheSize` is reached, the least recently used animation will be ejected.
|
|
13
|
+
/// The default size of the cache is 100.
|
|
16
14
|
public class LRUAnimationCache: AnimationCacheProvider {
|
|
17
15
|
|
|
16
|
+
// MARK: Lifecycle
|
|
17
|
+
|
|
18
18
|
public init() { }
|
|
19
|
-
|
|
19
|
+
|
|
20
|
+
// MARK: Public
|
|
21
|
+
|
|
22
|
+
/// The global shared Cache.
|
|
23
|
+
public static let sharedCache = LRUAnimationCache()
|
|
24
|
+
|
|
25
|
+
/// The size of the cache.
|
|
26
|
+
public var cacheSize = 100
|
|
27
|
+
|
|
20
28
|
/// Clears the Cache.
|
|
21
29
|
public func clearCache() {
|
|
22
30
|
cacheMap.removeAll()
|
|
23
31
|
lruList.removeAll()
|
|
24
32
|
}
|
|
25
|
-
|
|
26
|
-
/// The global shared Cache.
|
|
27
|
-
public static let sharedCache = LRUAnimationCache()
|
|
28
|
-
|
|
29
|
-
/// The size of the cache.
|
|
30
|
-
public var cacheSize: Int = 100
|
|
31
|
-
|
|
33
|
+
|
|
32
34
|
public func animation(forKey: String) -> Animation? {
|
|
33
35
|
guard let animation = cacheMap[forKey] else {
|
|
34
36
|
return nil
|
|
@@ -39,7 +41,7 @@ public class LRUAnimationCache: AnimationCacheProvider {
|
|
|
39
41
|
}
|
|
40
42
|
return animation
|
|
41
43
|
}
|
|
42
|
-
|
|
44
|
+
|
|
43
45
|
public func setAnimation(_ animation: Animation, forKey: String) {
|
|
44
46
|
cacheMap[forKey] = animation
|
|
45
47
|
lruList.append(forKey)
|
|
@@ -50,8 +52,10 @@ public class LRUAnimationCache: AnimationCacheProvider {
|
|
|
50
52
|
}
|
|
51
53
|
}
|
|
52
54
|
}
|
|
53
|
-
|
|
54
|
-
|
|
55
|
+
|
|
56
|
+
// MARK: Fileprivate
|
|
57
|
+
|
|
58
|
+
fileprivate var cacheMap: [String: Animation] = [:]
|
|
55
59
|
fileprivate var lruList: [String] = []
|
|
56
|
-
|
|
60
|
+
|
|
57
61
|
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
//
|
|
2
|
+
// AnimationKeypath.swift
|
|
3
|
+
// lottie-swift
|
|
4
|
+
//
|
|
5
|
+
// Created by Brandon Withrow on 2/4/19.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
import Foundation
|
|
9
|
+
|
|
10
|
+
/// `AnimationKeypath` is an object that describes a keypath search for nodes in the
|
|
11
|
+
/// animation JSON. `AnimationKeypath` matches views and properties inside of `AnimationView`
|
|
12
|
+
/// to their backing `Animation` model by name.
|
|
13
|
+
///
|
|
14
|
+
/// A keypath can be used to set properties on an existing animation, or can be validated
|
|
15
|
+
/// with an existing `Animation`.
|
|
16
|
+
///
|
|
17
|
+
/// `AnimationKeypath` can describe a specific object, or can use wildcards for fuzzy matching
|
|
18
|
+
/// of objects. Acceptable wildcards are either "*" (star) or "**" (double star).
|
|
19
|
+
/// Single star will search a single depth for the next object.
|
|
20
|
+
/// Double star will search any depth.
|
|
21
|
+
///
|
|
22
|
+
/// Read More at https://airbnb.io/lottie/#/ios?id=dynamic-animation-properties
|
|
23
|
+
///
|
|
24
|
+
/// EG:
|
|
25
|
+
/// @"Layer.Shape Group.Stroke 1.Color"
|
|
26
|
+
/// Represents a specific color node on a specific stroke.
|
|
27
|
+
///
|
|
28
|
+
/// @"**.Stroke 1.Color"
|
|
29
|
+
/// Represents the color node for every Stroke named "Stroke 1" in the animation.
|
|
30
|
+
public struct AnimationKeypath: Hashable, ExpressibleByStringLiteral {
|
|
31
|
+
|
|
32
|
+
/// Creates a keypath from a dot-separated string. The string is separated by "."
|
|
33
|
+
public init(keypath: String) {
|
|
34
|
+
keys = keypath.components(separatedBy: ".")
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/// Creates a keypath from a dot-separated string
|
|
38
|
+
public init(stringLiteral: String) {
|
|
39
|
+
self.init(keypath: stringLiteral)
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/// Creates a keypath from a list of strings.
|
|
43
|
+
public init(keys: [String]) {
|
|
44
|
+
self.keys = keys
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
var keys: [String]
|
|
48
|
+
|
|
49
|
+
}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
//
|
|
2
|
+
// AnyValueProvider.swift
|
|
3
|
+
// lottie-swift
|
|
4
|
+
//
|
|
5
|
+
// Created by Brandon Withrow on 1/30/19.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
import CoreGraphics
|
|
9
|
+
import Foundation
|
|
10
|
+
|
|
11
|
+
// MARK: - AnyValueProvider
|
|
12
|
+
|
|
13
|
+
/// `AnyValueProvider` is a protocol that return animation data for a property at a
|
|
14
|
+
/// given time. Every frame an `AnimationView` queries all of its properties and asks
|
|
15
|
+
/// if their ValueProvider has an update. If it does the AnimationView will read the
|
|
16
|
+
/// property and update that portion of the animation.
|
|
17
|
+
///
|
|
18
|
+
/// Value Providers can be used to dynamically set animation properties at run time.
|
|
19
|
+
public protocol AnyValueProvider {
|
|
20
|
+
|
|
21
|
+
/// The Type of the value provider
|
|
22
|
+
var valueType: Any.Type { get }
|
|
23
|
+
|
|
24
|
+
/// The type-erased storage for this Value Provider
|
|
25
|
+
var typeErasedStorage: AnyValueProviderStorage { get }
|
|
26
|
+
|
|
27
|
+
/// Asks the provider if it has an update for the given frame.
|
|
28
|
+
func hasUpdate(frame: AnimationFrameTime) -> Bool
|
|
29
|
+
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
extension AnyValueProvider {
|
|
33
|
+
/// Asks the provider to update the container with its value for the frame.
|
|
34
|
+
public func value(frame: AnimationFrameTime) -> Any {
|
|
35
|
+
typeErasedStorage.value(frame: frame)
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// MARK: - ValueProvider
|
|
40
|
+
|
|
41
|
+
/// A base protocol for strongly-typed Value Providers
|
|
42
|
+
protocol ValueProvider: AnyValueProvider {
|
|
43
|
+
associatedtype Value: AnyInterpolatable
|
|
44
|
+
|
|
45
|
+
/// The strongly-typed storage for this Value Provider
|
|
46
|
+
var storage: ValueProviderStorage<Value> { get }
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
extension ValueProvider {
|
|
50
|
+
public var typeErasedStorage: AnyValueProviderStorage {
|
|
51
|
+
switch storage {
|
|
52
|
+
case .closure(let typedClosure):
|
|
53
|
+
return .closure(typedClosure)
|
|
54
|
+
|
|
55
|
+
case .singleValue(let typedValue):
|
|
56
|
+
return .singleValue(typedValue)
|
|
57
|
+
|
|
58
|
+
case .keyframes(let keyframes):
|
|
59
|
+
return .keyframes(
|
|
60
|
+
keyframes.map { keyframe in
|
|
61
|
+
keyframe.withValue(keyframe.value as Any)
|
|
62
|
+
},
|
|
63
|
+
interpolate: storage.value(frame:))
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// MARK: - ValueProviderStorage
|
|
69
|
+
|
|
70
|
+
/// The underlying storage of a `ValueProvider`
|
|
71
|
+
public enum ValueProviderStorage<T: AnyInterpolatable> {
|
|
72
|
+
/// The value provider stores a single value that is used on all frames
|
|
73
|
+
case singleValue(T)
|
|
74
|
+
|
|
75
|
+
/// The value provider stores a group of keyframes
|
|
76
|
+
/// - The main-thread rendering engine interpolates values in these keyframes
|
|
77
|
+
/// using `T`'s `Interpolatable` implementation.
|
|
78
|
+
/// - The Core Animation rendering engine constructs a `CAKeyframeAnimation`
|
|
79
|
+
/// using these keyframes. The Core Animation render server performs
|
|
80
|
+
/// the interpolation, without calling `T`'s `Interpolatable` implementation.
|
|
81
|
+
case keyframes([Keyframe<T>])
|
|
82
|
+
|
|
83
|
+
/// The value provider stores a closure that is invoked on every frame
|
|
84
|
+
/// - This is only supported by the main-thread rendering engine
|
|
85
|
+
case closure((AnimationFrameTime) -> T)
|
|
86
|
+
|
|
87
|
+
// MARK: Internal
|
|
88
|
+
|
|
89
|
+
func value(frame: AnimationFrameTime) -> T {
|
|
90
|
+
switch self {
|
|
91
|
+
case .singleValue(let value):
|
|
92
|
+
return value
|
|
93
|
+
|
|
94
|
+
case .closure(let closure):
|
|
95
|
+
return closure(frame)
|
|
96
|
+
|
|
97
|
+
case .keyframes(let keyframes):
|
|
98
|
+
return KeyframeInterpolator(keyframes: ContiguousArray(keyframes)).storage.value(frame: frame)
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// MARK: - AnyValueProviderStorage
|
|
104
|
+
|
|
105
|
+
/// A type-erased representation of `ValueProviderStorage`
|
|
106
|
+
public enum AnyValueProviderStorage {
|
|
107
|
+
/// The value provider stores a single value that is used on all frames
|
|
108
|
+
case singleValue(Any)
|
|
109
|
+
|
|
110
|
+
/// The value provider stores a group of keyframes
|
|
111
|
+
/// - Since we can't interpolate a type-erased `KeyframeGroup`,
|
|
112
|
+
/// the interpolation has to be performed in the `interpolate` closure.
|
|
113
|
+
case keyframes([Keyframe<Any>], interpolate: (AnimationFrameTime) -> Any)
|
|
114
|
+
|
|
115
|
+
/// The value provider stores a closure that is invoked on every frame
|
|
116
|
+
case closure((AnimationFrameTime) -> Any)
|
|
117
|
+
|
|
118
|
+
// MARK: Internal
|
|
119
|
+
|
|
120
|
+
func value(frame: AnimationFrameTime) -> Any {
|
|
121
|
+
switch self {
|
|
122
|
+
case .singleValue(let value):
|
|
123
|
+
return value
|
|
124
|
+
|
|
125
|
+
case .closure(let closure):
|
|
126
|
+
return closure(frame)
|
|
127
|
+
|
|
128
|
+
case .keyframes(_, let valueForFrame):
|
|
129
|
+
return valueForFrame(frame)
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
@@ -5,62 +5,80 @@
|
|
|
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 CGColor Value
|
|
12
|
-
public final class ColorValueProvider:
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
/// The color value of the provider.
|
|
18
|
-
public var color: Color {
|
|
19
|
-
didSet {
|
|
20
|
-
hasUpdate = true
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
|
|
12
|
+
public final class ColorValueProvider: ValueProvider {
|
|
13
|
+
|
|
14
|
+
// MARK: Lifecycle
|
|
15
|
+
|
|
24
16
|
/// Initializes with a block provider
|
|
25
17
|
public init(block: @escaping ColorValueBlock) {
|
|
26
18
|
self.block = block
|
|
27
|
-
|
|
19
|
+
color = Color(r: 0, g: 0, b: 0, a: 1)
|
|
20
|
+
keyframes = nil
|
|
28
21
|
}
|
|
29
|
-
|
|
22
|
+
|
|
30
23
|
/// Initializes with a single color.
|
|
31
24
|
public init(_ color: Color) {
|
|
32
25
|
self.color = color
|
|
33
|
-
|
|
26
|
+
block = nil
|
|
27
|
+
keyframes = nil
|
|
28
|
+
hasUpdate = true
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/// Initializes with multiple colors, with timing information
|
|
32
|
+
public init(_ keyframes: [Keyframe<Color>]) {
|
|
33
|
+
self.keyframes = keyframes
|
|
34
|
+
color = Color(r: 0, g: 0, b: 0, a: 1)
|
|
35
|
+
block = nil
|
|
34
36
|
hasUpdate = true
|
|
35
37
|
}
|
|
36
|
-
|
|
38
|
+
|
|
39
|
+
// MARK: Public
|
|
40
|
+
|
|
41
|
+
/// Returns a Color for a CGColor(Frame Time)
|
|
42
|
+
public typealias ColorValueBlock = (CGFloat) -> Color
|
|
43
|
+
|
|
44
|
+
/// The color value of the provider.
|
|
45
|
+
public var color: Color {
|
|
46
|
+
didSet {
|
|
47
|
+
hasUpdate = true
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
37
51
|
// MARK: ValueProvider Protocol
|
|
38
|
-
|
|
52
|
+
|
|
39
53
|
public var valueType: Any.Type {
|
|
40
|
-
|
|
54
|
+
Color.self
|
|
41
55
|
}
|
|
42
|
-
|
|
43
|
-
public
|
|
56
|
+
|
|
57
|
+
public var storage: ValueProviderStorage<Color> {
|
|
58
|
+
if let block = block {
|
|
59
|
+
return .closure { frame in
|
|
60
|
+
self.hasUpdate = false
|
|
61
|
+
return block(frame)
|
|
62
|
+
}
|
|
63
|
+
} else if let keyframes = keyframes {
|
|
64
|
+
return .keyframes(keyframes)
|
|
65
|
+
} else {
|
|
66
|
+
hasUpdate = false
|
|
67
|
+
return .singleValue(color)
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
public func hasUpdate(frame _: CGFloat) -> Bool {
|
|
44
72
|
if block != nil {
|
|
45
73
|
return true
|
|
46
74
|
}
|
|
47
75
|
return hasUpdate
|
|
48
76
|
}
|
|
49
|
-
|
|
50
|
-
public func value(frame: CGFloat) -> Any {
|
|
51
|
-
hasUpdate = false
|
|
52
|
-
let newColor: Color
|
|
53
|
-
if let block = block {
|
|
54
|
-
newColor = block(frame)
|
|
55
|
-
} else {
|
|
56
|
-
newColor = color
|
|
57
|
-
}
|
|
58
|
-
return newColor
|
|
59
|
-
}
|
|
60
|
-
|
|
77
|
+
|
|
61
78
|
// MARK: Private
|
|
62
|
-
|
|
63
|
-
private var hasUpdate
|
|
64
|
-
|
|
79
|
+
|
|
80
|
+
private var hasUpdate = true
|
|
81
|
+
|
|
65
82
|
private var block: ColorValueBlock?
|
|
83
|
+
private var keyframes: [Keyframe<Color>]?
|
|
66
84
|
}
|
|
@@ -5,62 +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 CGFloat Value
|
|
12
|
-
public final class FloatValueProvider:
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
public var float: CGFloat {
|
|
18
|
-
didSet {
|
|
19
|
-
hasUpdate = true
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
|
|
12
|
+
public final class FloatValueProvider: ValueProvider {
|
|
13
|
+
|
|
14
|
+
// MARK: Lifecycle
|
|
15
|
+
|
|
23
16
|
/// Initializes with a block provider
|
|
24
17
|
public init(block: @escaping CGFloatValueBlock) {
|
|
25
18
|
self.block = block
|
|
26
|
-
|
|
19
|
+
float = 0
|
|
27
20
|
}
|
|
28
|
-
|
|
21
|
+
|
|
29
22
|
/// Initializes with a single float.
|
|
30
23
|
public init(_ float: CGFloat) {
|
|
31
24
|
self.float = float
|
|
32
|
-
|
|
25
|
+
block = nil
|
|
33
26
|
hasUpdate = true
|
|
34
27
|
}
|
|
35
|
-
|
|
28
|
+
|
|
29
|
+
// MARK: Public
|
|
30
|
+
|
|
31
|
+
/// Returns a CGFloat for a CGFloat(Frame Time)
|
|
32
|
+
public typealias CGFloatValueBlock = (CGFloat) -> CGFloat
|
|
33
|
+
|
|
34
|
+
public var float: CGFloat {
|
|
35
|
+
didSet {
|
|
36
|
+
hasUpdate = true
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
36
40
|
// MARK: ValueProvider Protocol
|
|
37
|
-
|
|
41
|
+
|
|
38
42
|
public var valueType: Any.Type {
|
|
39
|
-
|
|
43
|
+
Vector1D.self
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
public var storage: ValueProviderStorage<Vector1D> {
|
|
47
|
+
if let block = block {
|
|
48
|
+
return .closure { frame in
|
|
49
|
+
self.hasUpdate = false
|
|
50
|
+
return Vector1D(Double(block(frame)))
|
|
51
|
+
}
|
|
52
|
+
} else {
|
|
53
|
+
hasUpdate = false
|
|
54
|
+
return .singleValue(Vector1D(Double(float)))
|
|
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 newCGFloat: CGFloat
|
|
52
|
-
if let block = block {
|
|
53
|
-
newCGFloat = block(frame)
|
|
54
|
-
} else {
|
|
55
|
-
newCGFloat = float
|
|
56
|
-
}
|
|
57
|
-
return Vector1D(Double(newCGFloat))
|
|
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: CGFloatValueBlock?
|
|
65
70
|
}
|
|
66
|
-
|