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
package/{lottie-swift/src → Sources}/Private/Utility/Extensions/AnimationKeypathExtension.swift
RENAMED
|
@@ -9,69 +9,77 @@ import Foundation
|
|
|
9
9
|
import QuartzCore
|
|
10
10
|
|
|
11
11
|
extension KeypathSearchable {
|
|
12
|
-
|
|
12
|
+
|
|
13
13
|
func animatorNodes(for keyPath: AnimationKeypath) -> [AnimatorNode]? {
|
|
14
14
|
// Make sure there is a current key path.
|
|
15
15
|
guard let currentKey = keyPath.currentKey else { return nil }
|
|
16
|
-
|
|
16
|
+
|
|
17
17
|
// Now try popping the keypath for wildcard / child search
|
|
18
18
|
guard let nextKeypath = keyPath.popKey(keypathName) else {
|
|
19
19
|
// We may be on the final keypath. Check for match.
|
|
20
|
-
if
|
|
21
|
-
|
|
20
|
+
if
|
|
21
|
+
let node = self as? AnimatorNode,
|
|
22
|
+
currentKey.equalsKeypath(keypathName)
|
|
23
|
+
{
|
|
22
24
|
// This is the final keypath and matches self. Return.s
|
|
23
25
|
return [node]
|
|
24
26
|
}
|
|
25
27
|
/// Nope. Stop Search
|
|
26
28
|
return nil
|
|
27
29
|
}
|
|
28
|
-
|
|
30
|
+
|
|
29
31
|
var results: [AnimatorNode] = []
|
|
30
|
-
|
|
31
|
-
if
|
|
32
|
-
|
|
32
|
+
|
|
33
|
+
if
|
|
34
|
+
let node = self as? AnimatorNode,
|
|
35
|
+
nextKeypath.currentKey == nil
|
|
36
|
+
{
|
|
33
37
|
// Keypath matched self and was the final keypath.
|
|
34
38
|
results.append(node)
|
|
35
39
|
}
|
|
36
|
-
|
|
40
|
+
|
|
37
41
|
for childNode in childKeypaths {
|
|
38
42
|
// Check if the child has any nodes matching the next keypath.
|
|
39
43
|
if let foundNodes = childNode.animatorNodes(for: nextKeypath) {
|
|
40
44
|
results.append(contentsOf: foundNodes)
|
|
41
45
|
}
|
|
42
|
-
|
|
46
|
+
|
|
43
47
|
// In this case the current key is fuzzy, and both child and self match the next keyname. Keep digging!
|
|
44
|
-
if
|
|
48
|
+
if
|
|
49
|
+
currentKey.keyPathType == .fuzzyWildcard,
|
|
45
50
|
let nextKeypath = keyPath.nextKeypath,
|
|
46
51
|
nextKeypath.equalsKeypath(childNode.keypathName),
|
|
47
|
-
let foundNodes = childNode.animatorNodes(for: keyPath)
|
|
52
|
+
let foundNodes = childNode.animatorNodes(for: keyPath)
|
|
53
|
+
{
|
|
48
54
|
results.append(contentsOf: foundNodes)
|
|
49
55
|
}
|
|
50
56
|
}
|
|
51
|
-
|
|
57
|
+
|
|
52
58
|
guard results.count > 0 else {
|
|
53
59
|
return nil
|
|
54
60
|
}
|
|
55
|
-
|
|
61
|
+
|
|
56
62
|
return results
|
|
57
63
|
}
|
|
58
|
-
|
|
64
|
+
|
|
59
65
|
func nodeProperties(for keyPath: AnimationKeypath) -> [AnyNodeProperty]? {
|
|
60
66
|
guard let nextKeypath = keyPath.popKey(keypathName) else {
|
|
61
67
|
/// Nope. Stop Search
|
|
62
68
|
return nil
|
|
63
69
|
}
|
|
64
|
-
|
|
70
|
+
|
|
65
71
|
/// Keypath matches in some way. Continue the search.
|
|
66
72
|
var results: [AnyNodeProperty] = []
|
|
67
|
-
|
|
73
|
+
|
|
68
74
|
/// Check if we have a property keypath yet
|
|
69
|
-
if
|
|
70
|
-
let
|
|
75
|
+
if
|
|
76
|
+
let propertyKey = nextKeypath.propertyKey,
|
|
77
|
+
let property = keypathProperties[propertyKey]
|
|
78
|
+
{
|
|
71
79
|
/// We found a property!
|
|
72
80
|
results.append(property)
|
|
73
81
|
}
|
|
74
|
-
|
|
82
|
+
|
|
75
83
|
if nextKeypath.nextKeypath != nil {
|
|
76
84
|
/// Now check child keypaths.
|
|
77
85
|
for child in childKeypaths {
|
|
@@ -80,16 +88,16 @@ extension KeypathSearchable {
|
|
|
80
88
|
}
|
|
81
89
|
}
|
|
82
90
|
}
|
|
83
|
-
|
|
91
|
+
|
|
84
92
|
guard results.count > 0 else {
|
|
85
93
|
return nil
|
|
86
94
|
}
|
|
87
|
-
|
|
95
|
+
|
|
88
96
|
return results
|
|
89
97
|
}
|
|
90
|
-
|
|
98
|
+
|
|
91
99
|
func layer(for keyPath: AnimationKeypath) -> CALayer? {
|
|
92
|
-
if keyPath.nextKeypath == nil, let layerKey = keyPath.currentKey,
|
|
100
|
+
if keyPath.nextKeypath == nil, let layerKey = keyPath.currentKey, layerKey.equalsKeypath(keypathName) {
|
|
93
101
|
/// We found our layer!
|
|
94
102
|
return keypathLayer
|
|
95
103
|
}
|
|
@@ -97,47 +105,45 @@ extension KeypathSearchable {
|
|
|
97
105
|
/// Nope. Stop Search
|
|
98
106
|
return nil
|
|
99
107
|
}
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
return layer
|
|
106
|
-
}
|
|
108
|
+
|
|
109
|
+
/// Now check child keypaths.
|
|
110
|
+
for child in childKeypaths {
|
|
111
|
+
if let layer = child.layer(for: nextKeypath) {
|
|
112
|
+
return layer
|
|
107
113
|
}
|
|
108
114
|
}
|
|
109
115
|
return nil
|
|
110
116
|
}
|
|
111
|
-
|
|
112
|
-
func logKeypaths(for keyPath: AnimationKeypath
|
|
117
|
+
|
|
118
|
+
func logKeypaths(for keyPath: AnimationKeypath?, logger: LottieLogger) {
|
|
113
119
|
let newKeypath: AnimationKeypath
|
|
114
120
|
if let previousKeypath = keyPath {
|
|
115
121
|
newKeypath = previousKeypath.appendingKey(keypathName)
|
|
116
122
|
} else {
|
|
117
123
|
newKeypath = AnimationKeypath(keys: [keypathName])
|
|
118
124
|
}
|
|
119
|
-
|
|
125
|
+
logger.info(newKeypath.fullPath)
|
|
120
126
|
for key in keypathProperties.keys {
|
|
121
|
-
|
|
127
|
+
logger.info(newKeypath.appendingKey(key).fullPath)
|
|
122
128
|
}
|
|
123
129
|
for child in childKeypaths {
|
|
124
|
-
child.logKeypaths(for: newKeypath)
|
|
130
|
+
child.logKeypaths(for: newKeypath, logger: logger)
|
|
125
131
|
}
|
|
126
132
|
}
|
|
127
133
|
}
|
|
128
134
|
|
|
129
135
|
extension AnimationKeypath {
|
|
130
136
|
var currentKey: String? {
|
|
131
|
-
|
|
137
|
+
keys.first
|
|
132
138
|
}
|
|
133
|
-
|
|
139
|
+
|
|
134
140
|
var nextKeypath: String? {
|
|
135
141
|
guard keys.count > 1 else {
|
|
136
142
|
return nil
|
|
137
143
|
}
|
|
138
144
|
return keys[1]
|
|
139
145
|
}
|
|
140
|
-
|
|
146
|
+
|
|
141
147
|
var propertyKey: String? {
|
|
142
148
|
if nextKeypath == nil {
|
|
143
149
|
/// There are no more keypaths. This is a property key.
|
|
@@ -149,23 +155,31 @@ extension AnimationKeypath {
|
|
|
149
155
|
}
|
|
150
156
|
return nil
|
|
151
157
|
}
|
|
152
|
-
|
|
158
|
+
|
|
159
|
+
var fullPath: String {
|
|
160
|
+
keys.joined(separator: ".")
|
|
161
|
+
}
|
|
162
|
+
|
|
153
163
|
// Pops the top keypath from the stack if the keyname matches.
|
|
154
164
|
func popKey(_ keyname: String) -> AnimationKeypath? {
|
|
155
|
-
guard
|
|
165
|
+
guard
|
|
166
|
+
let currentKey = currentKey,
|
|
156
167
|
currentKey.equalsKeypath(keyname),
|
|
157
|
-
keys.count > 1 else
|
|
158
|
-
|
|
159
|
-
|
|
168
|
+
keys.count > 1 else
|
|
169
|
+
{
|
|
170
|
+
// Current key either doesnt match or we are on the last key.
|
|
171
|
+
return nil
|
|
160
172
|
}
|
|
161
|
-
|
|
173
|
+
|
|
162
174
|
// Pop the keypath from the stack and return the new stack.
|
|
163
175
|
let newKeys: [String]
|
|
164
|
-
|
|
176
|
+
|
|
165
177
|
if currentKey.keyPathType == .fuzzyWildcard {
|
|
166
178
|
/// Dont remove if current key is a fuzzy wildcard, and if the next keypath doesnt equal keypathname
|
|
167
|
-
if
|
|
168
|
-
nextKeypath
|
|
179
|
+
if
|
|
180
|
+
let nextKeypath = nextKeypath,
|
|
181
|
+
nextKeypath.equalsKeypath(keyname)
|
|
182
|
+
{
|
|
169
183
|
/// Remove next two keypaths. This keypath breaks the wildcard.
|
|
170
184
|
var oldKeys = keys
|
|
171
185
|
oldKeys.remove(at: 0)
|
|
@@ -179,14 +193,10 @@ extension AnimationKeypath {
|
|
|
179
193
|
oldKeys.remove(at: 0)
|
|
180
194
|
newKeys = oldKeys
|
|
181
195
|
}
|
|
182
|
-
|
|
196
|
+
|
|
183
197
|
return AnimationKeypath(keys: newKeys)
|
|
184
198
|
}
|
|
185
|
-
|
|
186
|
-
var fullPath: String {
|
|
187
|
-
return keys.joined(separator: ".")
|
|
188
|
-
}
|
|
189
|
-
|
|
199
|
+
|
|
190
200
|
func appendingKey(_ key: String) -> AnimationKeypath {
|
|
191
201
|
var newKeys = keys
|
|
192
202
|
newKeys.append(key)
|
|
@@ -194,8 +204,6 @@ extension AnimationKeypath {
|
|
|
194
204
|
}
|
|
195
205
|
}
|
|
196
206
|
|
|
197
|
-
|
|
198
|
-
|
|
199
207
|
extension String {
|
|
200
208
|
var keyPathType: KeyType {
|
|
201
209
|
switch self {
|
|
@@ -207,7 +215,7 @@ extension String {
|
|
|
207
215
|
return .specific
|
|
208
216
|
}
|
|
209
217
|
}
|
|
210
|
-
|
|
218
|
+
|
|
211
219
|
func equalsKeypath(_ keyname: String) -> Bool {
|
|
212
220
|
if keyPathType == .wildcard || keyPathType == .fuzzyWildcard {
|
|
213
221
|
return true
|
|
@@ -215,11 +223,11 @@ extension String {
|
|
|
215
223
|
if self == keyname {
|
|
216
224
|
return true
|
|
217
225
|
}
|
|
218
|
-
if let index =
|
|
226
|
+
if let index = firstIndex(of: "*") {
|
|
219
227
|
// Wildcard search.
|
|
220
228
|
let prefix = String(self.prefix(upTo: index))
|
|
221
229
|
let suffix = String(self.suffix(from: self.index(after: index)))
|
|
222
|
-
|
|
230
|
+
|
|
223
231
|
if prefix.count > 0 {
|
|
224
232
|
// Match prefix.
|
|
225
233
|
if keyname.count < prefix.count {
|
|
@@ -249,6 +257,8 @@ extension String {
|
|
|
249
257
|
}
|
|
250
258
|
}
|
|
251
259
|
|
|
260
|
+
// MARK: - KeyType
|
|
261
|
+
|
|
252
262
|
enum KeyType {
|
|
253
263
|
case specific
|
|
254
264
|
case wildcard
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
//
|
|
2
|
+
// File.swift
|
|
3
|
+
//
|
|
4
|
+
//
|
|
5
|
+
// Created by Denis Koryttsev on 10.05.2022.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
extension BlendMode {
|
|
9
|
+
/// The Core Image filter name for this `BlendMode`, that can be applied to a `CALayer`'s `compositingFilter`.
|
|
10
|
+
/// Supported compositing filters are defined here: https://developer.apple.com/library/archive/documentation/GraphicsImaging/Reference/CoreImageFilterReference/index.html#//apple_ref/doc/uid/TP30000136-SW71
|
|
11
|
+
var filterName: String? {
|
|
12
|
+
switch self {
|
|
13
|
+
case .normal: return nil
|
|
14
|
+
case .multiply: return "multiplyBlendMode"
|
|
15
|
+
case .screen: return "screenBlendMode"
|
|
16
|
+
case .overlay: return "overlayBlendMode"
|
|
17
|
+
case .darken: return "darkenBlendMode"
|
|
18
|
+
case .lighten: return "lightenBlendMode"
|
|
19
|
+
case .colorDodge: return "colorDodgeBlendMode"
|
|
20
|
+
case .colorBurn: return "colorBurnBlendMode"
|
|
21
|
+
case .hardLight: return "hardLightBlendMode"
|
|
22
|
+
case .softLight: return "softLightBlendMode"
|
|
23
|
+
case .difference: return "differenceBlendMode"
|
|
24
|
+
case .exclusion: return "exclusionBlendMode"
|
|
25
|
+
case .hue: return "hueBlendMode"
|
|
26
|
+
case .saturation: return "saturationBlendMode"
|
|
27
|
+
case .color: return "colorBlendMode"
|
|
28
|
+
case .luminosity: return "luminosityBlendMode"
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
// Created by Cal Stephens on 1/7/22.
|
|
2
|
+
// Copyright © 2022 Airbnb Inc. All rights reserved.
|
|
3
|
+
|
|
4
|
+
import QuartzCore
|
|
5
|
+
|
|
6
|
+
extension CGColor {
|
|
7
|
+
/// Initializes a `CGColor` using the given `RGB` values
|
|
8
|
+
static func rgb(_ red: CGFloat, _ green: CGFloat, _ blue: CGFloat) -> CGColor {
|
|
9
|
+
if #available(iOS 13.0, tvOS 13.0, macOS 10.5, *) {
|
|
10
|
+
return CGColor(red: red, green: green, blue: blue, alpha: 1)
|
|
11
|
+
} else {
|
|
12
|
+
return CGColor(
|
|
13
|
+
colorSpace: CGColorSpaceCreateDeviceRGB(),
|
|
14
|
+
components: [red, green, blue])!
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/// Initializes a `CGColor` using the given `RGBA` values
|
|
19
|
+
static func rgba(_ red: CGFloat, _ green: CGFloat, _ blue: CGFloat, _ alpha: CGFloat) -> CGColor {
|
|
20
|
+
CGColor.rgb(red, green, blue).copy(alpha: alpha)!
|
|
21
|
+
}
|
|
22
|
+
}
|
|
@@ -9,46 +9,87 @@ import Foundation
|
|
|
9
9
|
import QuartzCore
|
|
10
10
|
|
|
11
11
|
extension CGFloat {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
func isInRange(_ from: CGFloat, _ to: CGFloat) -> Bool {
|
|
18
|
-
return (from < self && self < to)
|
|
19
|
-
}
|
|
20
|
-
|
|
12
|
+
|
|
13
|
+
// MARK: Internal
|
|
14
|
+
|
|
21
15
|
var squared: CGFloat {
|
|
22
|
-
|
|
16
|
+
self * self
|
|
23
17
|
}
|
|
24
|
-
|
|
18
|
+
|
|
25
19
|
var cubed: CGFloat {
|
|
26
|
-
|
|
20
|
+
self * self * self
|
|
27
21
|
}
|
|
28
|
-
|
|
22
|
+
|
|
29
23
|
var cubicRoot: CGFloat {
|
|
30
|
-
|
|
24
|
+
CGFloat(pow(Double(self), 1.0 / 3.0))
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
func isInRangeOrEqual(_ from: CGFloat, _ to: CGFloat) -> Bool {
|
|
28
|
+
from <= self && self <= to
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
func isInRange(_ from: CGFloat, _ to: CGFloat) -> Bool {
|
|
32
|
+
from < self && self < to
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
func cubicBezierInterpolate(_ P0: CGPoint, _ P1: CGPoint, _ P2: CGPoint, _ P3: CGPoint) -> CGFloat {
|
|
36
|
+
var t: CGFloat
|
|
37
|
+
if self == P0.x {
|
|
38
|
+
// Handle corner cases explicitly to prevent rounding errors
|
|
39
|
+
t = 0
|
|
40
|
+
} else if self == P3.x {
|
|
41
|
+
t = 1
|
|
42
|
+
} else {
|
|
43
|
+
// Calculate t
|
|
44
|
+
let a = -P0.x + 3 * P1.x - 3 * P2.x + P3.x;
|
|
45
|
+
let b = 3 * P0.x - 6 * P1.x + 3 * P2.x;
|
|
46
|
+
let c = -3 * P0.x + 3 * P1.x;
|
|
47
|
+
let d = P0.x - self;
|
|
48
|
+
let tTemp = CGFloat.SolveCubic(a, b, c, d);
|
|
49
|
+
if tTemp == -1 {
|
|
50
|
+
return -1;
|
|
51
|
+
}
|
|
52
|
+
t = tTemp
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// Calculate y from t
|
|
56
|
+
return (1 - t).cubed * P0.y + 3 * t * (1 - t).squared * P1.y + 3 * t.squared * (1 - t) * P2.y + t.cubed * P3.y;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
func cubicBezier(_ t: CGFloat, _ c1: CGFloat, _ c2: CGFloat, _ end: CGFloat) -> CGFloat {
|
|
60
|
+
let t_ = (1.0 - t)
|
|
61
|
+
let tt_ = t_ * t_
|
|
62
|
+
let ttt_ = t_ * t_ * t_
|
|
63
|
+
let tt = t * t
|
|
64
|
+
let ttt = t * t * t
|
|
65
|
+
|
|
66
|
+
return self * ttt_
|
|
67
|
+
+ 3.0 * c1 * tt_ * t
|
|
68
|
+
+ 3.0 * c2 * t_ * tt
|
|
69
|
+
+ end * ttt;
|
|
31
70
|
}
|
|
32
|
-
|
|
71
|
+
|
|
72
|
+
// MARK: Fileprivate
|
|
73
|
+
|
|
33
74
|
fileprivate static func SolveQuadratic(_ a: CGFloat, _ b: CGFloat, _ c: CGFloat) -> CGFloat {
|
|
34
75
|
var result = (-b + sqrt(b.squared - 4 * a * c)) / (2 * a);
|
|
35
76
|
guard !result.isInRangeOrEqual(0, 1) else {
|
|
36
77
|
return result
|
|
37
78
|
}
|
|
38
|
-
|
|
79
|
+
|
|
39
80
|
result = (-b - sqrt(b.squared - 4 * a * c)) / (2 * a);
|
|
40
81
|
guard !result.isInRangeOrEqual(0, 1) else {
|
|
41
82
|
return result
|
|
42
83
|
}
|
|
43
|
-
|
|
84
|
+
|
|
44
85
|
return -1;
|
|
45
86
|
}
|
|
46
|
-
|
|
87
|
+
|
|
47
88
|
fileprivate static func SolveCubic(_ a: CGFloat, _ b: CGFloat, _ c: CGFloat, _ d: CGFloat) -> CGFloat {
|
|
48
|
-
if
|
|
89
|
+
if a == 0 {
|
|
49
90
|
return SolveQuadratic(b, c, d)
|
|
50
91
|
}
|
|
51
|
-
if
|
|
92
|
+
if d == 0 {
|
|
52
93
|
return 0
|
|
53
94
|
}
|
|
54
95
|
let a = a
|
|
@@ -62,36 +103,36 @@ extension CGFloat {
|
|
|
62
103
|
let r = (-27.0 * d + b * (9.0 * c - 2.0 * b.squared)) / 54.0
|
|
63
104
|
let disc = q.cubed + r.squared
|
|
64
105
|
let term1 = b / 3.0
|
|
65
|
-
|
|
66
|
-
if
|
|
106
|
+
|
|
107
|
+
if disc > 0 {
|
|
67
108
|
var s = r + sqrt(disc)
|
|
68
109
|
s = (s < 0) ? -((-s).cubicRoot) : s.cubicRoot
|
|
69
110
|
var t = r - sqrt(disc)
|
|
70
111
|
t = (t < 0) ? -((-t).cubicRoot) : t.cubicRoot
|
|
71
|
-
|
|
112
|
+
|
|
72
113
|
let result = -term1 + s + t;
|
|
73
114
|
if result.isInRangeOrEqual(0, 1) {
|
|
74
115
|
return result
|
|
75
116
|
}
|
|
76
|
-
} else if
|
|
117
|
+
} else if disc == 0 {
|
|
77
118
|
let r13 = (r < 0) ? -((-r).cubicRoot) : r.cubicRoot;
|
|
78
|
-
|
|
119
|
+
|
|
79
120
|
var result = -term1 + 2.0 * r13;
|
|
80
121
|
if result.isInRangeOrEqual(0, 1) {
|
|
81
122
|
return result
|
|
82
123
|
}
|
|
83
|
-
|
|
124
|
+
|
|
84
125
|
result = -(r13 + term1);
|
|
85
126
|
if result.isInRangeOrEqual(0, 1) {
|
|
86
127
|
return result
|
|
87
128
|
}
|
|
88
|
-
|
|
129
|
+
|
|
89
130
|
} else {
|
|
90
131
|
q = -q;
|
|
91
132
|
var dum1 = q * q * q;
|
|
92
133
|
dum1 = acos(r / sqrt(dum1));
|
|
93
134
|
let r13 = 2.0 * sqrt(q);
|
|
94
|
-
|
|
135
|
+
|
|
95
136
|
var result = -term1 + r13 * cos(dum1 / 3.0);
|
|
96
137
|
if result.isInRangeOrEqual(0, 1) {
|
|
97
138
|
return result
|
|
@@ -105,45 +146,7 @@ extension CGFloat {
|
|
|
105
146
|
return result
|
|
106
147
|
}
|
|
107
148
|
}
|
|
108
|
-
|
|
149
|
+
|
|
109
150
|
return -1;
|
|
110
151
|
}
|
|
111
|
-
|
|
112
|
-
func cubicBezierInterpolate(_ P0: CGPoint, _ P1: CGPoint, _ P2: CGPoint, _ P3: CGPoint) -> CGFloat {
|
|
113
|
-
var t: CGFloat
|
|
114
|
-
if (self == P0.x) {
|
|
115
|
-
// Handle corner cases explicitly to prevent rounding errors
|
|
116
|
-
t = 0
|
|
117
|
-
} else if (self == P3.x) {
|
|
118
|
-
t = 1
|
|
119
|
-
} else {
|
|
120
|
-
// Calculate t
|
|
121
|
-
let a = -P0.x + 3 * P1.x - 3 * P2.x + P3.x;
|
|
122
|
-
let b = 3 * P0.x - 6 * P1.x + 3 * P2.x;
|
|
123
|
-
let c = -3 * P0.x + 3 * P1.x;
|
|
124
|
-
let d = P0.x - self;
|
|
125
|
-
let tTemp = CGFloat.SolveCubic(a, b, c, d);
|
|
126
|
-
if (tTemp == -1) {
|
|
127
|
-
return -1;
|
|
128
|
-
}
|
|
129
|
-
t = tTemp
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
// Calculate y from t
|
|
133
|
-
return (1 - t).cubed * P0.y + 3 * t * (1 - t).squared * P1.y + 3 * t.squared * (1 - t) * P2.y + t.cubed * P3.y;
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
func cubicBezier(_ t: CGFloat, _ c1: CGFloat, _ c2: CGFloat, _ end: CGFloat) -> CGFloat {
|
|
137
|
-
let t_ = (1.0 - t)
|
|
138
|
-
let tt_ = t_ * t_
|
|
139
|
-
let ttt_ = t_ * t_ * t_
|
|
140
|
-
let tt = t * t
|
|
141
|
-
let ttt = t * t * t
|
|
142
|
-
|
|
143
|
-
return self * ttt_
|
|
144
|
-
+ 3.0 * c1 * tt_ * t
|
|
145
|
-
+ 3.0 * c2 * t_ * tt
|
|
146
|
-
+ end * ttt;
|
|
147
|
-
}
|
|
148
|
-
|
|
149
152
|
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
//
|
|
2
|
+
// DataExtension.swift
|
|
3
|
+
// Lottie
|
|
4
|
+
//
|
|
5
|
+
// Created by René Fouquet on 03.05.21.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
import Foundation
|
|
9
|
+
#if canImport(UIKit)
|
|
10
|
+
import UIKit
|
|
11
|
+
#elseif canImport(AppKit)
|
|
12
|
+
import AppKit
|
|
13
|
+
#endif
|
|
14
|
+
|
|
15
|
+
extension Data {
|
|
16
|
+
|
|
17
|
+
static func jsonData(from assetName: String, in bundle: Bundle) -> Data? {
|
|
18
|
+
#if canImport(UIKit)
|
|
19
|
+
return NSDataAsset(name: assetName, bundle: bundle)?.data
|
|
20
|
+
#else
|
|
21
|
+
if #available(macOS 10.11, *) {
|
|
22
|
+
return NSDataAsset(name: assetName, bundle: bundle)?.data
|
|
23
|
+
}
|
|
24
|
+
return nil
|
|
25
|
+
#endif
|
|
26
|
+
}
|
|
27
|
+
}
|