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
|
@@ -7,6 +7,8 @@
|
|
|
7
7
|
|
|
8
8
|
import Foundation
|
|
9
9
|
|
|
10
|
+
// MARK: - MergeMode
|
|
11
|
+
|
|
10
12
|
enum MergeMode: Int, Codable {
|
|
11
13
|
case none
|
|
12
14
|
case merge
|
|
@@ -16,26 +18,42 @@ enum MergeMode: Int, Codable {
|
|
|
16
18
|
case exclude
|
|
17
19
|
}
|
|
18
20
|
|
|
21
|
+
// MARK: - Merge
|
|
22
|
+
|
|
19
23
|
/// An item that define an ellipse shape
|
|
20
24
|
final class Merge: ShapeItem {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
private enum CodingKeys : String, CodingKey {
|
|
26
|
-
case mode = "mm"
|
|
27
|
-
}
|
|
28
|
-
|
|
25
|
+
|
|
26
|
+
// MARK: Lifecycle
|
|
27
|
+
|
|
29
28
|
required init(from decoder: Decoder) throws {
|
|
30
29
|
let container = try decoder.container(keyedBy: Merge.CodingKeys.self)
|
|
31
|
-
|
|
30
|
+
mode = try container.decode(MergeMode.self, forKey: .mode)
|
|
32
31
|
try super.init(from: decoder)
|
|
33
32
|
}
|
|
34
|
-
|
|
33
|
+
|
|
34
|
+
required init(dictionary: [String: Any]) throws {
|
|
35
|
+
let modeRawType: Int = try dictionary.value(for: CodingKeys.mode)
|
|
36
|
+
guard let mode = MergeMode(rawValue: modeRawType) else {
|
|
37
|
+
throw InitializableError.invalidInput
|
|
38
|
+
}
|
|
39
|
+
self.mode = mode
|
|
40
|
+
try super.init(dictionary: dictionary)
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// MARK: Internal
|
|
44
|
+
|
|
45
|
+
/// The mode of the merge path
|
|
46
|
+
let mode: MergeMode
|
|
47
|
+
|
|
35
48
|
override func encode(to encoder: Encoder) throws {
|
|
36
49
|
try super.encode(to: encoder)
|
|
37
50
|
var container = encoder.container(keyedBy: CodingKeys.self)
|
|
38
51
|
try container.encode(mode, forKey: .mode)
|
|
39
52
|
}
|
|
40
|
-
|
|
53
|
+
|
|
54
|
+
// MARK: Private
|
|
55
|
+
|
|
56
|
+
private enum CodingKeys: String, CodingKey {
|
|
57
|
+
case mode = "mm"
|
|
58
|
+
}
|
|
41
59
|
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Rectangle.swift
|
|
3
|
+
// lottie-swift
|
|
4
|
+
//
|
|
5
|
+
// Created by Brandon Withrow on 1/8/19.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
import Foundation
|
|
9
|
+
|
|
10
|
+
/// An item that define an ellipse shape
|
|
11
|
+
final class Rectangle: ShapeItem {
|
|
12
|
+
|
|
13
|
+
// MARK: Lifecycle
|
|
14
|
+
|
|
15
|
+
required init(from decoder: Decoder) throws {
|
|
16
|
+
let container = try decoder.container(keyedBy: Rectangle.CodingKeys.self)
|
|
17
|
+
direction = try container.decodeIfPresent(PathDirection.self, forKey: .direction) ?? .clockwise
|
|
18
|
+
position = try container.decode(KeyframeGroup<Vector3D>.self, forKey: .position)
|
|
19
|
+
size = try container.decode(KeyframeGroup<Vector3D>.self, forKey: .size)
|
|
20
|
+
cornerRadius = try container.decode(KeyframeGroup<Vector1D>.self, forKey: .cornerRadius)
|
|
21
|
+
try super.init(from: decoder)
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
required init(dictionary: [String: Any]) throws {
|
|
25
|
+
if
|
|
26
|
+
let directionRawType = dictionary[CodingKeys.direction.rawValue] as? Int,
|
|
27
|
+
let direction = PathDirection(rawValue: directionRawType)
|
|
28
|
+
{
|
|
29
|
+
self.direction = direction
|
|
30
|
+
} else {
|
|
31
|
+
direction = .clockwise
|
|
32
|
+
}
|
|
33
|
+
let positionDictionary: [String: Any] = try dictionary.value(for: CodingKeys.position)
|
|
34
|
+
position = try KeyframeGroup<Vector3D>(dictionary: positionDictionary)
|
|
35
|
+
let sizeDictionary: [String: Any] = try dictionary.value(for: CodingKeys.size)
|
|
36
|
+
size = try KeyframeGroup<Vector3D>(dictionary: sizeDictionary)
|
|
37
|
+
let cornerRadiusDictionary: [String: Any] = try dictionary.value(for: CodingKeys.cornerRadius)
|
|
38
|
+
cornerRadius = try KeyframeGroup<Vector1D>(dictionary: cornerRadiusDictionary)
|
|
39
|
+
try super.init(dictionary: dictionary)
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// MARK: Internal
|
|
43
|
+
|
|
44
|
+
/// The direction of the rect.
|
|
45
|
+
let direction: PathDirection
|
|
46
|
+
|
|
47
|
+
/// The position
|
|
48
|
+
let position: KeyframeGroup<Vector3D>
|
|
49
|
+
|
|
50
|
+
/// The size
|
|
51
|
+
let size: KeyframeGroup<Vector3D>
|
|
52
|
+
|
|
53
|
+
/// The Corner radius of the rectangle
|
|
54
|
+
let cornerRadius: KeyframeGroup<Vector1D>
|
|
55
|
+
|
|
56
|
+
override func encode(to encoder: Encoder) throws {
|
|
57
|
+
try super.encode(to: encoder)
|
|
58
|
+
var container = encoder.container(keyedBy: CodingKeys.self)
|
|
59
|
+
try container.encode(direction, forKey: .direction)
|
|
60
|
+
try container.encode(position, forKey: .position)
|
|
61
|
+
try container.encode(size, forKey: .size)
|
|
62
|
+
try container.encode(cornerRadius, forKey: .cornerRadius)
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// MARK: Private
|
|
66
|
+
|
|
67
|
+
private enum CodingKeys: String, CodingKey {
|
|
68
|
+
case direction = "d"
|
|
69
|
+
case position = "p"
|
|
70
|
+
case size = "s"
|
|
71
|
+
case cornerRadius = "r"
|
|
72
|
+
}
|
|
73
|
+
}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Repeater.swift
|
|
3
|
+
// lottie-swift
|
|
4
|
+
//
|
|
5
|
+
// Created by Brandon Withrow on 1/8/19.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
import Foundation
|
|
9
|
+
|
|
10
|
+
/// An item that define an ellipse shape
|
|
11
|
+
final class Repeater: ShapeItem {
|
|
12
|
+
|
|
13
|
+
// MARK: Lifecycle
|
|
14
|
+
|
|
15
|
+
required init(from decoder: Decoder) throws {
|
|
16
|
+
let container = try decoder.container(keyedBy: Repeater.CodingKeys.self)
|
|
17
|
+
copies = try container.decodeIfPresent(KeyframeGroup<Vector1D>.self, forKey: .copies) ?? KeyframeGroup(Vector1D(0))
|
|
18
|
+
offset = try container.decodeIfPresent(KeyframeGroup<Vector1D>.self, forKey: .offset) ?? KeyframeGroup(Vector1D(0))
|
|
19
|
+
let transformContainer = try container.nestedContainer(keyedBy: TransformKeys.self, forKey: .transform)
|
|
20
|
+
startOpacity = try transformContainer
|
|
21
|
+
.decodeIfPresent(KeyframeGroup<Vector1D>.self, forKey: .startOpacity) ?? KeyframeGroup(Vector1D(100))
|
|
22
|
+
endOpacity = try transformContainer
|
|
23
|
+
.decodeIfPresent(KeyframeGroup<Vector1D>.self, forKey: .endOpacity) ?? KeyframeGroup(Vector1D(100))
|
|
24
|
+
rotation = try transformContainer
|
|
25
|
+
.decodeIfPresent(KeyframeGroup<Vector1D>.self, forKey: .rotation) ?? KeyframeGroup(Vector1D(0))
|
|
26
|
+
position = try transformContainer
|
|
27
|
+
.decodeIfPresent(KeyframeGroup<Vector3D>.self, forKey: .position) ?? KeyframeGroup(Vector3D(x: Double(0), y: 0, z: 0))
|
|
28
|
+
anchorPoint = try transformContainer
|
|
29
|
+
.decodeIfPresent(KeyframeGroup<Vector3D>.self, forKey: .anchorPoint) ?? KeyframeGroup(Vector3D(x: Double(0), y: 0, z: 0))
|
|
30
|
+
scale = try transformContainer
|
|
31
|
+
.decodeIfPresent(KeyframeGroup<Vector3D>.self, forKey: .scale) ?? KeyframeGroup(Vector3D(x: Double(100), y: 100, z: 100))
|
|
32
|
+
try super.init(from: decoder)
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
required init(dictionary: [String: Any]) throws {
|
|
36
|
+
if let copiesDictionary = dictionary[CodingKeys.copies.rawValue] as? [String: Any] {
|
|
37
|
+
copies = try KeyframeGroup<Vector1D>(dictionary: copiesDictionary)
|
|
38
|
+
} else {
|
|
39
|
+
copies = KeyframeGroup(Vector1D(0))
|
|
40
|
+
}
|
|
41
|
+
if let offsetDictionary = dictionary[CodingKeys.offset.rawValue] as? [String: Any] {
|
|
42
|
+
offset = try KeyframeGroup<Vector1D>(dictionary: offsetDictionary)
|
|
43
|
+
} else {
|
|
44
|
+
offset = KeyframeGroup(Vector1D(0))
|
|
45
|
+
}
|
|
46
|
+
let transformDictionary: [String: Any] = try dictionary.value(for: CodingKeys.transform)
|
|
47
|
+
if let startOpacityDictionary = transformDictionary[TransformKeys.startOpacity.rawValue] as? [String: Any] {
|
|
48
|
+
startOpacity = try KeyframeGroup<Vector1D>(dictionary: startOpacityDictionary)
|
|
49
|
+
} else {
|
|
50
|
+
startOpacity = KeyframeGroup(Vector1D(100))
|
|
51
|
+
}
|
|
52
|
+
if let endOpacityDictionary = transformDictionary[TransformKeys.endOpacity.rawValue] as? [String: Any] {
|
|
53
|
+
endOpacity = try KeyframeGroup<Vector1D>(dictionary: endOpacityDictionary)
|
|
54
|
+
} else {
|
|
55
|
+
endOpacity = KeyframeGroup(Vector1D(100))
|
|
56
|
+
}
|
|
57
|
+
if let rotationDictionary = transformDictionary[TransformKeys.rotation.rawValue] as? [String: Any] {
|
|
58
|
+
rotation = try KeyframeGroup<Vector1D>(dictionary: rotationDictionary)
|
|
59
|
+
} else {
|
|
60
|
+
rotation = KeyframeGroup(Vector1D(0))
|
|
61
|
+
}
|
|
62
|
+
if let positionDictionary = transformDictionary[TransformKeys.position.rawValue] as? [String: Any] {
|
|
63
|
+
position = try KeyframeGroup<Vector3D>(dictionary: positionDictionary)
|
|
64
|
+
} else {
|
|
65
|
+
position = KeyframeGroup(Vector3D(x: Double(0), y: 0, z: 0))
|
|
66
|
+
}
|
|
67
|
+
if let anchorPointDictionary = transformDictionary[TransformKeys.anchorPoint.rawValue] as? [String: Any] {
|
|
68
|
+
anchorPoint = try KeyframeGroup<Vector3D>(dictionary: anchorPointDictionary)
|
|
69
|
+
} else {
|
|
70
|
+
anchorPoint = KeyframeGroup(Vector3D(x: Double(0), y: 0, z: 0))
|
|
71
|
+
}
|
|
72
|
+
if let scaleDictionary = transformDictionary[TransformKeys.scale.rawValue] as? [String: Any] {
|
|
73
|
+
scale = try KeyframeGroup<Vector3D>(dictionary: scaleDictionary)
|
|
74
|
+
} else {
|
|
75
|
+
scale = KeyframeGroup(Vector3D(x: Double(100), y: 100, z: 100))
|
|
76
|
+
}
|
|
77
|
+
try super.init(dictionary: dictionary)
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// MARK: Internal
|
|
81
|
+
|
|
82
|
+
/// The number of copies to repeat
|
|
83
|
+
let copies: KeyframeGroup<Vector1D>
|
|
84
|
+
|
|
85
|
+
/// The offset of each copy
|
|
86
|
+
let offset: KeyframeGroup<Vector1D>
|
|
87
|
+
|
|
88
|
+
/// Start Opacity
|
|
89
|
+
let startOpacity: KeyframeGroup<Vector1D>
|
|
90
|
+
|
|
91
|
+
/// End opacity
|
|
92
|
+
let endOpacity: KeyframeGroup<Vector1D>
|
|
93
|
+
|
|
94
|
+
/// The rotation
|
|
95
|
+
let rotation: KeyframeGroup<Vector1D>
|
|
96
|
+
|
|
97
|
+
/// Anchor Point
|
|
98
|
+
let anchorPoint: KeyframeGroup<Vector3D>
|
|
99
|
+
|
|
100
|
+
/// Position
|
|
101
|
+
let position: KeyframeGroup<Vector3D>
|
|
102
|
+
|
|
103
|
+
/// Scale
|
|
104
|
+
let scale: KeyframeGroup<Vector3D>
|
|
105
|
+
|
|
106
|
+
override func encode(to encoder: Encoder) throws {
|
|
107
|
+
try super.encode(to: encoder)
|
|
108
|
+
var container = encoder.container(keyedBy: CodingKeys.self)
|
|
109
|
+
try container.encode(copies, forKey: .copies)
|
|
110
|
+
try container.encode(offset, forKey: .offset)
|
|
111
|
+
var transformContainer = container.nestedContainer(keyedBy: TransformKeys.self, forKey: .transform)
|
|
112
|
+
try transformContainer.encode(startOpacity, forKey: .startOpacity)
|
|
113
|
+
try transformContainer.encode(endOpacity, forKey: .endOpacity)
|
|
114
|
+
try transformContainer.encode(rotation, forKey: .rotation)
|
|
115
|
+
try transformContainer.encode(position, forKey: .position)
|
|
116
|
+
try transformContainer.encode(anchorPoint, forKey: .anchorPoint)
|
|
117
|
+
try transformContainer.encode(scale, forKey: .scale)
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// MARK: Private
|
|
121
|
+
|
|
122
|
+
private enum CodingKeys: String, CodingKey {
|
|
123
|
+
case copies = "c"
|
|
124
|
+
case offset = "o"
|
|
125
|
+
case transform = "tr"
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
private enum TransformKeys: String, CodingKey {
|
|
129
|
+
case rotation = "r"
|
|
130
|
+
case startOpacity = "so"
|
|
131
|
+
case endOpacity = "eo"
|
|
132
|
+
case anchorPoint = "a"
|
|
133
|
+
case position = "p"
|
|
134
|
+
case scale = "s"
|
|
135
|
+
}
|
|
136
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
//
|
|
2
|
+
// VectorShape.swift
|
|
3
|
+
// lottie-swift
|
|
4
|
+
//
|
|
5
|
+
// Created by Brandon Withrow on 1/8/19.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
import Foundation
|
|
9
|
+
|
|
10
|
+
/// An item that defines an custom shape
|
|
11
|
+
final class Shape: ShapeItem {
|
|
12
|
+
|
|
13
|
+
// MARK: Lifecycle
|
|
14
|
+
|
|
15
|
+
required init(from decoder: Decoder) throws {
|
|
16
|
+
let container = try decoder.container(keyedBy: Shape.CodingKeys.self)
|
|
17
|
+
path = try container.decode(KeyframeGroup<BezierPath>.self, forKey: .path)
|
|
18
|
+
direction = try container.decodeIfPresent(PathDirection.self, forKey: .direction)
|
|
19
|
+
try super.init(from: decoder)
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
required init(dictionary: [String: Any]) throws {
|
|
23
|
+
let pathDictionary: [String: Any] = try dictionary.value(for: CodingKeys.path)
|
|
24
|
+
path = try KeyframeGroup<BezierPath>(dictionary: pathDictionary)
|
|
25
|
+
if
|
|
26
|
+
let directionRawValue = dictionary[CodingKeys.direction.rawValue] as? Int,
|
|
27
|
+
let direction = PathDirection(rawValue: directionRawValue)
|
|
28
|
+
{
|
|
29
|
+
self.direction = direction
|
|
30
|
+
} else {
|
|
31
|
+
direction = nil
|
|
32
|
+
}
|
|
33
|
+
try super.init(dictionary: dictionary)
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// MARK: Internal
|
|
37
|
+
|
|
38
|
+
/// The Path
|
|
39
|
+
let path: KeyframeGroup<BezierPath>
|
|
40
|
+
|
|
41
|
+
let direction: PathDirection?
|
|
42
|
+
|
|
43
|
+
override func encode(to encoder: Encoder) throws {
|
|
44
|
+
try super.encode(to: encoder)
|
|
45
|
+
var container = encoder.container(keyedBy: CodingKeys.self)
|
|
46
|
+
try container.encode(path, forKey: .path)
|
|
47
|
+
try container.encodeIfPresent(direction, forKey: .direction)
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// MARK: Private
|
|
51
|
+
|
|
52
|
+
private enum CodingKeys: String, CodingKey {
|
|
53
|
+
case path = "ks"
|
|
54
|
+
case direction = "d"
|
|
55
|
+
}
|
|
56
|
+
}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
//
|
|
2
|
+
// ShapeItem.swift
|
|
3
|
+
// lottie-swift
|
|
4
|
+
//
|
|
5
|
+
// Created by Brandon Withrow on 1/8/19.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
import Foundation
|
|
9
|
+
|
|
10
|
+
// MARK: - ShapeType + ClassFamily
|
|
11
|
+
|
|
12
|
+
/// Used for mapping a heterogeneous list to classes for parsing.
|
|
13
|
+
extension ShapeType: ClassFamily {
|
|
14
|
+
|
|
15
|
+
static var discriminator: Discriminator = .type
|
|
16
|
+
|
|
17
|
+
func getType() -> AnyObject.Type {
|
|
18
|
+
switch self {
|
|
19
|
+
case .ellipse:
|
|
20
|
+
return Ellipse.self
|
|
21
|
+
case .fill:
|
|
22
|
+
return Fill.self
|
|
23
|
+
case .gradientFill:
|
|
24
|
+
return GradientFill.self
|
|
25
|
+
case .group:
|
|
26
|
+
return Group.self
|
|
27
|
+
case .gradientStroke:
|
|
28
|
+
return GradientStroke.self
|
|
29
|
+
case .merge:
|
|
30
|
+
return Merge.self
|
|
31
|
+
case .rectangle:
|
|
32
|
+
return Rectangle.self
|
|
33
|
+
case .repeater:
|
|
34
|
+
return Repeater.self
|
|
35
|
+
case .shape:
|
|
36
|
+
return Shape.self
|
|
37
|
+
case .star:
|
|
38
|
+
return Star.self
|
|
39
|
+
case .stroke:
|
|
40
|
+
return Stroke.self
|
|
41
|
+
case .trim:
|
|
42
|
+
return Trim.self
|
|
43
|
+
case .transform:
|
|
44
|
+
return ShapeTransform.self
|
|
45
|
+
default:
|
|
46
|
+
return ShapeItem.self
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// MARK: - ShapeType
|
|
52
|
+
|
|
53
|
+
enum ShapeType: String, Codable {
|
|
54
|
+
case ellipse = "el"
|
|
55
|
+
case fill = "fl"
|
|
56
|
+
case gradientFill = "gf"
|
|
57
|
+
case group = "gr"
|
|
58
|
+
case gradientStroke = "gs"
|
|
59
|
+
case merge = "mm"
|
|
60
|
+
case rectangle = "rc"
|
|
61
|
+
case repeater = "rp"
|
|
62
|
+
case round = "rd"
|
|
63
|
+
case shape = "sh"
|
|
64
|
+
case star = "sr"
|
|
65
|
+
case stroke = "st"
|
|
66
|
+
case trim = "tm"
|
|
67
|
+
case transform = "tr"
|
|
68
|
+
case unknown
|
|
69
|
+
|
|
70
|
+
public init(from decoder: Decoder) throws {
|
|
71
|
+
self = try ShapeType(rawValue: decoder.singleValueContainer().decode(RawValue.self)) ?? .unknown
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// MARK: - ShapeItem
|
|
76
|
+
|
|
77
|
+
/// An item belonging to a Shape Layer
|
|
78
|
+
class ShapeItem: Codable, DictionaryInitializable {
|
|
79
|
+
|
|
80
|
+
// MARK: Lifecycle
|
|
81
|
+
|
|
82
|
+
required init(from decoder: Decoder) throws {
|
|
83
|
+
let container = try decoder.container(keyedBy: ShapeItem.CodingKeys.self)
|
|
84
|
+
name = try container.decodeIfPresent(String.self, forKey: .name) ?? "Layer"
|
|
85
|
+
type = try container.decode(ShapeType.self, forKey: .type)
|
|
86
|
+
hidden = try container.decodeIfPresent(Bool.self, forKey: .hidden) ?? false
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
required init(dictionary: [String: Any]) throws {
|
|
90
|
+
name = (try? dictionary.value(for: CodingKeys.name)) ?? "Layer"
|
|
91
|
+
type = ShapeType(rawValue: try dictionary.value(for: CodingKeys.type)) ?? .unknown
|
|
92
|
+
hidden = (try? dictionary.value(for: CodingKeys.hidden)) ?? false
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
init(
|
|
96
|
+
name: String,
|
|
97
|
+
type: ShapeType,
|
|
98
|
+
hidden: Bool)
|
|
99
|
+
{
|
|
100
|
+
self.name = name
|
|
101
|
+
self.type = type
|
|
102
|
+
self.hidden = hidden
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// MARK: Internal
|
|
106
|
+
|
|
107
|
+
/// The name of the shape
|
|
108
|
+
let name: String
|
|
109
|
+
|
|
110
|
+
/// The type of shape
|
|
111
|
+
let type: ShapeType
|
|
112
|
+
|
|
113
|
+
let hidden: Bool
|
|
114
|
+
|
|
115
|
+
// MARK: Fileprivate
|
|
116
|
+
|
|
117
|
+
fileprivate enum CodingKeys: String, CodingKey {
|
|
118
|
+
case name = "nm"
|
|
119
|
+
case type = "ty"
|
|
120
|
+
case hidden = "hd"
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
extension Array where Element == ShapeItem {
|
|
125
|
+
|
|
126
|
+
static func fromDictionaries(_ dictionaries: [[String: Any]]) throws -> [ShapeItem] {
|
|
127
|
+
try dictionaries.compactMap { dictionary in
|
|
128
|
+
let shapeType = dictionary[ShapeItem.CodingKeys.type.rawValue] as? String
|
|
129
|
+
switch ShapeType(rawValue: shapeType ?? ShapeType.unknown.rawValue) {
|
|
130
|
+
case .ellipse:
|
|
131
|
+
return try Ellipse(dictionary: dictionary)
|
|
132
|
+
case .fill:
|
|
133
|
+
return try Fill(dictionary: dictionary)
|
|
134
|
+
case .gradientFill:
|
|
135
|
+
return try GradientFill(dictionary: dictionary)
|
|
136
|
+
case .group:
|
|
137
|
+
return try Group(dictionary: dictionary)
|
|
138
|
+
case .gradientStroke:
|
|
139
|
+
return try GradientStroke(dictionary: dictionary)
|
|
140
|
+
case .merge:
|
|
141
|
+
return try Merge(dictionary: dictionary)
|
|
142
|
+
case .rectangle:
|
|
143
|
+
return try Rectangle(dictionary: dictionary)
|
|
144
|
+
case .repeater:
|
|
145
|
+
return try Repeater(dictionary: dictionary)
|
|
146
|
+
case .shape:
|
|
147
|
+
return try Shape(dictionary: dictionary)
|
|
148
|
+
case .star:
|
|
149
|
+
return try Star(dictionary: dictionary)
|
|
150
|
+
case .stroke:
|
|
151
|
+
return try Stroke(dictionary: dictionary)
|
|
152
|
+
case .trim:
|
|
153
|
+
return try Trim(dictionary: dictionary)
|
|
154
|
+
case .transform:
|
|
155
|
+
return try ShapeTransform(dictionary: dictionary)
|
|
156
|
+
case .none:
|
|
157
|
+
return nil
|
|
158
|
+
default:
|
|
159
|
+
return try ShapeItem(dictionary: dictionary)
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
//
|
|
2
|
+
// TransformItem.swift
|
|
3
|
+
// lottie-swift
|
|
4
|
+
//
|
|
5
|
+
// Created by Brandon Withrow on 1/8/19.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
import Foundation
|
|
9
|
+
|
|
10
|
+
/// An item that define an ellipse shape
|
|
11
|
+
final class ShapeTransform: ShapeItem {
|
|
12
|
+
|
|
13
|
+
// MARK: Lifecycle
|
|
14
|
+
|
|
15
|
+
required init(from decoder: Decoder) throws {
|
|
16
|
+
let container = try decoder.container(keyedBy: ShapeTransform.CodingKeys.self)
|
|
17
|
+
anchor = try container
|
|
18
|
+
.decodeIfPresent(KeyframeGroup<Vector3D>.self, forKey: .anchor) ?? KeyframeGroup(Vector3D(x: Double(0), y: 0, z: 0))
|
|
19
|
+
position = try container
|
|
20
|
+
.decodeIfPresent(KeyframeGroup<Vector3D>.self, forKey: .position) ?? KeyframeGroup(Vector3D(x: Double(0), y: 0, z: 0))
|
|
21
|
+
scale = try container
|
|
22
|
+
.decodeIfPresent(KeyframeGroup<Vector3D>.self, forKey: .scale) ?? KeyframeGroup(Vector3D(x: Double(100), y: 100, z: 100))
|
|
23
|
+
rotation = try container.decodeIfPresent(KeyframeGroup<Vector1D>.self, forKey: .rotation) ?? KeyframeGroup(Vector1D(0))
|
|
24
|
+
opacity = try container.decodeIfPresent(KeyframeGroup<Vector1D>.self, forKey: .opacity) ?? KeyframeGroup(Vector1D(100))
|
|
25
|
+
skew = try container.decodeIfPresent(KeyframeGroup<Vector1D>.self, forKey: .skew) ?? KeyframeGroup(Vector1D(0))
|
|
26
|
+
skewAxis = try container.decodeIfPresent(KeyframeGroup<Vector1D>.self, forKey: .skewAxis) ?? KeyframeGroup(Vector1D(0))
|
|
27
|
+
try super.init(from: decoder)
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
required init(dictionary: [String: Any]) throws {
|
|
31
|
+
if
|
|
32
|
+
let anchorDictionary = dictionary[CodingKeys.anchor.rawValue] as? [String: Any],
|
|
33
|
+
let anchor = try? KeyframeGroup<Vector3D>(dictionary: anchorDictionary)
|
|
34
|
+
{
|
|
35
|
+
self.anchor = anchor
|
|
36
|
+
} else {
|
|
37
|
+
anchor = KeyframeGroup(Vector3D(x: Double(0), y: 0, z: 0))
|
|
38
|
+
}
|
|
39
|
+
if
|
|
40
|
+
let positionDictionary = dictionary[CodingKeys.position.rawValue] as? [String: Any],
|
|
41
|
+
let position = try? KeyframeGroup<Vector3D>(dictionary: positionDictionary)
|
|
42
|
+
{
|
|
43
|
+
self.position = position
|
|
44
|
+
} else {
|
|
45
|
+
position = KeyframeGroup(Vector3D(x: Double(0), y: 0, z: 0))
|
|
46
|
+
}
|
|
47
|
+
if
|
|
48
|
+
let scaleDictionary = dictionary[CodingKeys.scale.rawValue] as? [String: Any],
|
|
49
|
+
let scale = try? KeyframeGroup<Vector3D>(dictionary: scaleDictionary)
|
|
50
|
+
{
|
|
51
|
+
self.scale = scale
|
|
52
|
+
} else {
|
|
53
|
+
scale = KeyframeGroup(Vector3D(x: Double(100), y: 100, z: 100))
|
|
54
|
+
}
|
|
55
|
+
if
|
|
56
|
+
let rotationDictionary = dictionary[CodingKeys.rotation.rawValue] as? [String: Any],
|
|
57
|
+
let rotation = try? KeyframeGroup<Vector1D>(dictionary: rotationDictionary)
|
|
58
|
+
{
|
|
59
|
+
self.rotation = rotation
|
|
60
|
+
} else {
|
|
61
|
+
rotation = KeyframeGroup(Vector1D(0))
|
|
62
|
+
}
|
|
63
|
+
if
|
|
64
|
+
let opacityDictionary = dictionary[CodingKeys.opacity.rawValue] as? [String: Any],
|
|
65
|
+
let opacity = try? KeyframeGroup<Vector1D>(dictionary: opacityDictionary)
|
|
66
|
+
{
|
|
67
|
+
self.opacity = opacity
|
|
68
|
+
} else {
|
|
69
|
+
opacity = KeyframeGroup(Vector1D(100))
|
|
70
|
+
}
|
|
71
|
+
if
|
|
72
|
+
let skewDictionary = dictionary[CodingKeys.skew.rawValue] as? [String: Any],
|
|
73
|
+
let skew = try? KeyframeGroup<Vector1D>(dictionary: skewDictionary)
|
|
74
|
+
{
|
|
75
|
+
self.skew = skew
|
|
76
|
+
} else {
|
|
77
|
+
skew = KeyframeGroup(Vector1D(0))
|
|
78
|
+
}
|
|
79
|
+
if
|
|
80
|
+
let skewAxisDictionary = dictionary[CodingKeys.skewAxis.rawValue] as? [String: Any],
|
|
81
|
+
let skewAxis = try? KeyframeGroup<Vector1D>(dictionary: skewAxisDictionary)
|
|
82
|
+
{
|
|
83
|
+
self.skewAxis = skewAxis
|
|
84
|
+
} else {
|
|
85
|
+
skewAxis = KeyframeGroup(Vector1D(0))
|
|
86
|
+
}
|
|
87
|
+
try super.init(dictionary: dictionary)
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// MARK: Internal
|
|
91
|
+
|
|
92
|
+
/// Anchor Point
|
|
93
|
+
let anchor: KeyframeGroup<Vector3D>
|
|
94
|
+
|
|
95
|
+
/// Position
|
|
96
|
+
let position: KeyframeGroup<Vector3D>
|
|
97
|
+
|
|
98
|
+
/// Scale
|
|
99
|
+
let scale: KeyframeGroup<Vector3D>
|
|
100
|
+
|
|
101
|
+
/// Rotation
|
|
102
|
+
let rotation: KeyframeGroup<Vector1D>
|
|
103
|
+
|
|
104
|
+
/// opacity
|
|
105
|
+
let opacity: KeyframeGroup<Vector1D>
|
|
106
|
+
|
|
107
|
+
/// Skew
|
|
108
|
+
let skew: KeyframeGroup<Vector1D>
|
|
109
|
+
|
|
110
|
+
/// Skew Axis
|
|
111
|
+
let skewAxis: KeyframeGroup<Vector1D>
|
|
112
|
+
|
|
113
|
+
override func encode(to encoder: Encoder) throws {
|
|
114
|
+
try super.encode(to: encoder)
|
|
115
|
+
var container = encoder.container(keyedBy: CodingKeys.self)
|
|
116
|
+
try container.encode(anchor, forKey: .anchor)
|
|
117
|
+
try container.encode(position, forKey: .position)
|
|
118
|
+
try container.encode(scale, forKey: .scale)
|
|
119
|
+
try container.encode(rotation, forKey: .rotation)
|
|
120
|
+
try container.encode(opacity, forKey: .opacity)
|
|
121
|
+
try container.encode(skew, forKey: .skew)
|
|
122
|
+
try container.encode(skewAxis, forKey: .skewAxis)
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// MARK: Private
|
|
126
|
+
|
|
127
|
+
private enum CodingKeys: String, CodingKey {
|
|
128
|
+
case anchor = "a"
|
|
129
|
+
case position = "p"
|
|
130
|
+
case scale = "s"
|
|
131
|
+
case rotation = "r"
|
|
132
|
+
case opacity = "o"
|
|
133
|
+
case skew = "sk"
|
|
134
|
+
case skewAxis = "sa"
|
|
135
|
+
}
|
|
136
|
+
}
|