lottie-ios 3.2.3 → 3.4.2
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/.github/workflows/stale_issues.yml +17 -0
- package/.spi.yml +6 -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/package.xcworkspace/xcuserdata/calstephens.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 +2011 -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_tvOS.xcscheme → Lottie (macOS).xcscheme } +5 -18
- package/Lottie.xcodeproj/xcshareddata/xcschemes/{Lottie_macOS.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 +34 -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 +22 -0
- package/Lottie.xcworkspace/xcuserdata/calstephens.xcuserdatad/xcdebugger/Expressions.xcexplist +138 -0
- package/Lottie.xcworkspace/xcuserdata/calstephens.xcuserdatad/xcschemes/xcschememanagement.plist +30 -0
- package/Package.swift +5 -15
- package/README.md +40 -60
- package/Rakefile +160 -0
- package/Sources/Private/CoreAnimation/Animations/CAAnimation+TimingConfiguration.swift +81 -0
- package/Sources/Private/CoreAnimation/Animations/CALayer+addAnimation.swift +447 -0
- package/Sources/Private/CoreAnimation/Animations/CombinedShapeAnimation.swift +81 -0
- package/Sources/Private/CoreAnimation/Animations/CustomPathAnimation.swift +41 -0
- package/Sources/Private/CoreAnimation/Animations/EllipseAnimation.swift +55 -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 +58 -0
- package/Sources/Private/CoreAnimation/Animations/ShapeAnimation.swift +257 -0
- package/Sources/Private/CoreAnimation/Animations/StarAnimation.swift +124 -0
- package/Sources/Private/CoreAnimation/Animations/StrokeAnimation.swift +73 -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 +497 -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 +154 -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 +88 -0
- package/Sources/Private/CoreAnimation/Layers/CALayer+setupLayerHierarchy.swift +167 -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 +64 -0
- package/Sources/Private/CoreAnimation/Layers/MaskCompositionLayer.swift +138 -0
- package/Sources/Private/CoreAnimation/Layers/PreCompLayer.swift +140 -0
- package/Sources/Private/CoreAnimation/Layers/RepeaterLayer.swift +85 -0
- package/Sources/Private/CoreAnimation/Layers/ShapeItemLayer.swift +315 -0
- package/Sources/Private/CoreAnimation/Layers/ShapeLayer.swift +390 -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 +94 -86
- 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 +59 -43
- 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} +149 -106
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/Utility/InvertedMatteLayer.swift +26 -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 +9 -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/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 +247 -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 +57 -42
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/RenderNodes/GradientStrokeNode.swift +66 -58
- package/Sources/Private/MainThread/NodeRenderSystem/Nodes/RenderNodes/StrokeNode.swift +169 -0
- 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 +222 -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 +74 -0
- package/Sources/Private/Model/ShapeItems/Fill.swift +74 -0
- package/Sources/Private/Model/ShapeItems/GradientFill.swift +137 -0
- package/Sources/Private/Model/ShapeItems/GradientStroke.swift +185 -0
- package/Sources/Private/Model/ShapeItems/Group.swift +48 -0
- package/{lottie-swift/src → Sources}/Private/Model/ShapeItems/Merge.swift +29 -12
- package/Sources/Private/Model/ShapeItems/Rectangle.swift +72 -0
- package/Sources/Private/Model/ShapeItems/Repeater.swift +135 -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 +135 -0
- package/Sources/Private/Model/ShapeItems/Star.swift +131 -0
- package/Sources/Private/Model/ShapeItems/Stroke.swift +101 -0
- package/Sources/Private/Model/ShapeItems/Trim.swift +77 -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/Private/NodeRenderSystem/NodeProperties/ValueProviders → Sources/Private/Utility/Interpolatable}/KeyframeInterpolator.swift +125 -108
- 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 +103 -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 +214 -0
- package/Tests/Samples/9squares_AlBoardman.json +1 -0
- package/Tests/Samples/Boat_Loader.json +1 -0
- package/Tests/Samples/HamburgerArrow.json +1 -0
- package/Tests/Samples/IconTransitions.json +1 -0
- package/Tests/Samples/Images/dog.png +0 -0
- package/Tests/Samples/Issues/issue_1125.json +1 -0
- package/Tests/Samples/Issues/issue_1260.json +1 -0
- package/Tests/Samples/Issues/issue_1403.json +1 -0
- package/Tests/Samples/Issues/issue_1407.json +1 -0
- package/Tests/Samples/Issues/issue_1460.json +1 -0
- package/Tests/Samples/Issues/issue_1488.json +1 -0
- package/Tests/Samples/Issues/issue_1505.json +1 -0
- package/Tests/Samples/Issues/issue_1541.json +1 -0
- package/Tests/Samples/Issues/issue_1557.json +1 -0
- package/Tests/Samples/Issues/issue_1603.json +1 -0
- package/Tests/Samples/Issues/issue_1628.json +1 -0
- package/Tests/Samples/Issues/issue_1636.json +1 -0
- package/Tests/Samples/Issues/issue_1643.json +1 -0
- package/Tests/Samples/Issues/issue_1655.json +1 -0
- package/Tests/Samples/Issues/issue_1664.json +1 -0
- package/Tests/Samples/Issues/issue_1683.json +1 -0
- package/Tests/Samples/Issues/issue_1687.json +1 -0
- package/Tests/Samples/Issues/issue_1711.json +1 -0
- package/Tests/Samples/Issues/issue_1717.json +1 -0
- package/Tests/Samples/Issues/issue_769.json +1 -0
- package/Tests/Samples/Issues/issue_885.json +1 -0
- package/Tests/Samples/Issues/issue_965.json +1 -0
- package/Tests/Samples/Issues/pr_1536.json +1 -0
- package/Tests/Samples/Issues/pr_1563.json +8439 -0
- package/Tests/Samples/Issues/pr_1592.json +5527 -0
- package/Tests/Samples/Issues/pr_1599.json +738 -0
- package/Tests/Samples/Issues/pr_1604_1.json +1 -0
- package/Tests/Samples/Issues/pr_1604_2.json +1 -0
- package/Tests/Samples/Issues/pr_1632_1.json +1 -0
- package/Tests/Samples/Issues/pr_1632_2.json +1 -0
- package/Tests/Samples/Issues/pr_1686.json +513 -0
- package/Tests/Samples/Issues/pr_1698.json +1 -0
- package/Tests/Samples/Issues/pr_1699.json +1 -0
- package/Tests/Samples/LottieFiles/LICENSE.md +14 -0
- package/Tests/Samples/LottieFiles/bounce_strokes.json +1 -0
- package/Tests/Samples/LottieFiles/cactus.json +1 -0
- package/Tests/Samples/LottieFiles/dog_car_ride.json +1 -0
- package/Tests/Samples/LottieFiles/draft_icon.json +1 -0
- package/Tests/Samples/LottieFiles/fireworks.json +1 -0
- package/Tests/Samples/LottieFiles/gradient_1.json +1 -0
- package/Tests/Samples/LottieFiles/gradient_2.json +1 -0
- package/Tests/Samples/LottieFiles/gradient_pill.json +1 -0
- package/Tests/Samples/LottieFiles/gradient_shapes.json +1 -0
- package/Tests/Samples/LottieFiles/gradient_square.json +1 -0
- package/Tests/Samples/LottieFiles/growth.json +1 -0
- package/Tests/Samples/LottieFiles/infinity_loader.json +1 -0
- package/Tests/Samples/LottieFiles/loading_dots_1.json +1 -0
- package/Tests/Samples/LottieFiles/loading_dots_2.json +1 -0
- package/Tests/Samples/LottieFiles/loading_dots_3.json +1 -0
- package/Tests/Samples/LottieFiles/loading_gradient_strokes.json +1 -0
- package/Tests/Samples/LottieFiles/settings_slider.json +1 -0
- package/Tests/Samples/LottieFiles/shop.json +1 -0
- package/Tests/Samples/LottieFiles/step_loader.json +1 -0
- package/Tests/Samples/LottieLogo1.json +1 -0
- package/Tests/Samples/LottieLogo1_masked.json +1 -0
- package/Tests/Samples/LottieLogo2.json +1 -0
- package/Tests/Samples/MotionCorpse_Jrcanest.json +1 -0
- package/Tests/Samples/Nonanimating/BasicLayers.json +1 -0
- package/Tests/Samples/Nonanimating/DisableNodesTest.json +1 -0
- package/Tests/Samples/Nonanimating/FirstText.json +1 -0
- package/Tests/Samples/Nonanimating/GeometryTransformTest.json +1 -0
- package/Tests/Samples/Nonanimating/Text_AnimatedProperties.json +1 -0
- package/Tests/Samples/Nonanimating/Text_Glyph.json +1 -0
- package/Tests/Samples/Nonanimating/Text_NoAnimation.json +1 -0
- package/Tests/Samples/Nonanimating/Text_NoGlyph.json +1 -0
- package/Tests/Samples/Nonanimating/Zoom.json +1 -0
- package/Tests/Samples/Nonanimating/_dog.json +1 -0
- package/Tests/Samples/Nonanimating/base64Test.json +1 -0
- package/Tests/Samples/Nonanimating/blend_mode_test.json +1 -0
- package/Tests/Samples/Nonanimating/keypathTest.json +1 -0
- package/Tests/Samples/Nonanimating/verifyLineHeight.json +1 -0
- package/Tests/Samples/PinJump.json +1 -0
- package/Tests/Samples/Switch.json +1 -0
- package/Tests/Samples/Switch_States.json +1 -0
- package/Tests/Samples/TwitterHeart.json +1 -0
- package/Tests/Samples/TwitterHeartButton.json +1 -0
- package/Tests/Samples/TypeFace/A.json +1 -0
- package/Tests/Samples/TypeFace/Apostrophe.json +1 -0
- package/Tests/Samples/TypeFace/B.json +1 -0
- package/Tests/Samples/TypeFace/BlinkingCursor.json +1 -0
- package/Tests/Samples/TypeFace/C.json +1 -0
- package/Tests/Samples/TypeFace/Colon.json +1 -0
- package/Tests/Samples/TypeFace/Comma.json +1 -0
- package/Tests/Samples/TypeFace/D.json +1 -0
- package/Tests/Samples/TypeFace/E.json +1 -0
- package/Tests/Samples/TypeFace/F.json +1 -0
- package/Tests/Samples/TypeFace/G.json +1 -0
- package/Tests/Samples/TypeFace/H.json +1 -0
- package/Tests/Samples/TypeFace/I.json +1 -0
- package/Tests/Samples/TypeFace/J.json +1 -0
- package/Tests/Samples/TypeFace/K.json +1 -0
- package/Tests/Samples/TypeFace/L.json +1 -0
- package/Tests/Samples/TypeFace/M.json +1 -0
- package/Tests/Samples/TypeFace/N.json +1 -0
- package/Tests/Samples/TypeFace/O.json +1 -0
- package/Tests/Samples/TypeFace/P.json +1 -0
- package/Tests/Samples/TypeFace/Q.json +1 -0
- package/Tests/Samples/TypeFace/R.json +1 -0
- package/Tests/Samples/TypeFace/S.json +1 -0
- package/Tests/Samples/TypeFace/T.json +1 -0
- package/Tests/Samples/TypeFace/U.json +1 -0
- package/Tests/Samples/TypeFace/V.json +1 -0
- package/Tests/Samples/TypeFace/W.json +1 -0
- package/Tests/Samples/TypeFace/X.json +1 -0
- package/Tests/Samples/TypeFace/Y.json +1 -0
- package/Tests/Samples/TypeFace/Z.json +1 -0
- package/Tests/Samples/Watermelon.json +1 -0
- package/Tests/Samples/setValueTest.json +1 -0
- package/Tests/Samples/timeremap.json +1 -0
- package/Tests/Samples/vcTransition1.json +1 -0
- package/Tests/Samples/vcTransition2.json +1 -0
- package/Tests/SnapshotConfiguration.swift +158 -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 +12 -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/NodeRenderSystem/Nodes/RenderNodes/StrokeNode.swift +0 -127
- package/lottie-swift/src/Private/Utility/Extensions/MathKit.swift +0 -539
- package/lottie-swift/src/Private/Utility/Extensions/StringExtensions.swift +0 -32
- package/lottie-swift/src/Private/Utility/Interpolatable/Interpolatable.swift +0 -18
- package/lottie-swift/src/Private/Utility/Interpolatable/InterpolatableExtensions.swift +0 -170
- package/lottie-swift/src/Private/Utility/Primitives/CurveVertex.swift +0 -177
- package/lottie-swift/src/Private/Utility/Primitives/PathElement.swift +0 -68
- package/lottie-swift/src/Private/Utility/Primitives/VectorsExtensions.swift +0 -218
- package/lottie-swift/src/Public/Animation/AnimationPublic.swift +0 -196
- package/lottie-swift/src/Public/Animation/AnimationView.swift +0 -1006
- package/lottie-swift/src/Public/Animation/AnimationViewInitializers.swift +0 -83
- package/lottie-swift/src/Public/AnimationCache/AnimationCacheProvider.swift +0 -24
- package/lottie-swift/src/Public/DynamicProperties/AnimationKeypath.swift +0 -46
- package/lottie-swift/src/Public/DynamicProperties/AnyValueProvider.swift +0 -29
- package/lottie-swift/src/Public/DynamicProperties/ValueProviders/GradientValueProvider.swift +0 -114
- package/lottie-swift/src/Public/ImageProvider/AnimationImageProvider.swift +0 -23
- package/lottie-swift/src/Public/MacOS/FilepathImageProvider.swift +0 -67
- package/lottie-swift/src/Public/TextProvider/AnimationTextProvider.swift +0 -39
- package/lottie-swift/src/Public/iOS/LottieView.swift +0 -62
- package/lottie-swift-testing.podspec +0 -32
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Layer.swift
|
|
3
|
+
// lottie-swift
|
|
4
|
+
//
|
|
5
|
+
// Created by Brandon Withrow on 1/7/19.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
import Foundation
|
|
9
|
+
|
|
10
|
+
// MARK: - LayerType + ClassFamily
|
|
11
|
+
|
|
12
|
+
/// Used for mapping a heterogeneous list to classes for parsing.
|
|
13
|
+
extension LayerType: ClassFamily {
|
|
14
|
+
static var discriminator: Discriminator = .type
|
|
15
|
+
|
|
16
|
+
func getType() -> AnyObject.Type {
|
|
17
|
+
switch self {
|
|
18
|
+
case .precomp:
|
|
19
|
+
return PreCompLayerModel.self
|
|
20
|
+
case .solid:
|
|
21
|
+
return SolidLayerModel.self
|
|
22
|
+
case .image:
|
|
23
|
+
return ImageLayerModel.self
|
|
24
|
+
case .null:
|
|
25
|
+
return LayerModel.self
|
|
26
|
+
case .shape:
|
|
27
|
+
return ShapeLayerModel.self
|
|
28
|
+
case .text:
|
|
29
|
+
return TextLayerModel.self
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// MARK: - LayerType
|
|
35
|
+
|
|
36
|
+
public enum LayerType: Int, Codable {
|
|
37
|
+
case precomp
|
|
38
|
+
case solid
|
|
39
|
+
case image
|
|
40
|
+
case null
|
|
41
|
+
case shape
|
|
42
|
+
case text
|
|
43
|
+
|
|
44
|
+
public init(from decoder: Decoder) throws {
|
|
45
|
+
self = try LayerType(rawValue: decoder.singleValueContainer().decode(RawValue.self)) ?? .null
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// MARK: - MatteType
|
|
50
|
+
|
|
51
|
+
public enum MatteType: Int, Codable {
|
|
52
|
+
case none
|
|
53
|
+
case add
|
|
54
|
+
case invert
|
|
55
|
+
case unknown
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// MARK: - BlendMode
|
|
59
|
+
|
|
60
|
+
public enum BlendMode: Int, Codable {
|
|
61
|
+
case normal
|
|
62
|
+
case multiply
|
|
63
|
+
case screen
|
|
64
|
+
case overlay
|
|
65
|
+
case darken
|
|
66
|
+
case lighten
|
|
67
|
+
case colorDodge
|
|
68
|
+
case colorBurn
|
|
69
|
+
case hardLight
|
|
70
|
+
case softLight
|
|
71
|
+
case difference
|
|
72
|
+
case exclusion
|
|
73
|
+
case hue
|
|
74
|
+
case saturation
|
|
75
|
+
case color
|
|
76
|
+
case luminosity
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// MARK: - LayerModel
|
|
80
|
+
|
|
81
|
+
/// A base top container for shapes, images, and other view objects.
|
|
82
|
+
class LayerModel: Codable, DictionaryInitializable {
|
|
83
|
+
|
|
84
|
+
// MARK: Lifecycle
|
|
85
|
+
|
|
86
|
+
required init(from decoder: Decoder) throws {
|
|
87
|
+
let container = try decoder.container(keyedBy: LayerModel.CodingKeys.self)
|
|
88
|
+
name = try container.decodeIfPresent(String.self, forKey: .name) ?? "Layer"
|
|
89
|
+
index = try container.decodeIfPresent(Int.self, forKey: .index) ?? .random(in: Int.min...Int.max)
|
|
90
|
+
type = try container.decode(LayerType.self, forKey: .type)
|
|
91
|
+
coordinateSpace = try container.decodeIfPresent(CoordinateSpace.self, forKey: .coordinateSpace) ?? .type2d
|
|
92
|
+
inFrame = try container.decode(Double.self, forKey: .inFrame)
|
|
93
|
+
outFrame = try container.decode(Double.self, forKey: .outFrame)
|
|
94
|
+
startTime = try container.decode(Double.self, forKey: .startTime)
|
|
95
|
+
transform = try container.decode(Transform.self, forKey: .transform)
|
|
96
|
+
parent = try container.decodeIfPresent(Int.self, forKey: .parent)
|
|
97
|
+
blendMode = try container.decodeIfPresent(BlendMode.self, forKey: .blendMode) ?? .normal
|
|
98
|
+
masks = try container.decodeIfPresent([Mask].self, forKey: .masks)
|
|
99
|
+
timeStretch = try container.decodeIfPresent(Double.self, forKey: .timeStretch) ?? 1
|
|
100
|
+
matte = try container.decodeIfPresent(MatteType.self, forKey: .matte)
|
|
101
|
+
hidden = try container.decodeIfPresent(Bool.self, forKey: .hidden) ?? false
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
required init(dictionary: [String: Any]) throws {
|
|
105
|
+
name = (try? dictionary.value(for: CodingKeys.name)) ?? "Layer"
|
|
106
|
+
index = try dictionary.value(for: CodingKeys.index) ?? .random(in: Int.min...Int.max)
|
|
107
|
+
type = LayerType(rawValue: try dictionary.value(for: CodingKeys.type)) ?? .null
|
|
108
|
+
if
|
|
109
|
+
let coordinateSpaceRawValue = dictionary[CodingKeys.coordinateSpace.rawValue] as? Int,
|
|
110
|
+
let coordinateSpace = CoordinateSpace(rawValue: coordinateSpaceRawValue)
|
|
111
|
+
{
|
|
112
|
+
self.coordinateSpace = coordinateSpace
|
|
113
|
+
} else {
|
|
114
|
+
coordinateSpace = .type2d
|
|
115
|
+
}
|
|
116
|
+
inFrame = try dictionary.value(for: CodingKeys.inFrame)
|
|
117
|
+
outFrame = try dictionary.value(for: CodingKeys.outFrame)
|
|
118
|
+
startTime = try dictionary.value(for: CodingKeys.startTime)
|
|
119
|
+
transform = try Transform(dictionary: try dictionary.value(for: CodingKeys.transform))
|
|
120
|
+
parent = try? dictionary.value(for: CodingKeys.parent)
|
|
121
|
+
if
|
|
122
|
+
let blendModeRawValue = dictionary[CodingKeys.blendMode.rawValue] as? Int,
|
|
123
|
+
let blendMode = BlendMode(rawValue: blendModeRawValue)
|
|
124
|
+
{
|
|
125
|
+
self.blendMode = blendMode
|
|
126
|
+
} else {
|
|
127
|
+
blendMode = .normal
|
|
128
|
+
}
|
|
129
|
+
if let maskDictionaries = dictionary[CodingKeys.masks.rawValue] as? [[String: Any]] {
|
|
130
|
+
masks = try maskDictionaries.map({ try Mask(dictionary: $0) })
|
|
131
|
+
} else {
|
|
132
|
+
masks = nil
|
|
133
|
+
}
|
|
134
|
+
timeStretch = (try? dictionary.value(for: CodingKeys.timeStretch)) ?? 1
|
|
135
|
+
if let matteRawValue = dictionary[CodingKeys.matte.rawValue] as? Int {
|
|
136
|
+
matte = MatteType(rawValue: matteRawValue)
|
|
137
|
+
} else {
|
|
138
|
+
matte = nil
|
|
139
|
+
}
|
|
140
|
+
hidden = (try? dictionary.value(for: CodingKeys.hidden)) ?? false
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// MARK: Internal
|
|
144
|
+
|
|
145
|
+
/// The readable name of the layer
|
|
146
|
+
let name: String
|
|
147
|
+
|
|
148
|
+
/// The index of the layer
|
|
149
|
+
let index: Int
|
|
150
|
+
|
|
151
|
+
/// The type of the layer.
|
|
152
|
+
let type: LayerType
|
|
153
|
+
|
|
154
|
+
/// The coordinate space
|
|
155
|
+
let coordinateSpace: CoordinateSpace
|
|
156
|
+
|
|
157
|
+
/// The in time of the layer in frames.
|
|
158
|
+
let inFrame: Double
|
|
159
|
+
/// The out time of the layer in frames.
|
|
160
|
+
let outFrame: Double
|
|
161
|
+
|
|
162
|
+
/// The start time of the layer in frames.
|
|
163
|
+
let startTime: Double
|
|
164
|
+
|
|
165
|
+
/// The transform of the layer
|
|
166
|
+
let transform: Transform
|
|
167
|
+
|
|
168
|
+
/// The index of the parent layer, if applicable.
|
|
169
|
+
let parent: Int?
|
|
170
|
+
|
|
171
|
+
/// The blending mode for the layer
|
|
172
|
+
let blendMode: BlendMode
|
|
173
|
+
|
|
174
|
+
/// An array of masks for the layer.
|
|
175
|
+
let masks: [Mask]?
|
|
176
|
+
|
|
177
|
+
/// A number that stretches time by a multiplier
|
|
178
|
+
let timeStretch: Double
|
|
179
|
+
|
|
180
|
+
/// The type of matte if any.
|
|
181
|
+
let matte: MatteType?
|
|
182
|
+
|
|
183
|
+
let hidden: Bool
|
|
184
|
+
|
|
185
|
+
// MARK: Fileprivate
|
|
186
|
+
|
|
187
|
+
fileprivate enum CodingKeys: String, CodingKey {
|
|
188
|
+
case name = "nm"
|
|
189
|
+
case index = "ind"
|
|
190
|
+
case type = "ty"
|
|
191
|
+
case coordinateSpace = "ddd"
|
|
192
|
+
case inFrame = "ip"
|
|
193
|
+
case outFrame = "op"
|
|
194
|
+
case startTime = "st"
|
|
195
|
+
case transform = "ks"
|
|
196
|
+
case parent
|
|
197
|
+
case blendMode = "bm"
|
|
198
|
+
case masks = "masksProperties"
|
|
199
|
+
case timeStretch = "sr"
|
|
200
|
+
case matte = "tt"
|
|
201
|
+
case hidden = "hd"
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
extension Array where Element == LayerModel {
|
|
206
|
+
|
|
207
|
+
static func fromDictionaries(_ dictionaries: [[String: Any]]) throws -> [LayerModel] {
|
|
208
|
+
try dictionaries.compactMap { dictionary in
|
|
209
|
+
let layerType = dictionary[LayerModel.CodingKeys.type.rawValue] as? Int
|
|
210
|
+
switch LayerType(rawValue: layerType ?? LayerType.null.rawValue) {
|
|
211
|
+
case .precomp:
|
|
212
|
+
return try PreCompLayerModel(dictionary: dictionary)
|
|
213
|
+
case .solid:
|
|
214
|
+
return try SolidLayerModel(dictionary: dictionary)
|
|
215
|
+
case .image:
|
|
216
|
+
return try ImageLayerModel(dictionary: dictionary)
|
|
217
|
+
case .null:
|
|
218
|
+
return try LayerModel(dictionary: dictionary)
|
|
219
|
+
case .shape:
|
|
220
|
+
return try ShapeLayerModel(dictionary: dictionary)
|
|
221
|
+
case .text:
|
|
222
|
+
return try TextLayerModel(dictionary: dictionary)
|
|
223
|
+
case .none:
|
|
224
|
+
return nil
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
}
|
|
@@ -9,35 +9,44 @@ import Foundation
|
|
|
9
9
|
|
|
10
10
|
/// A layer that holds another animation composition.
|
|
11
11
|
final class PreCompLayerModel: LayerModel {
|
|
12
|
-
|
|
12
|
+
|
|
13
|
+
// MARK: Lifecycle
|
|
14
|
+
|
|
15
|
+
required init(from decoder: Decoder) throws {
|
|
16
|
+
let container = try decoder.container(keyedBy: PreCompLayerModel.CodingKeys.self)
|
|
17
|
+
referenceID = try container.decode(String.self, forKey: .referenceID)
|
|
18
|
+
timeRemapping = try container.decodeIfPresent(KeyframeGroup<Vector1D>.self, forKey: .timeRemapping)
|
|
19
|
+
width = try container.decode(Double.self, forKey: .width)
|
|
20
|
+
height = try container.decode(Double.self, forKey: .height)
|
|
21
|
+
try super.init(from: decoder)
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
required init(dictionary: [String: Any]) throws {
|
|
25
|
+
referenceID = try dictionary.value(for: CodingKeys.referenceID)
|
|
26
|
+
if let timeRemappingDictionary = dictionary[CodingKeys.timeRemapping.rawValue] as? [String: Any] {
|
|
27
|
+
timeRemapping = try KeyframeGroup<Vector1D>(dictionary: timeRemappingDictionary)
|
|
28
|
+
} else {
|
|
29
|
+
timeRemapping = nil
|
|
30
|
+
}
|
|
31
|
+
width = try dictionary.value(for: CodingKeys.width)
|
|
32
|
+
height = try dictionary.value(for: CodingKeys.height)
|
|
33
|
+
try super.init(dictionary: dictionary)
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// MARK: Internal
|
|
37
|
+
|
|
13
38
|
/// The reference ID of the precomp.
|
|
14
39
|
let referenceID: String
|
|
15
|
-
|
|
40
|
+
|
|
16
41
|
/// A value that remaps time over time.
|
|
17
42
|
let timeRemapping: KeyframeGroup<Vector1D>?
|
|
18
|
-
|
|
43
|
+
|
|
19
44
|
/// Precomp Width
|
|
20
45
|
let width: Double
|
|
21
|
-
|
|
46
|
+
|
|
22
47
|
/// Precomp Height
|
|
23
48
|
let height: Double
|
|
24
|
-
|
|
25
|
-
private enum CodingKeys : String, CodingKey {
|
|
26
|
-
case referenceID = "refId"
|
|
27
|
-
case timeRemapping = "tm"
|
|
28
|
-
case width = "w"
|
|
29
|
-
case height = "h"
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
required init(from decoder: Decoder) throws {
|
|
33
|
-
let container = try decoder.container(keyedBy: PreCompLayerModel.CodingKeys.self)
|
|
34
|
-
self.referenceID = try container.decode(String.self, forKey: .referenceID)
|
|
35
|
-
self.timeRemapping = try container.decodeIfPresent(KeyframeGroup<Vector1D>.self, forKey: .timeRemapping)
|
|
36
|
-
self.width = try container.decode(Double.self, forKey: .width)
|
|
37
|
-
self.height = try container.decode(Double.self, forKey: .height)
|
|
38
|
-
try super.init(from: decoder)
|
|
39
|
-
}
|
|
40
|
-
|
|
49
|
+
|
|
41
50
|
override func encode(to encoder: Encoder) throws {
|
|
42
51
|
try super.encode(to: encoder)
|
|
43
52
|
var container = encoder.container(keyedBy: CodingKeys.self)
|
|
@@ -46,5 +55,13 @@ final class PreCompLayerModel: LayerModel {
|
|
|
46
55
|
try container.encode(width, forKey: .width)
|
|
47
56
|
try container.encode(height, forKey: .height)
|
|
48
57
|
}
|
|
49
|
-
|
|
58
|
+
|
|
59
|
+
// MARK: Private
|
|
60
|
+
|
|
61
|
+
private enum CodingKeys: String, CodingKey {
|
|
62
|
+
case referenceID = "refId"
|
|
63
|
+
case timeRemapping = "tm"
|
|
64
|
+
case width = "w"
|
|
65
|
+
case height = "h"
|
|
66
|
+
}
|
|
50
67
|
}
|
|
@@ -9,24 +9,35 @@ import Foundation
|
|
|
9
9
|
|
|
10
10
|
/// A layer that holds vector shape objects.
|
|
11
11
|
final class ShapeLayerModel: LayerModel {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
private enum CodingKeys : String, CodingKey {
|
|
17
|
-
case items = "shapes"
|
|
18
|
-
}
|
|
19
|
-
|
|
12
|
+
|
|
13
|
+
// MARK: Lifecycle
|
|
14
|
+
|
|
20
15
|
required init(from decoder: Decoder) throws {
|
|
21
16
|
let container = try decoder.container(keyedBy: ShapeLayerModel.CodingKeys.self)
|
|
22
|
-
|
|
17
|
+
items = try container.decode([ShapeItem].self, ofFamily: ShapeType.self, forKey: .items)
|
|
23
18
|
try super.init(from: decoder)
|
|
24
19
|
}
|
|
25
|
-
|
|
20
|
+
|
|
21
|
+
required init(dictionary: [String: Any]) throws {
|
|
22
|
+
let itemDictionaries: [[String: Any]] = try dictionary.value(for: CodingKeys.items)
|
|
23
|
+
items = try [ShapeItem].fromDictionaries(itemDictionaries)
|
|
24
|
+
try super.init(dictionary: dictionary)
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// MARK: Internal
|
|
28
|
+
|
|
29
|
+
/// A list of shape items.
|
|
30
|
+
let items: [ShapeItem]
|
|
31
|
+
|
|
26
32
|
override func encode(to encoder: Encoder) throws {
|
|
27
33
|
try super.encode(to: encoder)
|
|
28
34
|
var container = encoder.container(keyedBy: CodingKeys.self)
|
|
29
|
-
try container.encode(
|
|
35
|
+
try container.encode(items, forKey: .items)
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// MARK: Private
|
|
39
|
+
|
|
40
|
+
private enum CodingKeys: String, CodingKey {
|
|
41
|
+
case items = "shapes"
|
|
30
42
|
}
|
|
31
|
-
|
|
32
43
|
}
|
|
@@ -9,30 +9,35 @@ import Foundation
|
|
|
9
9
|
|
|
10
10
|
/// A layer that holds a solid color.
|
|
11
11
|
final class SolidLayerModel: LayerModel {
|
|
12
|
-
|
|
12
|
+
|
|
13
|
+
// MARK: Lifecycle
|
|
14
|
+
|
|
15
|
+
required init(from decoder: Decoder) throws {
|
|
16
|
+
let container = try decoder.container(keyedBy: SolidLayerModel.CodingKeys.self)
|
|
17
|
+
colorHex = try container.decode(String.self, forKey: .colorHex)
|
|
18
|
+
width = try container.decode(Double.self, forKey: .width)
|
|
19
|
+
height = try container.decode(Double.self, forKey: .height)
|
|
20
|
+
try super.init(from: decoder)
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
required init(dictionary: [String: Any]) throws {
|
|
24
|
+
colorHex = try dictionary.value(for: CodingKeys.colorHex)
|
|
25
|
+
width = try dictionary.value(for: CodingKeys.width)
|
|
26
|
+
height = try dictionary.value(for: CodingKeys.height)
|
|
27
|
+
try super.init(dictionary: dictionary)
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// MARK: Internal
|
|
31
|
+
|
|
13
32
|
/// The color of the solid in Hex // Change to value provider.
|
|
14
33
|
let colorHex: String
|
|
15
|
-
|
|
34
|
+
|
|
16
35
|
/// The Width of the color layer
|
|
17
36
|
let width: Double
|
|
18
|
-
|
|
37
|
+
|
|
19
38
|
/// The height of the color layer
|
|
20
39
|
let height: Double
|
|
21
|
-
|
|
22
|
-
private enum CodingKeys : String, CodingKey {
|
|
23
|
-
case colorHex = "sc"
|
|
24
|
-
case width = "sw"
|
|
25
|
-
case height = "sh"
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
required init(from decoder: Decoder) throws {
|
|
29
|
-
let container = try decoder.container(keyedBy: SolidLayerModel.CodingKeys.self)
|
|
30
|
-
self.colorHex = try container.decode(String.self, forKey: .colorHex)
|
|
31
|
-
self.width = try container.decode(Double.self, forKey: .width)
|
|
32
|
-
self.height = try container.decode(Double.self, forKey: .height)
|
|
33
|
-
try super.init(from: decoder)
|
|
34
|
-
}
|
|
35
|
-
|
|
40
|
+
|
|
36
41
|
override func encode(to encoder: Encoder) throws {
|
|
37
42
|
try super.encode(to: encoder)
|
|
38
43
|
var container = encoder.container(keyedBy: CodingKeys.self)
|
|
@@ -40,5 +45,12 @@ final class SolidLayerModel: LayerModel {
|
|
|
40
45
|
try container.encode(width, forKey: .width)
|
|
41
46
|
try container.encode(height, forKey: .height)
|
|
42
47
|
}
|
|
43
|
-
|
|
48
|
+
|
|
49
|
+
// MARK: Private
|
|
50
|
+
|
|
51
|
+
private enum CodingKeys: String, CodingKey {
|
|
52
|
+
case colorHex = "sc"
|
|
53
|
+
case width = "sw"
|
|
54
|
+
case height = "sh"
|
|
55
|
+
}
|
|
44
56
|
}
|
|
@@ -10,29 +10,33 @@ import Foundation
|
|
|
10
10
|
/// A layer that holds text.
|
|
11
11
|
final class TextLayerModel: LayerModel {
|
|
12
12
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
/// Text animators
|
|
17
|
-
let animators: [TextAnimator]
|
|
18
|
-
|
|
19
|
-
private enum CodingKeys : String, CodingKey {
|
|
20
|
-
case textGroup = "t"
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
private enum TextCodingKeys : String, CodingKey {
|
|
24
|
-
case text = "d"
|
|
25
|
-
case animators = "a"
|
|
26
|
-
}
|
|
27
|
-
|
|
13
|
+
// MARK: Lifecycle
|
|
14
|
+
|
|
28
15
|
required init(from decoder: Decoder) throws {
|
|
29
16
|
let container = try decoder.container(keyedBy: TextLayerModel.CodingKeys.self)
|
|
30
17
|
let textContainer = try container.nestedContainer(keyedBy: TextCodingKeys.self, forKey: .textGroup)
|
|
31
|
-
|
|
32
|
-
|
|
18
|
+
text = try textContainer.decode(KeyframeGroup<TextDocument>.self, forKey: .text)
|
|
19
|
+
animators = try textContainer.decode([TextAnimator].self, forKey: .animators)
|
|
33
20
|
try super.init(from: decoder)
|
|
34
21
|
}
|
|
35
|
-
|
|
22
|
+
|
|
23
|
+
required init(dictionary: [String: Any]) throws {
|
|
24
|
+
let containerDictionary: [String: Any] = try dictionary.value(for: CodingKeys.textGroup)
|
|
25
|
+
let textDictionary: [String: Any] = try containerDictionary.value(for: TextCodingKeys.text)
|
|
26
|
+
text = try KeyframeGroup<TextDocument>(dictionary: textDictionary)
|
|
27
|
+
let animatorDictionaries: [[String: Any]] = try containerDictionary.value(for: TextCodingKeys.animators)
|
|
28
|
+
animators = try animatorDictionaries.map({ try TextAnimator(dictionary: $0) })
|
|
29
|
+
try super.init(dictionary: dictionary)
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// MARK: Internal
|
|
33
|
+
|
|
34
|
+
/// The text for the layer
|
|
35
|
+
let text: KeyframeGroup<TextDocument>
|
|
36
|
+
|
|
37
|
+
/// Text animators
|
|
38
|
+
let animators: [TextAnimator]
|
|
39
|
+
|
|
36
40
|
override func encode(to encoder: Encoder) throws {
|
|
37
41
|
try super.encode(to: encoder)
|
|
38
42
|
var container = encoder.container(keyedBy: CodingKeys.self)
|
|
@@ -40,5 +44,15 @@ final class TextLayerModel: LayerModel {
|
|
|
40
44
|
try textContainer.encode(text, forKey: .text)
|
|
41
45
|
try textContainer.encode(animators, forKey: .animators)
|
|
42
46
|
}
|
|
43
|
-
|
|
47
|
+
|
|
48
|
+
// MARK: Private
|
|
49
|
+
|
|
50
|
+
private enum CodingKeys: String, CodingKey {
|
|
51
|
+
case textGroup = "t"
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
private enum TextCodingKeys: String, CodingKey {
|
|
55
|
+
case text = "d"
|
|
56
|
+
case animators = "a"
|
|
57
|
+
}
|
|
44
58
|
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
//
|
|
2
|
+
// DashPattern.swift
|
|
3
|
+
// lottie-swift
|
|
4
|
+
//
|
|
5
|
+
// Created by Brandon Withrow on 1/22/19.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
import Foundation
|
|
9
|
+
|
|
10
|
+
// MARK: - DashElementType
|
|
11
|
+
|
|
12
|
+
enum DashElementType: String, Codable {
|
|
13
|
+
case offset = "o"
|
|
14
|
+
case dash = "d"
|
|
15
|
+
case gap = "g"
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
// MARK: - DashElement
|
|
19
|
+
|
|
20
|
+
final class DashElement: Codable, DictionaryInitializable {
|
|
21
|
+
|
|
22
|
+
// MARK: Lifecycle
|
|
23
|
+
|
|
24
|
+
init(dictionary: [String: Any]) throws {
|
|
25
|
+
let typeRawValue: String = try dictionary.value(for: CodingKeys.type)
|
|
26
|
+
guard let type = DashElementType(rawValue: typeRawValue) else {
|
|
27
|
+
throw InitializableError.invalidInput
|
|
28
|
+
}
|
|
29
|
+
self.type = type
|
|
30
|
+
let valueDictionary: [String: Any] = try dictionary.value(for: CodingKeys.value)
|
|
31
|
+
value = try KeyframeGroup<Vector1D>(dictionary: valueDictionary)
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// MARK: Internal
|
|
35
|
+
|
|
36
|
+
enum CodingKeys: String, CodingKey {
|
|
37
|
+
case type = "n"
|
|
38
|
+
case value = "v"
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
let type: DashElementType
|
|
42
|
+
let value: KeyframeGroup<Vector1D>
|
|
43
|
+
|
|
44
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Marker.swift
|
|
3
|
+
// lottie-swift
|
|
4
|
+
//
|
|
5
|
+
// Created by Brandon Withrow on 1/9/19.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
import Foundation
|
|
9
|
+
|
|
10
|
+
/// A time marker
|
|
11
|
+
final class Marker: Codable, DictionaryInitializable {
|
|
12
|
+
|
|
13
|
+
// MARK: Lifecycle
|
|
14
|
+
|
|
15
|
+
init(dictionary: [String: Any]) throws {
|
|
16
|
+
name = try dictionary.value(for: CodingKeys.name)
|
|
17
|
+
frameTime = try dictionary.value(for: CodingKeys.frameTime)
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
// MARK: Internal
|
|
21
|
+
|
|
22
|
+
enum CodingKeys: String, CodingKey {
|
|
23
|
+
case name = "cm"
|
|
24
|
+
case frameTime = "tm"
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/// The Marker Name
|
|
28
|
+
let name: String
|
|
29
|
+
|
|
30
|
+
/// The Frame time of the marker
|
|
31
|
+
let frameTime: AnimationFrameTime
|
|
32
|
+
|
|
33
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Mask.swift
|
|
3
|
+
// lottie-swift
|
|
4
|
+
//
|
|
5
|
+
// Created by Brandon Withrow on 1/8/19.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
import Foundation
|
|
9
|
+
|
|
10
|
+
// MARK: - MaskMode
|
|
11
|
+
|
|
12
|
+
enum MaskMode: String, Codable {
|
|
13
|
+
case add = "a"
|
|
14
|
+
case subtract = "s"
|
|
15
|
+
case intersect = "i"
|
|
16
|
+
case lighten = "l"
|
|
17
|
+
case darken = "d"
|
|
18
|
+
case difference = "f"
|
|
19
|
+
case none = "n"
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
// MARK: - Mask
|
|
23
|
+
|
|
24
|
+
final class Mask: Codable, DictionaryInitializable {
|
|
25
|
+
|
|
26
|
+
// MARK: Lifecycle
|
|
27
|
+
|
|
28
|
+
required init(from decoder: Decoder) throws {
|
|
29
|
+
let container = try decoder.container(keyedBy: Mask.CodingKeys.self)
|
|
30
|
+
mode = try container.decodeIfPresent(MaskMode.self, forKey: .mode) ?? .add
|
|
31
|
+
opacity = try container.decodeIfPresent(KeyframeGroup<Vector1D>.self, forKey: .opacity) ?? KeyframeGroup(Vector1D(100))
|
|
32
|
+
shape = try container.decode(KeyframeGroup<BezierPath>.self, forKey: .shape)
|
|
33
|
+
inverted = try container.decodeIfPresent(Bool.self, forKey: .inverted) ?? false
|
|
34
|
+
expansion = try container.decodeIfPresent(KeyframeGroup<Vector1D>.self, forKey: .expansion) ?? KeyframeGroup(Vector1D(0))
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
init(dictionary: [String: Any]) throws {
|
|
38
|
+
if
|
|
39
|
+
let modeRawType = dictionary[CodingKeys.mode.rawValue] as? String,
|
|
40
|
+
let mode = MaskMode(rawValue: modeRawType)
|
|
41
|
+
{
|
|
42
|
+
self.mode = mode
|
|
43
|
+
} else {
|
|
44
|
+
mode = .add
|
|
45
|
+
}
|
|
46
|
+
if let opacityDictionary = dictionary[CodingKeys.opacity.rawValue] as? [String: Any] {
|
|
47
|
+
opacity = try KeyframeGroup<Vector1D>(dictionary: opacityDictionary)
|
|
48
|
+
} else {
|
|
49
|
+
opacity = KeyframeGroup(Vector1D(100))
|
|
50
|
+
}
|
|
51
|
+
let shapeDictionary: [String: Any] = try dictionary.value(for: CodingKeys.shape)
|
|
52
|
+
shape = try KeyframeGroup<BezierPath>(dictionary: shapeDictionary)
|
|
53
|
+
inverted = (try? dictionary.value(for: CodingKeys.inverted)) ?? false
|
|
54
|
+
if let expansionDictionary = dictionary[CodingKeys.expansion.rawValue] as? [String: Any] {
|
|
55
|
+
expansion = try KeyframeGroup<Vector1D>(dictionary: expansionDictionary)
|
|
56
|
+
} else {
|
|
57
|
+
expansion = KeyframeGroup(Vector1D(0))
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// MARK: Internal
|
|
62
|
+
|
|
63
|
+
enum CodingKeys: String, CodingKey {
|
|
64
|
+
case mode
|
|
65
|
+
case opacity = "o"
|
|
66
|
+
case inverted = "inv"
|
|
67
|
+
case shape = "pt"
|
|
68
|
+
case expansion = "x"
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
let mode: MaskMode
|
|
72
|
+
|
|
73
|
+
let opacity: KeyframeGroup<Vector1D>
|
|
74
|
+
|
|
75
|
+
let shape: KeyframeGroup<BezierPath>
|
|
76
|
+
|
|
77
|
+
let inverted: Bool
|
|
78
|
+
|
|
79
|
+
let expansion: KeyframeGroup<Vector1D>
|
|
80
|
+
}
|