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
|
@@ -5,60 +5,63 @@
|
|
|
5
5
|
// Created by Brandon Withrow on 2/4/19.
|
|
6
6
|
//
|
|
7
7
|
|
|
8
|
-
import Foundation
|
|
9
8
|
import CoreGraphics
|
|
9
|
+
import Foundation
|
|
10
10
|
import QuartzCore
|
|
11
11
|
|
|
12
|
+
// MARK: - LayerTransformProperties
|
|
13
|
+
|
|
12
14
|
final class LayerTransformProperties: NodePropertyMap, KeypathSearchable {
|
|
13
|
-
|
|
15
|
+
|
|
16
|
+
// MARK: Lifecycle
|
|
17
|
+
|
|
14
18
|
init(transform: Transform) {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
19
|
+
anchor = NodeProperty(provider: KeyframeInterpolator(keyframes: transform.anchorPoint.keyframes))
|
|
20
|
+
scale = NodeProperty(provider: KeyframeInterpolator(keyframes: transform.scale.keyframes))
|
|
21
|
+
rotation = NodeProperty(provider: KeyframeInterpolator(keyframes: transform.rotation.keyframes))
|
|
22
|
+
opacity = NodeProperty(provider: KeyframeInterpolator(keyframes: transform.opacity.keyframes))
|
|
23
|
+
|
|
21
24
|
var propertyMap: [String: AnyNodeProperty] = [
|
|
22
25
|
"Anchor Point" : anchor,
|
|
23
26
|
"Scale" : scale,
|
|
24
27
|
"Rotation" : rotation,
|
|
25
|
-
"Opacity" : opacity
|
|
28
|
+
"Opacity" : opacity,
|
|
26
29
|
]
|
|
27
|
-
|
|
28
|
-
if
|
|
29
|
-
let
|
|
30
|
+
|
|
31
|
+
if
|
|
32
|
+
let positionKeyframesX = transform.positionX?.keyframes,
|
|
33
|
+
let positionKeyframesY = transform.positionY?.keyframes
|
|
34
|
+
{
|
|
30
35
|
let xPosition: NodeProperty<Vector1D> = NodeProperty(provider: KeyframeInterpolator(keyframes: positionKeyframesX))
|
|
31
36
|
let yPosition: NodeProperty<Vector1D> = NodeProperty(provider: KeyframeInterpolator(keyframes: positionKeyframesY))
|
|
32
37
|
propertyMap["X Position"] = xPosition
|
|
33
38
|
propertyMap["Y Position"] = yPosition
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
39
|
+
positionX = xPosition
|
|
40
|
+
positionY = yPosition
|
|
41
|
+
position = nil
|
|
37
42
|
} else if let positionKeyframes = transform.position?.keyframes {
|
|
38
43
|
let position: NodeProperty<Vector3D> = NodeProperty(provider: KeyframeInterpolator(keyframes: positionKeyframes))
|
|
39
44
|
propertyMap["Position"] = position
|
|
40
45
|
self.position = position
|
|
41
|
-
|
|
42
|
-
|
|
46
|
+
positionX = nil
|
|
47
|
+
positionY = nil
|
|
43
48
|
} else {
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
49
|
+
position = nil
|
|
50
|
+
positionY = nil
|
|
51
|
+
positionX = nil
|
|
47
52
|
}
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
let keypathProperties: [String : AnyNodeProperty]
|
|
54
|
-
var keypathName: String = "Transform"
|
|
55
|
-
|
|
56
|
-
var childKeypaths: [KeypathSearchable] {
|
|
57
|
-
return []
|
|
53
|
+
|
|
54
|
+
keypathProperties = propertyMap
|
|
55
|
+
properties = Array(propertyMap.values)
|
|
58
56
|
}
|
|
59
|
-
|
|
57
|
+
|
|
58
|
+
// MARK: Internal
|
|
59
|
+
|
|
60
|
+
let keypathProperties: [String: AnyNodeProperty]
|
|
61
|
+
var keypathName = "Transform"
|
|
62
|
+
|
|
60
63
|
let properties: [AnyNodeProperty]
|
|
61
|
-
|
|
64
|
+
|
|
62
65
|
let anchor: NodeProperty<Vector3D>
|
|
63
66
|
let scale: NodeProperty<Vector3D>
|
|
64
67
|
let rotation: NodeProperty<Vector1D>
|
|
@@ -66,63 +69,75 @@ final class LayerTransformProperties: NodePropertyMap, KeypathSearchable {
|
|
|
66
69
|
let positionX: NodeProperty<Vector1D>?
|
|
67
70
|
let positionY: NodeProperty<Vector1D>?
|
|
68
71
|
let opacity: NodeProperty<Vector1D>
|
|
69
|
-
|
|
72
|
+
|
|
73
|
+
var childKeypaths: [KeypathSearchable] {
|
|
74
|
+
[]
|
|
75
|
+
}
|
|
70
76
|
}
|
|
71
77
|
|
|
78
|
+
// MARK: - LayerTransformNode
|
|
79
|
+
|
|
72
80
|
class LayerTransformNode: AnimatorNode {
|
|
73
|
-
|
|
74
|
-
|
|
81
|
+
|
|
82
|
+
// MARK: Lifecycle
|
|
83
|
+
|
|
75
84
|
init(transform: Transform) {
|
|
76
|
-
|
|
85
|
+
transformProperties = LayerTransformProperties(transform: transform)
|
|
77
86
|
}
|
|
78
|
-
|
|
87
|
+
|
|
88
|
+
// MARK: Internal
|
|
89
|
+
|
|
90
|
+
let outputNode: NodeOutput = PassThroughOutputNode(parent: nil)
|
|
91
|
+
|
|
79
92
|
let transformProperties: LayerTransformProperties
|
|
80
|
-
|
|
93
|
+
|
|
94
|
+
var parentNode: AnimatorNode?
|
|
95
|
+
var hasLocalUpdates = false
|
|
96
|
+
var hasUpstreamUpdates = false
|
|
97
|
+
var lastUpdateFrame: CGFloat? = nil
|
|
98
|
+
var isEnabled = true
|
|
99
|
+
|
|
100
|
+
var opacity: Float = 1
|
|
101
|
+
var localTransform: CATransform3D = CATransform3DIdentity
|
|
102
|
+
var globalTransform: CATransform3D = CATransform3DIdentity
|
|
103
|
+
|
|
81
104
|
// MARK: Animator Node Protocol
|
|
82
|
-
|
|
105
|
+
|
|
83
106
|
var propertyMap: NodePropertyMap & KeypathSearchable {
|
|
84
|
-
|
|
107
|
+
transformProperties
|
|
85
108
|
}
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
var hasUpstreamUpdates: Bool = false
|
|
90
|
-
var lastUpdateFrame: CGFloat? = nil
|
|
91
|
-
var isEnabled: Bool = true
|
|
92
|
-
|
|
93
|
-
func shouldRebuildOutputs(frame: CGFloat) -> Bool {
|
|
94
|
-
return hasLocalUpdates || hasUpstreamUpdates
|
|
109
|
+
|
|
110
|
+
func shouldRebuildOutputs(frame _: CGFloat) -> Bool {
|
|
111
|
+
hasLocalUpdates || hasUpstreamUpdates
|
|
95
112
|
}
|
|
96
|
-
|
|
97
|
-
func rebuildOutputs(frame: CGFloat) {
|
|
113
|
+
|
|
114
|
+
func rebuildOutputs(frame _: CGFloat) {
|
|
98
115
|
opacity = Float(transformProperties.opacity.value.cgFloatValue) * 0.01
|
|
99
|
-
|
|
116
|
+
|
|
100
117
|
let position: CGPoint
|
|
101
118
|
if let point = transformProperties.position?.value.pointValue {
|
|
102
119
|
position = point
|
|
103
|
-
} else if
|
|
104
|
-
let
|
|
120
|
+
} else if
|
|
121
|
+
let xPos = transformProperties.positionX?.value.cgFloatValue,
|
|
122
|
+
let yPos = transformProperties.positionY?.value.cgFloatValue
|
|
123
|
+
{
|
|
105
124
|
position = CGPoint(x: xPos, y: yPos)
|
|
106
125
|
} else {
|
|
107
126
|
position = .zero
|
|
108
127
|
}
|
|
109
|
-
|
|
110
|
-
localTransform = CATransform3D.makeTransform(
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
128
|
+
|
|
129
|
+
localTransform = CATransform3D.makeTransform(
|
|
130
|
+
anchor: transformProperties.anchor.value.pointValue,
|
|
131
|
+
position: position,
|
|
132
|
+
scale: transformProperties.scale.value.sizeValue,
|
|
133
|
+
rotation: transformProperties.rotation.value.cgFloatValue,
|
|
134
|
+
skew: nil,
|
|
135
|
+
skewAxis: nil)
|
|
136
|
+
|
|
117
137
|
if let parentNode = parentNode as? LayerTransformNode {
|
|
118
138
|
globalTransform = CATransform3DConcat(localTransform, parentNode.globalTransform)
|
|
119
139
|
} else {
|
|
120
140
|
globalTransform = localTransform
|
|
121
141
|
}
|
|
122
142
|
}
|
|
123
|
-
|
|
124
|
-
var opacity: Float = 1
|
|
125
|
-
var localTransform: CATransform3D = CATransform3DIdentity
|
|
126
|
-
var globalTransform: CATransform3D = CATransform3DIdentity
|
|
127
|
-
|
|
128
143
|
}
|
|
@@ -7,6 +7,8 @@
|
|
|
7
7
|
|
|
8
8
|
import Foundation
|
|
9
9
|
|
|
10
|
+
// MARK: - NodeTree
|
|
11
|
+
|
|
10
12
|
final class NodeTree {
|
|
11
13
|
var rootNode: AnimatorNode? = nil
|
|
12
14
|
var transform: ShapeTransform? = nil
|
|
@@ -17,7 +19,6 @@ final class NodeTree {
|
|
|
17
19
|
|
|
18
20
|
extension Array where Element == ShapeItem {
|
|
19
21
|
func initializeNodeTree() -> NodeTree {
|
|
20
|
-
|
|
21
22
|
let nodeTree = NodeTree()
|
|
22
23
|
|
|
23
24
|
for item in self {
|
|
@@ -71,7 +72,6 @@ extension Array where Element == ShapeItem {
|
|
|
71
72
|
nodeTree.transform = xform
|
|
72
73
|
continue
|
|
73
74
|
} else if let group = item as? Group {
|
|
74
|
-
|
|
75
75
|
let tree = group.items.initializeNodeTree()
|
|
76
76
|
let node = GroupNode(name: group.name, parentNode: nodeTree.rootNode, tree: tree)
|
|
77
77
|
nodeTree.rootNode = node
|
|
@@ -79,13 +79,18 @@ extension Array where Element == ShapeItem {
|
|
|
79
79
|
/// Now add all child paths to current tree
|
|
80
80
|
nodeTree.paths.append(contentsOf: tree.paths)
|
|
81
81
|
nodeTree.renderContainers.append(node.container)
|
|
82
|
+
} else if item is Repeater {
|
|
83
|
+
LottieLogger.shared.assertionFailure("""
|
|
84
|
+
The Main Thread rendering engine doesn't currently support repeaters.
|
|
85
|
+
To play an animation with repeaters, you can use the Core Animation rendering engine instead.
|
|
86
|
+
""")
|
|
82
87
|
}
|
|
83
|
-
|
|
88
|
+
|
|
84
89
|
if let pathNode = nodeTree.rootNode as? PathNode {
|
|
85
90
|
//// Add path container to the node tree
|
|
86
91
|
nodeTree.paths.append(pathNode.pathOutput)
|
|
87
92
|
}
|
|
88
|
-
|
|
93
|
+
|
|
89
94
|
if let renderNode = nodeTree.rootNode as? RenderNode {
|
|
90
95
|
nodeTree.renderContainers.append(ShapeRenderLayer(renderer: renderNode.renderer))
|
|
91
96
|
}
|
|
@@ -5,43 +5,51 @@
|
|
|
5
5
|
// Created by Brandon Withrow on 1/30/19.
|
|
6
6
|
//
|
|
7
7
|
|
|
8
|
-
import Foundation
|
|
9
8
|
import CoreGraphics
|
|
9
|
+
import Foundation
|
|
10
10
|
|
|
11
11
|
/// A node property that holds a reference to a T ValueProvider and a T ValueContainer.
|
|
12
12
|
class NodeProperty<T>: AnyNodeProperty {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
13
|
+
|
|
14
|
+
// MARK: Lifecycle
|
|
15
|
+
|
|
16
|
+
init(provider: AnyValueProvider) {
|
|
17
|
+
valueProvider = provider
|
|
18
|
+
originalValueProvider = valueProvider
|
|
19
|
+
typedContainer = ValueContainer<T>(provider.value(frame: 0) as! T)
|
|
20
|
+
typedContainer.setNeedsUpdate()
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// MARK: Internal
|
|
24
|
+
|
|
25
|
+
var valueProvider: AnyValueProvider
|
|
26
|
+
var originalValueProvider: AnyValueProvider
|
|
27
|
+
|
|
28
|
+
var valueType: Any.Type { T.self }
|
|
29
|
+
|
|
16
30
|
var value: T {
|
|
17
|
-
|
|
31
|
+
typedContainer.outputValue
|
|
18
32
|
}
|
|
19
|
-
|
|
33
|
+
|
|
20
34
|
var valueContainer: AnyValueContainer {
|
|
21
|
-
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
var valueProvider: AnyValueProvider
|
|
25
|
-
|
|
26
|
-
init(provider: AnyValueProvider) {
|
|
27
|
-
self.valueProvider = provider
|
|
28
|
-
self.typedContainer = ValueContainer<T>(provider.value(frame: 0) as! T)
|
|
29
|
-
self.typedContainer.setNeedsUpdate()
|
|
35
|
+
typedContainer
|
|
30
36
|
}
|
|
31
|
-
|
|
37
|
+
|
|
32
38
|
func needsUpdate(frame: CGFloat) -> Bool {
|
|
33
|
-
|
|
39
|
+
valueContainer.needsUpdate || valueProvider.hasUpdate(frame: frame)
|
|
34
40
|
}
|
|
35
|
-
|
|
41
|
+
|
|
36
42
|
func setProvider(provider: AnyValueProvider) {
|
|
37
43
|
guard provider.valueType == valueType else { return }
|
|
38
|
-
|
|
44
|
+
valueProvider = provider
|
|
39
45
|
valueContainer.setNeedsUpdate()
|
|
40
46
|
}
|
|
41
|
-
|
|
47
|
+
|
|
42
48
|
func update(frame: CGFloat) {
|
|
43
49
|
typedContainer.setValue(valueProvider.value(frame: frame), forFrame: frame)
|
|
44
50
|
}
|
|
45
|
-
|
|
51
|
+
|
|
52
|
+
// MARK: Fileprivate
|
|
53
|
+
|
|
46
54
|
fileprivate var typedContainer: ValueContainer<T>
|
|
47
55
|
}
|
|
@@ -5,26 +5,32 @@
|
|
|
5
5
|
// Created by Brandon Withrow on 1/30/19.
|
|
6
6
|
//
|
|
7
7
|
|
|
8
|
-
import Foundation
|
|
9
8
|
import CoreGraphics
|
|
9
|
+
import Foundation
|
|
10
|
+
|
|
11
|
+
// MARK: - AnyNodeProperty
|
|
12
|
+
|
|
10
13
|
/// A property of a node. The node property holds a provider and a container
|
|
11
14
|
protocol AnyNodeProperty {
|
|
12
|
-
|
|
15
|
+
|
|
13
16
|
/// Returns true if the property needs to recompute its stored value
|
|
14
17
|
func needsUpdate(frame: CGFloat) -> Bool
|
|
15
|
-
|
|
18
|
+
|
|
16
19
|
/// Updates the property for the frame
|
|
17
20
|
func update(frame: CGFloat)
|
|
18
|
-
|
|
21
|
+
|
|
19
22
|
/// The stored value container for the property
|
|
20
23
|
var valueContainer: AnyValueContainer { get }
|
|
21
|
-
|
|
24
|
+
|
|
22
25
|
/// The value provider for the property
|
|
23
26
|
var valueProvider: AnyValueProvider { get }
|
|
24
|
-
|
|
27
|
+
|
|
28
|
+
/// The original value provider for the property
|
|
29
|
+
var originalValueProvider: AnyValueProvider { get }
|
|
30
|
+
|
|
25
31
|
/// The Type of the value provider
|
|
26
32
|
var valueType: Any.Type { get }
|
|
27
|
-
|
|
33
|
+
|
|
28
34
|
/// Sets the value provider for the property.
|
|
29
35
|
func setProvider(provider: AnyValueProvider)
|
|
30
36
|
}
|
|
@@ -33,12 +39,12 @@ extension AnyNodeProperty {
|
|
|
33
39
|
|
|
34
40
|
/// Returns the most recently computed value for the keypath, returns nil if property wasn't found
|
|
35
41
|
func getValueOfType<T>() -> T? {
|
|
36
|
-
|
|
42
|
+
valueContainer.value as? T
|
|
37
43
|
}
|
|
38
|
-
|
|
44
|
+
|
|
39
45
|
/// Returns the most recently computed value for the keypath, returns nil if property wasn't found
|
|
40
46
|
func getValue() -> Any? {
|
|
41
|
-
|
|
47
|
+
valueContainer.value
|
|
42
48
|
}
|
|
43
49
|
|
|
44
50
|
}
|
|
@@ -5,22 +5,22 @@
|
|
|
5
5
|
// Created by Brandon Withrow on 1/30/19.
|
|
6
6
|
//
|
|
7
7
|
|
|
8
|
-
import Foundation
|
|
9
8
|
import CoreGraphics
|
|
9
|
+
import Foundation
|
|
10
10
|
|
|
11
11
|
/// The container for the value of a property.
|
|
12
12
|
protocol AnyValueContainer: AnyObject {
|
|
13
|
-
|
|
13
|
+
|
|
14
14
|
/// The stored value of the container
|
|
15
15
|
var value: Any { get }
|
|
16
|
-
|
|
16
|
+
|
|
17
17
|
/// Notifies the provider that it should update its container
|
|
18
18
|
func setNeedsUpdate()
|
|
19
|
-
|
|
19
|
+
|
|
20
20
|
/// When true the container needs to have its value updated by its provider
|
|
21
21
|
var needsUpdate: Bool { get }
|
|
22
|
-
|
|
22
|
+
|
|
23
23
|
/// The frame time of the last provided update
|
|
24
24
|
var lastUpdateFrame: CGFloat { get }
|
|
25
|
-
|
|
25
|
+
|
|
26
26
|
}
|
|
@@ -10,15 +10,15 @@ import QuartzCore
|
|
|
10
10
|
|
|
11
11
|
/// Protocol that provides keypath search functionality. Returns all node properties associated with a keypath.
|
|
12
12
|
protocol KeypathSearchable {
|
|
13
|
-
|
|
13
|
+
|
|
14
14
|
/// The name of the Keypath
|
|
15
15
|
var keypathName: String { get }
|
|
16
|
-
|
|
16
|
+
|
|
17
17
|
/// A list of properties belonging to the keypath.
|
|
18
|
-
var keypathProperties: [String
|
|
19
|
-
|
|
18
|
+
var keypathProperties: [String: AnyNodeProperty] { get }
|
|
19
|
+
|
|
20
20
|
/// Children Keypaths
|
|
21
21
|
var childKeypaths: [KeypathSearchable] { get }
|
|
22
|
-
|
|
22
|
+
|
|
23
23
|
var keypathLayer: CALayer? { get }
|
|
24
24
|
}
|
|
@@ -8,20 +8,22 @@
|
|
|
8
8
|
import Foundation
|
|
9
9
|
import QuartzCore
|
|
10
10
|
|
|
11
|
+
// MARK: - NodePropertyMap
|
|
12
|
+
|
|
11
13
|
protocol NodePropertyMap {
|
|
12
14
|
var properties: [AnyNodeProperty] { get }
|
|
13
15
|
}
|
|
14
16
|
|
|
15
17
|
extension NodePropertyMap {
|
|
16
|
-
|
|
18
|
+
|
|
17
19
|
var childKeypaths: [KeypathSearchable] {
|
|
18
|
-
|
|
20
|
+
[]
|
|
19
21
|
}
|
|
20
|
-
|
|
22
|
+
|
|
21
23
|
var keypathLayer: CALayer? {
|
|
22
|
-
|
|
24
|
+
nil
|
|
23
25
|
}
|
|
24
|
-
|
|
26
|
+
|
|
25
27
|
/// Checks if the node's local contents need to be rebuilt.
|
|
26
28
|
func needsLocalUpdate(frame: CGFloat) -> Bool {
|
|
27
29
|
for property in properties {
|
|
@@ -31,12 +33,12 @@ extension NodePropertyMap {
|
|
|
31
33
|
}
|
|
32
34
|
return false
|
|
33
35
|
}
|
|
34
|
-
|
|
36
|
+
|
|
35
37
|
/// Rebuilds only the local nodes that have an update for the frame
|
|
36
38
|
func updateNodeProperties(frame: CGFloat) {
|
|
37
|
-
properties.forEach {
|
|
39
|
+
properties.forEach { property in
|
|
38
40
|
property.update(frame: frame)
|
|
39
41
|
}
|
|
40
42
|
}
|
|
41
|
-
|
|
43
|
+
|
|
42
44
|
}
|
|
@@ -5,14 +5,34 @@
|
|
|
5
5
|
// Created by Brandon Withrow on 1/30/19.
|
|
6
6
|
//
|
|
7
7
|
|
|
8
|
-
import Foundation
|
|
9
8
|
import CoreGraphics
|
|
9
|
+
import Foundation
|
|
10
10
|
|
|
11
11
|
/// A container for a node value that is Typed to T.
|
|
12
12
|
class ValueContainer<T>: AnyValueContainer {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
13
|
+
|
|
14
|
+
// MARK: Lifecycle
|
|
15
|
+
|
|
16
|
+
init(_ value: T) {
|
|
17
|
+
outputValue = value
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
// MARK: Internal
|
|
21
|
+
|
|
22
|
+
private(set) var lastUpdateFrame = CGFloat.infinity
|
|
23
|
+
|
|
24
|
+
fileprivate(set) var needsUpdate = true
|
|
25
|
+
|
|
26
|
+
var value: Any {
|
|
27
|
+
outputValue as Any
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
var outputValue: T {
|
|
31
|
+
didSet {
|
|
32
|
+
needsUpdate = false
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
16
36
|
func setValue(_ value: Any, forFrame: CGFloat) {
|
|
17
37
|
if let typedValue = value as? T {
|
|
18
38
|
needsUpdate = false
|
|
@@ -20,24 +40,8 @@ class ValueContainer<T>: AnyValueContainer {
|
|
|
20
40
|
outputValue = typedValue
|
|
21
41
|
}
|
|
22
42
|
}
|
|
23
|
-
|
|
43
|
+
|
|
24
44
|
func setNeedsUpdate() {
|
|
25
45
|
needsUpdate = true
|
|
26
46
|
}
|
|
27
|
-
|
|
28
|
-
var value: Any {
|
|
29
|
-
return outputValue as Any
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
var outputValue: T {
|
|
33
|
-
didSet {
|
|
34
|
-
needsUpdate = false
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
init(_ value: T) {
|
|
39
|
-
self.outputValue = value
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
fileprivate(set) var needsUpdate: Bool = true
|
|
43
47
|
}
|
|
@@ -5,29 +5,35 @@
|
|
|
5
5
|
// Created by Brandon Withrow on 1/22/19.
|
|
6
6
|
//
|
|
7
7
|
|
|
8
|
-
import Foundation
|
|
9
8
|
import CoreGraphics
|
|
9
|
+
import Foundation
|
|
10
10
|
|
|
11
11
|
/// A value provider that produces an array of values from an array of Keyframe Interpolators
|
|
12
|
-
final class GroupInterpolator<ValueType>:
|
|
12
|
+
final class GroupInterpolator<ValueType>: ValueProvider where ValueType: Interpolatable {
|
|
13
|
+
|
|
14
|
+
// MARK: Lifecycle
|
|
15
|
+
|
|
16
|
+
/// Initialize with an array of array of keyframes.
|
|
17
|
+
init(keyframeGroups: ContiguousArray<ContiguousArray<Keyframe<ValueType>>>) {
|
|
18
|
+
keyframeInterpolators = ContiguousArray(keyframeGroups.map({ KeyframeInterpolator(keyframes: $0) }))
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
// MARK: Internal
|
|
22
|
+
|
|
23
|
+
let keyframeInterpolators: ContiguousArray<KeyframeInterpolator<ValueType>>
|
|
24
|
+
|
|
13
25
|
var valueType: Any.Type {
|
|
14
|
-
|
|
26
|
+
[ValueType].self
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
var storage: ValueProviderStorage<[ValueType]> {
|
|
30
|
+
.closure { frame in
|
|
31
|
+
self.keyframeInterpolators.map({ $0.value(frame: frame) as! ValueType })
|
|
32
|
+
}
|
|
15
33
|
}
|
|
16
|
-
|
|
34
|
+
|
|
17
35
|
func hasUpdate(frame: CGFloat) -> Bool {
|
|
18
|
-
let updated = keyframeInterpolators.first(where: {$0.hasUpdate(frame: frame)})
|
|
36
|
+
let updated = keyframeInterpolators.first(where: { $0.hasUpdate(frame: frame) })
|
|
19
37
|
return updated != nil
|
|
20
38
|
}
|
|
21
|
-
|
|
22
|
-
func value(frame: CGFloat) -> Any {
|
|
23
|
-
let output = keyframeInterpolators.map({$0.value(frame: frame) as! ValueType})
|
|
24
|
-
return output
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
/// Initialize with an array of array of keyframes.
|
|
28
|
-
init(keyframeGroups: ContiguousArray<ContiguousArray<Keyframe<ValueType>>>) {
|
|
29
|
-
self.keyframeInterpolators = ContiguousArray(keyframeGroups.map({KeyframeInterpolator(keyframes: $0)}))
|
|
30
|
-
}
|
|
31
|
-
let keyframeInterpolators: ContiguousArray<KeyframeInterpolator<ValueType>>
|
|
32
|
-
|
|
33
39
|
}
|
|
@@ -9,30 +9,35 @@ import Foundation
|
|
|
9
9
|
import QuartzCore
|
|
10
10
|
|
|
11
11
|
/// Returns a value for every frame.
|
|
12
|
-
final class SingleValueProvider<ValueType>:
|
|
13
|
-
|
|
12
|
+
final class SingleValueProvider<ValueType: AnyInterpolatable>: ValueProvider {
|
|
13
|
+
|
|
14
|
+
// MARK: Lifecycle
|
|
15
|
+
|
|
16
|
+
init(_ value: ValueType) {
|
|
17
|
+
self.value = value
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
// MARK: Internal
|
|
21
|
+
|
|
14
22
|
var value: ValueType {
|
|
15
23
|
didSet {
|
|
16
24
|
hasUpdate = true
|
|
17
25
|
}
|
|
18
26
|
}
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
27
|
+
|
|
28
|
+
var storage: ValueProviderStorage<ValueType> {
|
|
29
|
+
.singleValue(value)
|
|
22
30
|
}
|
|
23
|
-
|
|
31
|
+
|
|
24
32
|
var valueType: Any.Type {
|
|
25
|
-
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
func hasUpdate(frame: CGFloat) -> Bool {
|
|
29
|
-
return hasUpdate
|
|
33
|
+
ValueType.self
|
|
30
34
|
}
|
|
31
|
-
|
|
32
|
-
func
|
|
33
|
-
hasUpdate
|
|
34
|
-
return value
|
|
35
|
+
|
|
36
|
+
func hasUpdate(frame _: CGFloat) -> Bool {
|
|
37
|
+
hasUpdate
|
|
35
38
|
}
|
|
36
|
-
|
|
37
|
-
|
|
39
|
+
|
|
40
|
+
// MARK: Private
|
|
41
|
+
|
|
42
|
+
private var hasUpdate = true
|
|
38
43
|
}
|