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
|
@@ -1,170 +0,0 @@
|
|
|
1
|
-
//
|
|
2
|
-
// InterpolatableExtensions.swift
|
|
3
|
-
// lottie-swift
|
|
4
|
-
//
|
|
5
|
-
// Created by Brandon Withrow on 1/14/19.
|
|
6
|
-
//
|
|
7
|
-
|
|
8
|
-
import Foundation
|
|
9
|
-
import CoreGraphics
|
|
10
|
-
|
|
11
|
-
extension Vector1D: Interpolatable {
|
|
12
|
-
func interpolateTo(_ to: Vector1D, amount: CGFloat, spatialOutTangent: CGPoint?, spatialInTangent: CGPoint?) -> Vector1D {
|
|
13
|
-
return value.interpolateTo(to.value, amount: amount).vectorValue
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
extension Vector2D: Interpolatable {
|
|
18
|
-
func interpolateTo(_ to: Vector2D, amount: CGFloat, spatialOutTangent: CGPoint?, spatialInTangent: CGPoint?) -> Vector2D {
|
|
19
|
-
return pointValue.interpolateTo(to.pointValue, amount: CGFloat(amount), spatialOutTangent: spatialOutTangent, spatialInTangent: spatialInTangent).vector2dValue
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
extension Vector3D: Interpolatable {
|
|
25
|
-
func interpolateTo(_ to: Vector3D, amount: CGFloat, spatialOutTangent: CGPoint?, spatialInTangent: CGPoint?) -> Vector3D {
|
|
26
|
-
if spatialInTangent != nil || spatialOutTangent != nil {
|
|
27
|
-
// TODO Support third dimension spatial interpolation
|
|
28
|
-
let point = pointValue.interpolateTo(to.pointValue, amount: amount, spatialOutTangent: spatialOutTangent, spatialInTangent: spatialInTangent)
|
|
29
|
-
return Vector3D(x: point.x,
|
|
30
|
-
y: point.y,
|
|
31
|
-
z: CGFloat(z.interpolateTo(to.z, amount: amount)))
|
|
32
|
-
}
|
|
33
|
-
return Vector3D(x: x.interpolateTo(to.x, amount: amount),
|
|
34
|
-
y: y.interpolateTo(to.y, amount: amount),
|
|
35
|
-
z: z.interpolateTo(to.z, amount: amount))
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
extension Color: Interpolatable {
|
|
40
|
-
|
|
41
|
-
/// Initialize a new color with Hue Saturation and Value
|
|
42
|
-
init(h: Double, s: Double, v: Double, a: Double) {
|
|
43
|
-
|
|
44
|
-
let i = floor(h * 6)
|
|
45
|
-
let f = h * 6 - i
|
|
46
|
-
let p = v * (1 - s);
|
|
47
|
-
let q = v * (1 - f * s)
|
|
48
|
-
let t = v * (1 - (1 - f) * s)
|
|
49
|
-
|
|
50
|
-
switch (i.truncatingRemainder(dividingBy: 6)) {
|
|
51
|
-
case 0:
|
|
52
|
-
self.r = v
|
|
53
|
-
self.g = t
|
|
54
|
-
self.b = p
|
|
55
|
-
case 1:
|
|
56
|
-
self.r = q
|
|
57
|
-
self.g = v
|
|
58
|
-
self.b = p
|
|
59
|
-
case 2:
|
|
60
|
-
self.r = p
|
|
61
|
-
self.g = v
|
|
62
|
-
self.b = t
|
|
63
|
-
case 3:
|
|
64
|
-
self.r = p
|
|
65
|
-
self.g = q
|
|
66
|
-
self.b = v
|
|
67
|
-
case 4:
|
|
68
|
-
self.r = t
|
|
69
|
-
self.g = p
|
|
70
|
-
self.b = v
|
|
71
|
-
case 5:
|
|
72
|
-
self.r = v
|
|
73
|
-
self.g = p
|
|
74
|
-
self.b = q
|
|
75
|
-
default:
|
|
76
|
-
self.r = 0
|
|
77
|
-
self.g = 0
|
|
78
|
-
self.b = 0
|
|
79
|
-
}
|
|
80
|
-
self.a = a
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
/// Hue Saturation Value of the color.
|
|
84
|
-
var hsva: (h: Double, s: Double, v: Double, a: Double) {
|
|
85
|
-
let maxValue = max(r, g, b)
|
|
86
|
-
let minValue = min(r, g, b)
|
|
87
|
-
|
|
88
|
-
var h: Double, s: Double, v: Double = maxValue
|
|
89
|
-
|
|
90
|
-
let d = maxValue - minValue
|
|
91
|
-
s = maxValue == 0 ? 0 : d / maxValue;
|
|
92
|
-
|
|
93
|
-
if (maxValue == minValue) {
|
|
94
|
-
h = 0; // achromatic
|
|
95
|
-
} else {
|
|
96
|
-
switch (maxValue) {
|
|
97
|
-
case r: h = (g - b) / d + (g < b ? 6 : 0)
|
|
98
|
-
case g: h = (b - r) / d + 2
|
|
99
|
-
case b: h = (r - g) / d + 4
|
|
100
|
-
default: h = maxValue
|
|
101
|
-
}
|
|
102
|
-
h = h / 6
|
|
103
|
-
}
|
|
104
|
-
return (h: h, s: s, v: v, a: a)
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
init(y: Double, u: Double, v: Double, a: Double) {
|
|
108
|
-
// From https://www.fourcc.org/fccyvrgb.php
|
|
109
|
-
self.r = y + 1.403 * v
|
|
110
|
-
self.g = y - 0.344 * u
|
|
111
|
-
self.b = y + 1.770 * u
|
|
112
|
-
self.a = a
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
var yuv: (y: Double, u: Double, v: Double, a: Double) {
|
|
116
|
-
/// From https://www.fourcc.org/fccyvrgb.php
|
|
117
|
-
let y = 0.299 * r + 0.587 * g + 0.114 * b
|
|
118
|
-
let u = -0.14713 * r - 0.28886 * g + 0.436 * b
|
|
119
|
-
let v = 0.615 * r - 0.51499 * g - 0.10001 * b
|
|
120
|
-
return (y: y, u: u, v: v, a: a)
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
func interpolateTo(_ to: Color, amount: CGFloat, spatialOutTangent: CGPoint?, spatialInTangent: CGPoint?) -> Color {
|
|
124
|
-
return Color(r: r.interpolateTo(to.r, amount: amount),
|
|
125
|
-
g: g.interpolateTo(to.g, amount: amount),
|
|
126
|
-
b: b.interpolateTo(to.b, amount: amount),
|
|
127
|
-
a: a.interpolateTo(to.a, amount: amount))
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
extension CurveVertex: Interpolatable {
|
|
132
|
-
func interpolateTo(_ to: CurveVertex, amount: CGFloat, spatialOutTangent: CGPoint?, spatialInTangent: CGPoint?) -> CurveVertex {
|
|
133
|
-
return CurveVertex(point: point.interpolate(to.point, amount: amount),
|
|
134
|
-
inTangent: inTangent.interpolate(to.inTangent, amount: amount),
|
|
135
|
-
outTangent: outTangent.interpolate(to.outTangent, amount: amount))
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
extension BezierPath: Interpolatable {
|
|
140
|
-
func interpolateTo(_ to: BezierPath, amount: CGFloat, spatialOutTangent: CGPoint?, spatialInTangent: CGPoint?) -> BezierPath {
|
|
141
|
-
var newPath = BezierPath()
|
|
142
|
-
for i in 0..<min(elements.count, to.elements.count) {
|
|
143
|
-
let fromVertex = elements[i].vertex
|
|
144
|
-
let toVertex = to.elements[i].vertex
|
|
145
|
-
newPath.addVertex(fromVertex.interpolateTo(toVertex, amount: amount, spatialOutTangent: spatialOutTangent, spatialInTangent: spatialInTangent))
|
|
146
|
-
}
|
|
147
|
-
return newPath
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
extension TextDocument: Interpolatable {
|
|
152
|
-
|
|
153
|
-
func interpolateTo(_ to: TextDocument, amount: CGFloat, spatialOutTangent: CGPoint?, spatialInTangent: CGPoint?) -> TextDocument {
|
|
154
|
-
if amount == 1 {
|
|
155
|
-
return to
|
|
156
|
-
}
|
|
157
|
-
return self
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
extension Array: Interpolatable where Element == Double {
|
|
162
|
-
func interpolateTo(_ to: Array<Element>, amount: CGFloat, spatialOutTangent: CGPoint?, spatialInTangent: CGPoint?) -> Array<Element> {
|
|
163
|
-
var returnArray = [Double]()
|
|
164
|
-
for i in 0..<self.count {
|
|
165
|
-
returnArray.append(self[i].interpolateTo(to[i], amount: amount))
|
|
166
|
-
}
|
|
167
|
-
return returnArray
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
}
|
|
@@ -1,177 +0,0 @@
|
|
|
1
|
-
//
|
|
2
|
-
// CurveVertex.swift
|
|
3
|
-
// lottie-swift
|
|
4
|
-
//
|
|
5
|
-
// Created by Brandon Withrow on 1/11/19.
|
|
6
|
-
//
|
|
7
|
-
|
|
8
|
-
import Foundation
|
|
9
|
-
import CoreGraphics
|
|
10
|
-
|
|
11
|
-
/// A single vertex with an in and out tangent
|
|
12
|
-
struct CurveVertex {
|
|
13
|
-
|
|
14
|
-
let point: CGPoint
|
|
15
|
-
|
|
16
|
-
let inTangent: CGPoint
|
|
17
|
-
let outTangent: CGPoint
|
|
18
|
-
|
|
19
|
-
/// Initializes a curve point with absolute values
|
|
20
|
-
init(_ inTangent: CGPoint, _ point: CGPoint, _ outTangent: CGPoint) {
|
|
21
|
-
self.point = point
|
|
22
|
-
self.inTangent = inTangent
|
|
23
|
-
self.outTangent = outTangent
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
/// Initializes a curve point with relative values
|
|
27
|
-
init(point: CGPoint, inTangentRelative: CGPoint, outTangentRelative: CGPoint) {
|
|
28
|
-
self.point = point
|
|
29
|
-
self.inTangent = point.add(inTangentRelative)
|
|
30
|
-
self.outTangent = point.add(outTangentRelative)
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
/// Initializes a curve point with absolute values
|
|
34
|
-
init(point: CGPoint, inTangent: CGPoint, outTangent: CGPoint) {
|
|
35
|
-
self.point = point
|
|
36
|
-
self.inTangent = inTangent
|
|
37
|
-
self.outTangent = outTangent
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
var inTangentRelative: CGPoint {
|
|
41
|
-
return inTangent.subtract(point)
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
var outTangentRelative: CGPoint {
|
|
45
|
-
return outTangent.subtract(point)
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
func reversed() -> CurveVertex {
|
|
49
|
-
return CurveVertex(point: point, inTangent: outTangent, outTangent: inTangent)
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
func translated(_ translation: CGPoint) -> CurveVertex {
|
|
53
|
-
return CurveVertex(point: point + translation, inTangent: inTangent + translation, outTangent: outTangent + translation)
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
/**
|
|
57
|
-
Trims a path defined by two Vertices at a specific position, from 0 to 1
|
|
58
|
-
|
|
59
|
-
The path can be visualized below.
|
|
60
|
-
|
|
61
|
-
F is fromVertex.
|
|
62
|
-
V is the vertex of the receiver.
|
|
63
|
-
P is the position from 0-1.
|
|
64
|
-
O is the outTangent of fromVertex.
|
|
65
|
-
F====O=========P=======I====V
|
|
66
|
-
|
|
67
|
-
After trimming the curve can be visualized below.
|
|
68
|
-
|
|
69
|
-
S is the returned Start vertex.
|
|
70
|
-
E is the returned End vertex.
|
|
71
|
-
T is the trim point.
|
|
72
|
-
TI and TO are the new tangents for the trimPoint
|
|
73
|
-
NO and NI are the new tangents for the startPoint and endPoints
|
|
74
|
-
S==NO=========TI==T==TO=======NI==E
|
|
75
|
-
*/
|
|
76
|
-
func splitCurve(toVertex: CurveVertex, position: CGFloat) ->
|
|
77
|
-
(start: CurveVertex, trimPoint: CurveVertex, end: CurveVertex) {
|
|
78
|
-
|
|
79
|
-
/// If position is less than or equal to 0, trim at start.
|
|
80
|
-
if position <= 0 {
|
|
81
|
-
return (start: CurveVertex(point: point, inTangentRelative: inTangentRelative, outTangentRelative: .zero),
|
|
82
|
-
trimPoint: CurveVertex(point: point, inTangentRelative: .zero, outTangentRelative: outTangentRelative),
|
|
83
|
-
end: toVertex)
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
/// If position is greater than or equal to 1, trim at end.
|
|
87
|
-
if position >= 1 {
|
|
88
|
-
return (start: self,
|
|
89
|
-
trimPoint: CurveVertex(point: toVertex.point, inTangentRelative: toVertex.inTangentRelative, outTangentRelative: .zero),
|
|
90
|
-
end: CurveVertex(point: toVertex.point, inTangentRelative: .zero, outTangentRelative: toVertex.outTangentRelative))
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
if outTangentRelative.isZero && toVertex.inTangentRelative.isZero {
|
|
94
|
-
/// If both tangents are zero, then span to be trimmed is a straight line.
|
|
95
|
-
let trimPoint = point.interpolate(toVertex.point, amount: position)
|
|
96
|
-
return (start: self,
|
|
97
|
-
trimPoint: CurveVertex(point: trimPoint, inTangentRelative: .zero, outTangentRelative: .zero),
|
|
98
|
-
end: toVertex)
|
|
99
|
-
}
|
|
100
|
-
/// Cutting by amount gives incorrect length....
|
|
101
|
-
/// One option is to cut by a stride until it gets close then edge it down.
|
|
102
|
-
/// Measuring a percentage of the spans does not equal the same as measuring a percentage of length.
|
|
103
|
-
/// This is where the historical trim path bugs come from.
|
|
104
|
-
let a = point.interpolate(outTangent, amount: position)
|
|
105
|
-
let b = outTangent.interpolate(toVertex.inTangent, amount: position)
|
|
106
|
-
let c = toVertex.inTangent.interpolate(toVertex.point, amount: position)
|
|
107
|
-
let d = a.interpolate(b, amount: position)
|
|
108
|
-
let e = b.interpolate(c, amount: position)
|
|
109
|
-
let f = d.interpolate(e, amount: position)
|
|
110
|
-
return (start: CurveVertex(point: point, inTangent: inTangent, outTangent: a),
|
|
111
|
-
trimPoint: CurveVertex(point: f, inTangent: d, outTangent: e),
|
|
112
|
-
end: CurveVertex(point: toVertex.point, inTangent: c, outTangent: toVertex.outTangent))
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
/**
|
|
116
|
-
Trims a curve of a known length to a specific length and returns the points.
|
|
117
|
-
|
|
118
|
-
There is not a performant yet accurate way to cut a curve to a specific length.
|
|
119
|
-
This calls splitCurve(toVertex: position:) to split the curve and then measures
|
|
120
|
-
the length of the new curve. The function then iterates through the samples,
|
|
121
|
-
adjusting the position of the cut for a more precise cut.
|
|
122
|
-
Usually a single iteration is enough to get within 0.5 points of the desired
|
|
123
|
-
length.
|
|
124
|
-
|
|
125
|
-
This function should probably live in PathElement, since it deals with curve
|
|
126
|
-
lengths.
|
|
127
|
-
*/
|
|
128
|
-
func trimCurve(toVertex: CurveVertex, atLength: CGFloat, curveLength: CGFloat, maxSamples: Int, accuracy: CGFloat = 1) ->
|
|
129
|
-
(start: CurveVertex, trimPoint: CurveVertex, end: CurveVertex) {
|
|
130
|
-
var currentPosition = atLength / curveLength
|
|
131
|
-
var results = splitCurve(toVertex: toVertex, position: currentPosition)
|
|
132
|
-
|
|
133
|
-
if maxSamples == 0 {
|
|
134
|
-
return results
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
for _ in 1...maxSamples {
|
|
138
|
-
let length = results.start.distanceTo(results.trimPoint)
|
|
139
|
-
let lengthDiff = atLength - length
|
|
140
|
-
/// Check if length is correct.
|
|
141
|
-
if lengthDiff < accuracy {
|
|
142
|
-
return results
|
|
143
|
-
}
|
|
144
|
-
let diffPosition = max(min(((currentPosition / length) * lengthDiff), currentPosition * 0.5), currentPosition * -0.5)
|
|
145
|
-
currentPosition = diffPosition + currentPosition
|
|
146
|
-
results = splitCurve(toVertex: toVertex, position: currentPosition)
|
|
147
|
-
}
|
|
148
|
-
return results
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
/**
|
|
153
|
-
The distance from the receiver to the provided vertex.
|
|
154
|
-
|
|
155
|
-
For lines (zeroed tangents) the distance between the two points is measured.
|
|
156
|
-
For curves the curve is iterated over by sample count and the points are measured.
|
|
157
|
-
This is ~99% accurate at a sample count of 30
|
|
158
|
-
*/
|
|
159
|
-
func distanceTo(_ toVertex: CurveVertex, sampleCount: Int = 25) -> CGFloat {
|
|
160
|
-
|
|
161
|
-
if outTangentRelative.isZero && toVertex.inTangentRelative.isZero {
|
|
162
|
-
/// Return a linear distance.
|
|
163
|
-
return point.distanceTo(toVertex.point)
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
var distance: CGFloat = 0
|
|
167
|
-
|
|
168
|
-
var previousPoint = point
|
|
169
|
-
for i in 0..<sampleCount {
|
|
170
|
-
let pointOnCurve = splitCurve(toVertex: toVertex, position: CGFloat(i) / CGFloat(sampleCount)).trimPoint
|
|
171
|
-
distance = distance + previousPoint.distanceTo(pointOnCurve.point)
|
|
172
|
-
previousPoint = pointOnCurve.point
|
|
173
|
-
}
|
|
174
|
-
distance = distance + previousPoint.distanceTo(toVertex.point)
|
|
175
|
-
return distance
|
|
176
|
-
}
|
|
177
|
-
}
|
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
//
|
|
2
|
-
// PathElement.swift
|
|
3
|
-
// lottie-swift
|
|
4
|
-
//
|
|
5
|
-
// Created by Brandon Withrow on 1/11/19.
|
|
6
|
-
//
|
|
7
|
-
|
|
8
|
-
import Foundation
|
|
9
|
-
import CoreGraphics
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
A path section, containing one point and its length to the previous point.
|
|
13
|
-
|
|
14
|
-
The relationship between this path element and the previous is implicit.
|
|
15
|
-
Ideally a path section would be defined by two vertices and a length.
|
|
16
|
-
We don't do this however, as it would effectively double the memory footprint
|
|
17
|
-
of path data.
|
|
18
|
-
|
|
19
|
-
*/
|
|
20
|
-
struct PathElement {
|
|
21
|
-
/// The absolute Length of the path element.
|
|
22
|
-
let length: CGFloat
|
|
23
|
-
|
|
24
|
-
/// The vertex of the element
|
|
25
|
-
let vertex: CurveVertex
|
|
26
|
-
|
|
27
|
-
/// Returns a new path element define the span from the receiver to the new vertex.
|
|
28
|
-
func pathElementTo(_ toVertex: CurveVertex) -> PathElement {
|
|
29
|
-
return PathElement(length: vertex.distanceTo(toVertex), vertex: toVertex)
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
/// Initializes a new path with length of 0
|
|
33
|
-
init(vertex: CurveVertex) {
|
|
34
|
-
self.length = 0
|
|
35
|
-
self.vertex = vertex
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
/// Initializes a new path with length
|
|
39
|
-
fileprivate init(length: CGFloat, vertex: CurveVertex) {
|
|
40
|
-
self.length = length
|
|
41
|
-
self.vertex = vertex
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
func updateVertex(newVertex: CurveVertex) -> PathElement {
|
|
45
|
-
return PathElement(length: length, vertex: newVertex)
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
/// Splits an element span defined by the receiver and fromElement to a position 0-1
|
|
49
|
-
func splitElementAtPosition(fromElement: PathElement, atLength: CGFloat) ->
|
|
50
|
-
(leftSpan: (start: PathElement, end: PathElement), rightSpan: (start: PathElement, end: PathElement)) {
|
|
51
|
-
/// Trim the span. Start and trim go into the first, trim and end go into second.
|
|
52
|
-
let trimResults = fromElement.vertex.trimCurve(toVertex: vertex, atLength: atLength, curveLength: length, maxSamples: 3)
|
|
53
|
-
|
|
54
|
-
/// Create the elements for the break
|
|
55
|
-
let spanAStart = PathElement(length: fromElement.length,
|
|
56
|
-
vertex: CurveVertex(point: fromElement.vertex.point,
|
|
57
|
-
inTangent: fromElement.vertex.inTangent,
|
|
58
|
-
outTangent: trimResults.start.outTangent))
|
|
59
|
-
/// Recalculating the length here is a waste as the trimCurve function also accurately calculates this length.
|
|
60
|
-
let spanAEnd = spanAStart.pathElementTo(trimResults.trimPoint)
|
|
61
|
-
|
|
62
|
-
let spanBStart = PathElement(vertex: trimResults.trimPoint)
|
|
63
|
-
let spanBEnd = spanBStart.pathElementTo(trimResults.end)
|
|
64
|
-
return (leftSpan: (start: spanAStart, end: spanAEnd),
|
|
65
|
-
rightSpan: (start: spanBStart, end: spanBEnd))
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
}
|
|
@@ -1,218 +0,0 @@
|
|
|
1
|
-
//
|
|
2
|
-
// Vector.swift
|
|
3
|
-
// lottie-swift
|
|
4
|
-
//
|
|
5
|
-
// Created by Brandon Withrow on 1/7/19.
|
|
6
|
-
//
|
|
7
|
-
|
|
8
|
-
import Foundation
|
|
9
|
-
import CoreGraphics
|
|
10
|
-
import QuartzCore
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
Single value container. Needed because lottie sometimes wraps a Double in an array.
|
|
14
|
-
*/
|
|
15
|
-
extension Vector1D: Codable {
|
|
16
|
-
|
|
17
|
-
public init(from decoder: Decoder) throws {
|
|
18
|
-
/// Try to decode an array of doubles
|
|
19
|
-
do {
|
|
20
|
-
var container = try decoder.unkeyedContainer()
|
|
21
|
-
self.value = try container.decode(Double.self)
|
|
22
|
-
} catch {
|
|
23
|
-
self.value = try decoder.singleValueContainer().decode(Double.self)
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
public func encode(to encoder: Encoder) throws {
|
|
28
|
-
var container = encoder.singleValueContainer()
|
|
29
|
-
try container.encode(value)
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
var cgFloatValue: CGFloat {
|
|
33
|
-
return CGFloat(value)
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
extension Double {
|
|
39
|
-
var vectorValue: Vector1D {
|
|
40
|
-
return Vector1D(self)
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
/**
|
|
45
|
-
Needed for decoding json {x: y:} to a CGPoint
|
|
46
|
-
*/
|
|
47
|
-
struct Vector2D: Codable {
|
|
48
|
-
|
|
49
|
-
var x: Double
|
|
50
|
-
var y: Double
|
|
51
|
-
|
|
52
|
-
init(x: Double, y: Double) {
|
|
53
|
-
self.x = x
|
|
54
|
-
self.y = y
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
private enum CodingKeys : String, CodingKey {
|
|
58
|
-
case x = "x"
|
|
59
|
-
case y = "y"
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
init(from decoder: Decoder) throws {
|
|
63
|
-
let container = try decoder.container(keyedBy: Vector2D.CodingKeys.self)
|
|
64
|
-
|
|
65
|
-
do {
|
|
66
|
-
let xValue: [Double] = try container.decode([Double].self, forKey: .x)
|
|
67
|
-
self.x = xValue[0]
|
|
68
|
-
} catch {
|
|
69
|
-
self.x = try container.decode(Double.self, forKey: .x)
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
do {
|
|
73
|
-
let yValue: [Double] = try container.decode([Double].self, forKey: .y)
|
|
74
|
-
self.y = yValue[0]
|
|
75
|
-
} catch {
|
|
76
|
-
self.y = try container.decode(Double.self, forKey: .y)
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
func encode(to encoder: Encoder) throws {
|
|
81
|
-
var container = encoder.container(keyedBy: Vector2D.CodingKeys.self)
|
|
82
|
-
try container.encode(x, forKey: .x)
|
|
83
|
-
try container.encode(y, forKey: .y)
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
var pointValue: CGPoint {
|
|
87
|
-
return CGPoint(x: x, y: y)
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
extension Vector2D {
|
|
92
|
-
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
extension CGPoint {
|
|
96
|
-
var vector2dValue: Vector2D {
|
|
97
|
-
return Vector2D(x: Double(x), y: Double(y))
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
/**
|
|
102
|
-
A three dimensional vector.
|
|
103
|
-
These vectors are encoded and decoded from [Double]
|
|
104
|
-
*/
|
|
105
|
-
|
|
106
|
-
extension Vector3D: Codable {
|
|
107
|
-
|
|
108
|
-
init(x: CGFloat, y: CGFloat, z: CGFloat) {
|
|
109
|
-
self.x = Double(x)
|
|
110
|
-
self.y = Double(y)
|
|
111
|
-
self.z = Double(z)
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
public init(from decoder: Decoder) throws {
|
|
115
|
-
var container = try decoder.unkeyedContainer()
|
|
116
|
-
|
|
117
|
-
if !container.isAtEnd {
|
|
118
|
-
self.x = try container.decode(Double.self)
|
|
119
|
-
} else {
|
|
120
|
-
self.x = 0
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
if !container.isAtEnd {
|
|
124
|
-
self.y = try container.decode(Double.self)
|
|
125
|
-
} else {
|
|
126
|
-
self.y = 0
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
if !container.isAtEnd {
|
|
130
|
-
self.z = try container.decode(Double.self)
|
|
131
|
-
} else {
|
|
132
|
-
self.z = 0
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
public func encode(to encoder: Encoder) throws {
|
|
137
|
-
var container = encoder.unkeyedContainer()
|
|
138
|
-
try container.encode(x)
|
|
139
|
-
try container.encode(y)
|
|
140
|
-
try container.encode(z)
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
public extension Vector3D {
|
|
146
|
-
var pointValue: CGPoint {
|
|
147
|
-
return CGPoint(x: x, y: y)
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
var sizeValue: CGSize {
|
|
151
|
-
return CGSize(width: x, height: y)
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
extension CGPoint {
|
|
156
|
-
var vector3dValue: Vector3D {
|
|
157
|
-
return Vector3D(x: x, y: y, z: 0)
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
extension CGSize {
|
|
162
|
-
var vector3dValue: Vector3D {
|
|
163
|
-
return Vector3D(x: width, y: height, z: 1)
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
extension CATransform3D {
|
|
168
|
-
|
|
169
|
-
func rotated(_ degrees: CGFloat) -> CATransform3D {
|
|
170
|
-
return CATransform3DRotate(self, degrees.toRadians(), 0, 0, 1)
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
func translated(_ translation: CGPoint) -> CATransform3D {
|
|
174
|
-
return CATransform3DTranslate(self, translation.x, translation.y, 0)
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
func scaled(_ scale: CGSize) -> CATransform3D {
|
|
178
|
-
return CATransform3DScale(self, scale.width, scale.height, 1)
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
func skewed(skew: CGFloat, skewAxis: CGFloat) -> CATransform3D {
|
|
182
|
-
return CATransform3DConcat(CATransform3D.makeSkew(skew: skew, skewAxis: skewAxis), self)
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
static func makeSkew(skew: CGFloat, skewAxis: CGFloat) -> CATransform3D {
|
|
186
|
-
let mCos = cos(skewAxis.toRadians())
|
|
187
|
-
let mSin = sin(skewAxis.toRadians())
|
|
188
|
-
let aTan = tan(skew.toRadians())
|
|
189
|
-
|
|
190
|
-
let transform1 = CATransform3D(m11: mCos, m12: mSin, m13: 0, m14: 0,
|
|
191
|
-
m21: -mSin, m22: mCos, m23: 0, m24: 0,
|
|
192
|
-
m31: 0, m32: 0, m33: 1, m34: 0,
|
|
193
|
-
m41: 0, m42: 0, m43: 0, m44: 1)
|
|
194
|
-
|
|
195
|
-
let transform2 = CATransform3D(m11: 1, m12: 0, m13: 0, m14: 0,
|
|
196
|
-
m21: aTan, m22: 1, m23: 0, m24: 0,
|
|
197
|
-
m31: 0, m32: 0, m33: 1, m34: 0,
|
|
198
|
-
m41: 0, m42: 0, m43: 0, m44: 1)
|
|
199
|
-
|
|
200
|
-
let transform3 = CATransform3D(m11: mCos, m12: -mSin, m13: 0, m14: 0,
|
|
201
|
-
m21: mSin, m22: mCos, m23: 0, m24: 0,
|
|
202
|
-
m31: 0, m32: 0, m33: 1, m34: 0,
|
|
203
|
-
m41: 0, m42: 0, m43: 0, m44: 1)
|
|
204
|
-
return CATransform3DConcat(transform3, CATransform3DConcat(transform2, transform1))
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
static func makeTransform(anchor: CGPoint,
|
|
208
|
-
position: CGPoint,
|
|
209
|
-
scale: CGSize,
|
|
210
|
-
rotation: CGFloat,
|
|
211
|
-
skew: CGFloat?,
|
|
212
|
-
skewAxis: CGFloat?) -> CATransform3D {
|
|
213
|
-
if let skew = skew, let skewAxis = skewAxis {
|
|
214
|
-
return CATransform3DMakeTranslation(position.x, position.y, 0).rotated(rotation).skewed(skew: -skew, skewAxis: skewAxis).scaled(scale * 0.01).translated(anchor * -1)
|
|
215
|
-
}
|
|
216
|
-
return CATransform3DMakeTranslation(position.x, position.y, 0).rotated(rotation).scaled(scale * 0.01).translated(anchor * -1)
|
|
217
|
-
}
|
|
218
|
-
}
|