lottie-ios 3.2.2 → 3.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/actions/setup/action.yml +32 -0
- package/.github/issue_template.md +6 -23
- package/.github/workflows/main.yml +98 -0
- package/.spi.yml +6 -0
- package/.swift-version +1 -0
- package/.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata +7 -0
- package/.swiftpm/xcode/package.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- package/.swiftpm/xcode/xcuserdata/{brandonwithrow.xcuserdatad → cal.xcuserdatad}/xcschemes/xcschememanagement.plist +25 -15
- package/.swiftpm/xcode/xcuserdata/calstephens.xcuserdatad/xcschemes/xcschememanagement.plist +14 -0
- package/Gemfile +4 -0
- package/Gemfile.lock +102 -0
- package/Lottie.xcodeproj/project.pbxproj +2003 -1972
- package/Lottie.xcodeproj/project.xcworkspace/contents.xcworkspacedata +1 -1
- package/Lottie.xcodeproj/project.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- package/Lottie.xcodeproj/xcshareddata/xcschemes/{Lottie_iOS.xcscheme → Lottie (iOS).xcscheme } +15 -18
- package/Lottie.xcodeproj/xcshareddata/xcschemes/{Lottie_macOS.xcscheme → Lottie (macOS).xcscheme } +7 -20
- package/Lottie.xcodeproj/xcshareddata/xcschemes/{Lottie_tvOS.xcscheme → Lottie (tvOS).xcscheme } +5 -18
- package/Lottie.xcodeproj/xcuserdata/cal.xcuserdatad/xcschemes/xcschememanagement.plist +37 -0
- package/Lottie.xcodeproj/xcuserdata/calstephens.xcuserdatad/xcschemes/xcschememanagement.plist +24 -0
- package/Lottie.xcworkspace/contents.xcworkspacedata +10 -0
- package/Lottie.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
- package/Lottie.xcworkspace/xcshareddata/swiftpm/Package.resolved +115 -0
- package/Lottie.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- package/{Lottie.xcodeproj/xcuserdata/brandonwithrow.xcuserdatad → Lottie.xcworkspace/xcuserdata/cal.xcuserdatad}/xcdebugger/Breakpoints_v2.xcbkptlist +2 -2
- package/Lottie.xcworkspace/xcuserdata/cal.xcuserdatad/xcdebugger/Expressions.xcexplist +153 -0
- package/Lottie.xcworkspace/xcuserdata/calstephens.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- package/Lottie.xcworkspace/xcuserdata/calstephens.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +39 -0
- package/Lottie.xcworkspace/xcuserdata/calstephens.xcuserdatad/xcdebugger/Expressions.xcexplist +25 -0
- package/Lottie.xcworkspace/xcuserdata/calstephens.xcuserdatad/xcschemes/xcschememanagement.plist +30 -0
- package/Package.resolved +88 -0
- package/Package.swift +10 -15
- package/README.md +40 -60
- package/Rakefile +121 -0
- package/Sources/Private/CoreAnimation/Animations/CAAnimation+TimingConfiguration.swift +81 -0
- package/Sources/Private/CoreAnimation/Animations/CALayer+addAnimation.swift +448 -0
- package/Sources/Private/CoreAnimation/Animations/CombinedShapeAnimation.swift +53 -0
- package/Sources/Private/CoreAnimation/Animations/CustomPathAnimation.swift +41 -0
- package/Sources/Private/CoreAnimation/Animations/EllipseAnimation.swift +28 -0
- package/Sources/Private/CoreAnimation/Animations/GradientAnimations.swift +210 -0
- package/Sources/Private/CoreAnimation/Animations/LayerProperty.swift +229 -0
- package/Sources/Private/CoreAnimation/Animations/OpacityAnimation.swift +52 -0
- package/Sources/Private/CoreAnimation/Animations/RectangleAnimation.swift +31 -0
- package/Sources/Private/CoreAnimation/Animations/ShapeAnimation.swift +246 -0
- package/Sources/Private/CoreAnimation/Animations/StarAnimation.swift +95 -0
- package/Sources/Private/CoreAnimation/Animations/StrokeAnimation.swift +70 -0
- package/Sources/Private/CoreAnimation/Animations/TransformAnimations.swift +205 -0
- package/Sources/Private/CoreAnimation/Animations/VisibilityAnimation.swift +37 -0
- package/Sources/Private/CoreAnimation/CompatibilityTracker.swift +130 -0
- package/Sources/Private/CoreAnimation/CoreAnimationLayer.swift +492 -0
- package/Sources/Private/CoreAnimation/Extensions/CALayer+fillBounds.swift +35 -0
- package/Sources/Private/CoreAnimation/Extensions/KeyframeGroup+exactlyOneKeyframe.swift +37 -0
- package/Sources/Private/CoreAnimation/Extensions/Keyframes+combinedIfPossible.swift +73 -0
- package/Sources/Private/CoreAnimation/Layers/AnimationLayer.swift +83 -0
- package/Sources/Private/CoreAnimation/Layers/BaseAnimationLayer.swift +33 -0
- package/Sources/Private/CoreAnimation/Layers/BaseCompositionLayer.swift +87 -0
- package/Sources/Private/CoreAnimation/Layers/CALayer+setupLayerHierarchy.swift +131 -0
- package/Sources/Private/CoreAnimation/Layers/GradientRenderLayer.swift +94 -0
- package/Sources/Private/CoreAnimation/Layers/ImageLayer.swift +79 -0
- package/Sources/Private/CoreAnimation/Layers/LayerModel+makeAnimationLayer.swift +60 -0
- package/Sources/Private/CoreAnimation/Layers/MaskCompositionLayer.swift +138 -0
- package/Sources/Private/CoreAnimation/Layers/PreCompLayer.swift +140 -0
- package/Sources/Private/CoreAnimation/Layers/ShapeItemLayer.swift +302 -0
- package/Sources/Private/CoreAnimation/Layers/ShapeLayer.swift +319 -0
- package/Sources/Private/CoreAnimation/Layers/SolidLayer.swift +47 -0
- package/Sources/Private/CoreAnimation/Layers/TextLayer.swift +91 -0
- package/Sources/Private/CoreAnimation/Layers/TransformLayer.swift +11 -0
- package/Sources/Private/CoreAnimation/ValueProviderStore.swift +139 -0
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/CompositionLayer.swift +93 -85
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/ImageCompositionLayer.swift +24 -21
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/MaskContainerLayer.swift +75 -54
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/NullCompositionLayer.swift +5 -5
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/PreCompositionLayer.swift +61 -44
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/ShapeCompositionLayer.swift +22 -20
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/SolidCompositionLayer.swift +26 -17
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/TextCompositionLayer.swift +42 -36
- package/{lottie-swift/src/Private/LayerContainers/AnimationContainer.swift → Sources/Private/MainThread/LayerContainers/MainThreadAnimationLayer.swift} +200 -140
- package/Sources/Private/MainThread/LayerContainers/Utility/CachedImageProvider.swift +47 -0
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/Utility/CompositionLayersInitializer.swift +33 -24
- package/{lottie-swift/src/Private/LayerContainers/Utility/TextLayer.swift → Sources/Private/MainThread/LayerContainers/Utility/CoreTextRenderLayer.swift} +120 -106
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/Utility/InvertedMatteLayer.swift +25 -24
- package/Sources/Private/MainThread/LayerContainers/Utility/LayerFontProvider.swift +41 -0
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/Utility/LayerImageProvider.swift +20 -16
- package/Sources/Private/MainThread/LayerContainers/Utility/LayerTextProvider.swift +40 -0
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/Utility/LayerTransformNode.swift +82 -67
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Extensions/ItemsExtension.swift +4 -4
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/NodeProperty.swift +29 -21
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/Protocols/AnyNodeProperty.swift +16 -10
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/Protocols/AnyValueContainer.swift +6 -6
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/Protocols/KeypathSearchable.swift +5 -5
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/Protocols/NodePropertyMap.swift +10 -8
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/ValueContainer.swift +25 -21
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/ValueProviders/GroupInterpolator.swift +23 -17
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/ValueProviders/KeyframeInterpolator.swift +125 -108
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/ValueProviders/SingleValueProvider.swift +22 -17
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/ModifierNodes/TrimPathNode.swift +110 -79
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/OutputNodes/GroupOutputNode.swift +22 -16
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/OutputNodes/PassThroughOutputNode.swift +19 -15
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/OutputNodes/PathOutputNode.swift +22 -20
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/OutputNodes/Renderables/FillRenderer.swift +22 -23
- package/Sources/Private/MainThread/NodeRenderSystem/Nodes/OutputNodes/Renderables/GradientFillRenderer.swift +242 -0
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/OutputNodes/Renderables/GradientStrokeRenderer.swift +30 -24
- package/{lottie-swift/src/Private/NodeRenderSystem/Nodes/OutputNodes/Renderables/GradientFillRenderer.swift → Sources/Private/MainThread/NodeRenderSystem/Nodes/OutputNodes/Renderables/LegacyGradientFillRenderer.swift} +93 -66
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/OutputNodes/Renderables/StrokeRenderer.swift +23 -19
- package/Sources/Private/MainThread/NodeRenderSystem/Nodes/PathNodes/EllipseNode.swift +139 -0
- package/Sources/Private/MainThread/NodeRenderSystem/Nodes/PathNodes/PolygonNode.swift +170 -0
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/PathNodes/RectNode.swift +95 -58
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/PathNodes/ShapeNode.swift +42 -29
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/PathNodes/StarNode.swift +108 -69
- package/Sources/Private/MainThread/NodeRenderSystem/Nodes/RenderContainers/GroupNode.swift +155 -0
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/RenderNodes/FillNode.swift +51 -37
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/RenderNodes/GradientFillNode.swift +54 -42
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/RenderNodes/GradientStrokeNode.swift +65 -57
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/RenderNodes/StrokeNode.swift +84 -58
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/Text/TextAnimatorNode.swift +138 -119
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Protocols/AnimatorNode.swift +80 -79
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Protocols/PathNode.swift +5 -3
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Protocols/RenderNode.swift +22 -17
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/RenderLayers/ShapeContainerLayer.swift +27 -24
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/RenderLayers/ShapeRenderLayer.swift +34 -25
- package/Sources/Private/Model/Animation.swift +160 -0
- package/Sources/Private/Model/Assets/Asset.swift +43 -0
- package/{lottie-swift/src → Sources}/Private/Model/Assets/AssetLibrary.swift +40 -13
- package/Sources/Private/Model/Assets/ImageAsset.swift +112 -0
- package/{lottie-swift/src → Sources}/Private/Model/Assets/PrecompAsset.swift +20 -10
- package/Sources/Private/Model/DictionaryInitializable.swift +67 -0
- package/Sources/Private/Model/Extensions/Bundle.swift +34 -0
- package/{lottie-swift/src → Sources}/Private/Model/Extensions/KeyedDecodingContainerExtensions.swift +8 -4
- package/Sources/Private/Model/Keyframes/KeyframeData.swift +113 -0
- package/Sources/Private/Model/Keyframes/KeyframeGroup.swift +197 -0
- package/{lottie-swift/src → Sources}/Private/Model/Layers/ImageLayerModel.swift +21 -11
- package/Sources/Private/Model/Layers/LayerModel.swift +228 -0
- package/{lottie-swift/src → Sources}/Private/Model/Layers/PreCompLayerModel.swift +39 -22
- package/{lottie-swift/src → Sources}/Private/Model/Layers/ShapeLayerModel.swift +23 -12
- package/{lottie-swift/src → Sources}/Private/Model/Layers/SolidLayerModel.swift +31 -19
- package/{lottie-swift/src → Sources}/Private/Model/Layers/TextLayerModel.swift +33 -19
- package/Sources/Private/Model/Objects/DashPattern.swift +44 -0
- package/Sources/Private/Model/Objects/Marker.swift +33 -0
- package/Sources/Private/Model/Objects/Mask.swift +80 -0
- package/Sources/Private/Model/Objects/Transform.swift +179 -0
- package/Sources/Private/Model/ShapeItems/Ellipse.swift +75 -0
- package/Sources/Private/Model/ShapeItems/Fill.swift +74 -0
- package/Sources/Private/Model/ShapeItems/GradientFill.swift +124 -0
- package/Sources/Private/Model/ShapeItems/GradientStroke.swift +186 -0
- package/Sources/Private/Model/ShapeItems/Group.swift +48 -0
- package/{lottie-swift/src → Sources}/Private/Model/ShapeItems/Merge.swift +29 -11
- package/Sources/Private/Model/ShapeItems/Rectangle.swift +73 -0
- package/Sources/Private/Model/ShapeItems/Repeater.swift +136 -0
- package/Sources/Private/Model/ShapeItems/Shape.swift +56 -0
- package/Sources/Private/Model/ShapeItems/ShapeItem.swift +163 -0
- package/Sources/Private/Model/ShapeItems/ShapeTransform.swift +136 -0
- package/Sources/Private/Model/ShapeItems/Star.swift +132 -0
- package/Sources/Private/Model/ShapeItems/Stroke.swift +102 -0
- package/Sources/Private/Model/ShapeItems/Trim.swift +78 -0
- package/Sources/Private/Model/Text/Font.swift +61 -0
- package/{lottie-swift/src → Sources}/Private/Model/Text/Glyph.swift +63 -39
- package/Sources/Private/Model/Text/TextAnimator.swift +164 -0
- package/Sources/Private/Model/Text/TextDocument.swift +123 -0
- package/Sources/Private/RootAnimationLayer.swift +51 -0
- package/{lottie-swift/src → Sources}/Private/Utility/Debugging/AnimatorNodeDebugging.swift +7 -7
- package/{lottie-swift/src → Sources}/Private/Utility/Debugging/LayerDebugging.swift +72 -48
- package/Sources/Private/Utility/Debugging/TestHelpers.swift +10 -0
- package/{lottie-swift/src → Sources}/Private/Utility/Extensions/AnimationKeypathExtension.swift +69 -59
- package/Sources/Private/Utility/Extensions/BlendMode+Filter.swift +31 -0
- package/Sources/Private/Utility/Extensions/CGColor+RGB.swift +22 -0
- package/{lottie-swift/src → Sources}/Private/Utility/Extensions/CGFloatExtensions.swift +70 -67
- package/Sources/Private/Utility/Extensions/DataExtension.swift +27 -0
- package/Sources/Private/Utility/Extensions/MathKit.swift +450 -0
- package/Sources/Private/Utility/Extensions/StringExtensions.swift +38 -0
- package/{lottie-swift/src → Sources}/Private/Utility/Helpers/AnimationContext.swift +42 -16
- package/Sources/Private/Utility/Interpolatable/InterpolatableExtensions.swift +134 -0
- package/{lottie-swift/src → Sources}/Private/Utility/Interpolatable/KeyframeExtensions.swift +13 -10
- package/Sources/Private/Utility/Interpolatable/KeyframeGroup+Extensions.swift +59 -0
- package/{lottie-swift/src → Sources}/Private/Utility/Primitives/BezierPath.swift +229 -143
- package/Sources/Private/Utility/Primitives/CGPointExtension.swift +35 -0
- package/{lottie-swift/src → Sources}/Private/Utility/Primitives/ColorExtension.swift +46 -14
- package/{lottie-swift/src → Sources}/Private/Utility/Primitives/CompoundBezierPath.swift +58 -49
- package/Sources/Private/Utility/Primitives/CurveVertex.swift +184 -0
- package/Sources/Private/Utility/Primitives/PathElement.swift +75 -0
- package/Sources/Private/Utility/Primitives/UnitBezier.swift +115 -0
- package/Sources/Private/Utility/Primitives/VectorsExtensions.swift +341 -0
- package/Sources/Public/Animation/AnimationPublic.swift +266 -0
- package/Sources/Public/Animation/AnimationView.swift +1335 -0
- package/Sources/Public/Animation/AnimationViewInitializers.swift +109 -0
- package/Sources/Public/AnimationCache/AnimationCacheProvider.swift +22 -0
- package/{lottie-swift/src → Sources}/Public/AnimationCache/LRUAnimationCache.swift +22 -18
- package/Sources/Public/DynamicProperties/AnimationKeypath.swift +49 -0
- package/Sources/Public/DynamicProperties/AnyValueProvider.swift +132 -0
- package/{lottie-swift/src → Sources}/Public/DynamicProperties/ValueProviders/ColorValueProvider.swift +54 -36
- package/{lottie-swift/src → Sources}/Public/DynamicProperties/ValueProviders/FloatValueProvider.swift +40 -36
- package/Sources/Public/DynamicProperties/ValueProviders/GradientValueProvider.swift +123 -0
- package/{lottie-swift/src → Sources}/Public/DynamicProperties/ValueProviders/PointValueProvider.swift +40 -35
- package/{lottie-swift/src → Sources}/Public/DynamicProperties/ValueProviders/SizeValueProvider.swift +40 -35
- package/{lottie-swift/src → Sources}/Public/FontProvider/AnimationFontProvider.swift +15 -8
- package/Sources/Public/ImageProvider/AnimationImageProvider.swift +21 -0
- package/Sources/Public/Keyframes/Interpolatable.swift +253 -0
- package/Sources/Public/Keyframes/Keyframe.swift +92 -0
- package/Sources/Public/Logging/LottieLogger.swift +137 -0
- package/Sources/Public/LottieConfiguration.swift +143 -0
- package/{lottie-swift/src → Sources}/Public/Primitives/AnimationTime.swift +1 -1
- package/{lottie-swift/src → Sources}/Public/Primitives/Color.swift +10 -6
- package/{lottie-swift/src → Sources}/Public/Primitives/Vectors.swift +13 -12
- package/Sources/Public/TextProvider/AnimationTextProvider.swift +53 -0
- package/{lottie-swift/src → Sources}/Public/iOS/AnimatedButton.swift +42 -26
- package/{lottie-swift/src → Sources}/Public/iOS/AnimatedControl.swift +100 -91
- package/{lottie-swift/src → Sources}/Public/iOS/AnimatedSwitch.swift +128 -94
- package/{lottie-swift/src → Sources}/Public/iOS/AnimationSubview.swift +3 -3
- package/Sources/Public/iOS/AnimationViewBase.swift +78 -0
- package/{lottie-swift/src → Sources}/Public/iOS/BundleImageProvider.swift +36 -34
- package/{lottie-swift/src → Sources}/Public/iOS/Compatibility/CompatibleAnimationKeypath.swift +4 -0
- package/{lottie-swift/src → Sources}/Public/iOS/Compatibility/CompatibleAnimationView.swift +38 -29
- package/{lottie-swift/src → Sources}/Public/iOS/FilepathImageProvider.swift +24 -21
- package/{lottie-swift/src → Sources}/Public/iOS/UIColorExtension.swift +4 -4
- package/{lottie-swift/src/Public/MacOS/AnimationSubview.swift → Sources/Public/macOS/AnimationSubview.macOS.swift} +4 -5
- package/{lottie-swift/src/Public/MacOS/LottieView.swift → Sources/Public/macOS/AnimationViewBase.macOS.swift} +58 -50
- package/{lottie-swift/src/Public/MacOS/BundleImageProvider.swift → Sources/Public/macOS/BundleImageProvider.macOS.swift} +31 -32
- package/Sources/Public/macOS/FilepathImageProvider.macOS.swift +67 -0
- package/Tests/AnimationKeypathTests.swift +94 -0
- package/Tests/AutomaticEngineTests.swift +57 -0
- package/Tests/BundleTests.swift +25 -0
- package/Tests/DataURLTests.swift +64 -0
- package/Tests/ParsingTests.swift +43 -0
- package/Tests/PerformanceTests.swift +215 -0
- package/Tests/SnapshotConfiguration.swift +153 -0
- package/Tests/SnapshotTests.swift +265 -0
- package/Tests/Utils/Bundle+Module.swift +30 -0
- package/Tests/Utils/HardcodedFontProvider.swift +19 -0
- package/Tests/Utils/HardcodedImageProvider.swift +23 -0
- package/Tests/Utils/Snapshotting+presentationLayer.swift +47 -0
- package/Tests/ValueProvidersTests.swift +27 -0
- package/lottie-ios.podspec +11 -12
- package/package.json +1 -1
- package/script/test-carthage/Cartfile +1 -0
- package/script/test-carthage/Cartfile.resolved +1 -0
- package/script/test-carthage/CarthageTest/AppDelegate.swift +26 -0
- package/script/test-carthage/CarthageTest/Assets.xcassets/AccentColor.colorset/Contents.json +11 -0
- package/script/test-carthage/CarthageTest/Assets.xcassets/AppIcon.appiconset/Contents.json +98 -0
- package/script/test-carthage/CarthageTest/Assets.xcassets/Contents.json +6 -0
- package/script/test-carthage/CarthageTest/Base.lproj/LaunchScreen.storyboard +25 -0
- package/script/test-carthage/CarthageTest/Base.lproj/Main.storyboard +24 -0
- package/script/test-carthage/CarthageTest/Info.plist +66 -0
- package/script/test-carthage/CarthageTest/SceneDelegate.swift +10 -0
- package/script/test-carthage/CarthageTest/ViewController.swift +15 -0
- package/script/test-carthage/CarthageTest-macOS/AppDelegate.swift +7 -0
- package/script/test-carthage/CarthageTest-macOS/Assets.xcassets/AccentColor.colorset/Contents.json +11 -0
- package/script/test-carthage/CarthageTest-macOS/Assets.xcassets/AppIcon.appiconset/Contents.json +58 -0
- package/script/test-carthage/CarthageTest-macOS/Assets.xcassets/Contents.json +6 -0
- package/script/test-carthage/CarthageTest-macOS/Base.lproj/Main.storyboard +717 -0
- package/script/test-carthage/CarthageTest-macOS/CarthageTest_macOS.entitlements +10 -0
- package/script/test-carthage/CarthageTest-macOS/ViewController.swift +15 -0
- package/script/test-carthage/CarthageTest.xcodeproj/project.pbxproj +532 -0
- package/script/test-carthage/CarthageTest.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
- package/script/test-carthage/CarthageTest.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
- package/script/test-carthage/CarthageTest.xcodeproj/project.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- package/script/test-carthage/CarthageTest.xcodeproj/project.xcworkspace/xcuserdata/calstephens.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- package/script/test-carthage/CarthageTest.xcodeproj/xcuserdata/cal.xcuserdatad/xcschemes/xcschememanagement.plist +14 -0
- package/script/test-carthage/CarthageTest.xcodeproj/xcuserdata/calstephens.xcuserdatad/xcschemes/xcschememanagement.plist +19 -0
- package/script/test-carthage/Mintfile +1 -0
- package/script/test-spm/LottieSPM.xcworkspace/contents.xcworkspacedata +7 -0
- package/script/test-spm/LottieSPM.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- package/script/test-spm/Mintfile +1 -0
- package/.swiftpm/xcode/package.xcworkspace/xcuserdata/brandonwithrow.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- package/Lottie/Info.plist +0 -22
- package/Lottie.xcodeproj/project.xcworkspace/xcuserdata/brandonwithrow.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- package/Lottie.xcodeproj/xcuserdata/brandonwithrow.xcuserdatad/xcschemes/LottieLibraryMacOS.xcscheme +0 -80
- package/Lottie.xcodeproj/xcuserdata/brandonwithrow.xcuserdatad/xcschemes/xcschememanagement.plist +0 -57
- package/lottie-swift/Assets/.gitkeep +0 -0
- package/lottie-swift/src/Private/LayerContainers/Utility/LayerFontProvider.swift +0 -37
- package/lottie-swift/src/Private/LayerContainers/Utility/LayerTextProvider.swift +0 -36
- package/lottie-swift/src/Private/Model/Animation.swift +0 -107
- package/lottie-swift/src/Private/Model/Assets/Asset.swift +0 -27
- package/lottie-swift/src/Private/Model/Assets/ImageAsset.swift +0 -48
- package/lottie-swift/src/Private/Model/Keyframes/Keyframe.swift +0 -128
- package/lottie-swift/src/Private/Model/Keyframes/KeyframeGroup.swift +0 -108
- package/lottie-swift/src/Private/Model/Layers/LayerModel.swift +0 -150
- package/lottie-swift/src/Private/Model/Objects/DashPattern.swift +0 -24
- package/lottie-swift/src/Private/Model/Objects/Marker.swift +0 -23
- package/lottie-swift/src/Private/Model/Objects/Mask.swift +0 -48
- package/lottie-swift/src/Private/Model/Objects/Transform.swift +0 -105
- package/lottie-swift/src/Private/Model/ShapeItems/Ellipse.swift +0 -50
- package/lottie-swift/src/Private/Model/ShapeItems/FillI.swift +0 -49
- package/lottie-swift/src/Private/Model/ShapeItems/GradientFill.swift +0 -86
- package/lottie-swift/src/Private/Model/ShapeItems/GradientStroke.swift +0 -125
- package/lottie-swift/src/Private/Model/ShapeItems/Group.swift +0 -32
- package/lottie-swift/src/Private/Model/ShapeItems/Rectangle.swift +0 -50
- package/lottie-swift/src/Private/Model/ShapeItems/Repeater.swift +0 -80
- package/lottie-swift/src/Private/Model/ShapeItems/Shape.swift +0 -37
- package/lottie-swift/src/Private/Model/ShapeItems/ShapeItem.swift +0 -95
- package/lottie-swift/src/Private/Model/ShapeItems/ShapeTransform.swift +0 -68
- package/lottie-swift/src/Private/Model/ShapeItems/Star.swift +0 -86
- package/lottie-swift/src/Private/Model/ShapeItems/Stroke.swift +0 -67
- package/lottie-swift/src/Private/Model/ShapeItems/Trim.swift +0 -53
- package/lottie-swift/src/Private/Model/Text/Font.swift +0 -35
- package/lottie-swift/src/Private/Model/Text/TextAnimator.swift +0 -99
- package/lottie-swift/src/Private/Model/Text/TextDocument.swift +0 -70
- package/lottie-swift/src/Private/NodeRenderSystem/Nodes/PathNodes/EllipseNode.swift +0 -109
- package/lottie-swift/src/Private/NodeRenderSystem/Nodes/PathNodes/PolygonNode.swift +0 -132
- package/lottie-swift/src/Private/NodeRenderSystem/Nodes/RenderContainers/GroupNode.swift +0 -141
- package/lottie-swift/src/Private/Utility/Extensions/MathKit.swift +0 -539
- package/lottie-swift/src/Private/Utility/Extensions/StringExtensions.swift +0 -32
- package/lottie-swift/src/Private/Utility/Interpolatable/Interpolatable.swift +0 -18
- package/lottie-swift/src/Private/Utility/Interpolatable/InterpolatableExtensions.swift +0 -170
- package/lottie-swift/src/Private/Utility/Primitives/CurveVertex.swift +0 -177
- package/lottie-swift/src/Private/Utility/Primitives/PathElement.swift +0 -68
- package/lottie-swift/src/Private/Utility/Primitives/VectorsExtensions.swift +0 -218
- package/lottie-swift/src/Public/Animation/AnimationPublic.swift +0 -196
- package/lottie-swift/src/Public/Animation/AnimationView.swift +0 -1006
- package/lottie-swift/src/Public/Animation/AnimationViewInitializers.swift +0 -83
- package/lottie-swift/src/Public/AnimationCache/AnimationCacheProvider.swift +0 -24
- package/lottie-swift/src/Public/DynamicProperties/AnimationKeypath.swift +0 -46
- package/lottie-swift/src/Public/DynamicProperties/AnyValueProvider.swift +0 -29
- package/lottie-swift/src/Public/DynamicProperties/ValueProviders/GradientValueProvider.swift +0 -114
- package/lottie-swift/src/Public/ImageProvider/AnimationImageProvider.swift +0 -23
- package/lottie-swift/src/Public/MacOS/FilepathImageProvider.swift +0 -67
- package/lottie-swift/src/Public/TextProvider/AnimationTextProvider.swift +0 -39
- package/lottie-swift/src/Public/iOS/LottieView.swift +0 -62
- package/lottie-swift-testing.podspec +0 -32
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
//
|
|
2
|
-
//
|
|
2
|
+
// MainThreadAnimationLayer.swift
|
|
3
3
|
// lottie-swift
|
|
4
4
|
//
|
|
5
5
|
// Created by Brandon Withrow on 1/24/19.
|
|
@@ -8,118 +8,40 @@
|
|
|
8
8
|
import Foundation
|
|
9
9
|
import QuartzCore
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
The base animation container.
|
|
13
|
-
|
|
14
|
-
This layer holds a single composition container and allows for animation of
|
|
15
|
-
the currentFrame property.
|
|
16
|
-
*/
|
|
17
|
-
final class AnimationContainer: CALayer {
|
|
18
|
-
|
|
19
|
-
/// The animatable Current Frame Property
|
|
20
|
-
@NSManaged var currentFrame: CGFloat
|
|
21
|
-
|
|
22
|
-
var imageProvider: AnimationImageProvider {
|
|
23
|
-
get {
|
|
24
|
-
return layerImageProvider.imageProvider
|
|
25
|
-
}
|
|
26
|
-
set {
|
|
27
|
-
layerImageProvider.imageProvider = newValue
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
func reloadImages() {
|
|
32
|
-
layerImageProvider.reloadImages()
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
var renderScale: CGFloat = 1 {
|
|
36
|
-
didSet {
|
|
37
|
-
animationLayers.forEach({ $0.renderScale = renderScale })
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
public var respectAnimationFrameRate: Bool = false
|
|
42
|
-
|
|
43
|
-
/// Forces the view to update its drawing.
|
|
44
|
-
func forceDisplayUpdate() {
|
|
45
|
-
animationLayers.forEach( { $0.displayWithFrame(frame: currentFrame, forceUpdates: true) })
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
func logHierarchyKeypaths() {
|
|
49
|
-
print("Lottie: Logging Animation Keypaths")
|
|
50
|
-
animationLayers.forEach({ $0.logKeypaths(for: nil) })
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
func setValueProvider(_ valueProvider: AnyValueProvider, keypath: AnimationKeypath) {
|
|
54
|
-
for layer in animationLayers {
|
|
55
|
-
if let foundProperties = layer.nodeProperties(for: keypath) {
|
|
56
|
-
for property in foundProperties {
|
|
57
|
-
property.setProvider(provider: valueProvider)
|
|
58
|
-
}
|
|
59
|
-
layer.displayWithFrame(frame: presentation()?.currentFrame ?? currentFrame, forceUpdates: true)
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
func getValue(for keypath: AnimationKeypath, atFrame: CGFloat?) -> Any? {
|
|
65
|
-
for layer in animationLayers {
|
|
66
|
-
if let foundProperties = layer.nodeProperties(for: keypath),
|
|
67
|
-
let first = foundProperties.first {
|
|
68
|
-
return first.valueProvider.value(frame: atFrame ?? currentFrame)
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
return nil
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
func layer(for keypath: AnimationKeypath) -> CALayer? {
|
|
75
|
-
for layer in animationLayers {
|
|
76
|
-
if let foundLayer = layer.layer(for: keypath) {
|
|
77
|
-
return foundLayer
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
return nil
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
func animatorNodes(for keypath: AnimationKeypath) -> [AnimatorNode]? {
|
|
84
|
-
var results = [AnimatorNode]()
|
|
85
|
-
for layer in animationLayers {
|
|
86
|
-
if let nodes = layer.animatorNodes(for: keypath) {
|
|
87
|
-
results.append(contentsOf: nodes)
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
if results.count == 0 {
|
|
91
|
-
return nil
|
|
92
|
-
}
|
|
93
|
-
return results
|
|
94
|
-
}
|
|
11
|
+
// MARK: - MainThreadAnimationLayer
|
|
95
12
|
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
self.
|
|
13
|
+
/// The base `CALayer` for the Main Thread rendering engine
|
|
14
|
+
///
|
|
15
|
+
/// This layer holds a single composition container and allows for animation of
|
|
16
|
+
/// the currentFrame property.
|
|
17
|
+
final class MainThreadAnimationLayer: CALayer, RootAnimationLayer {
|
|
18
|
+
|
|
19
|
+
// MARK: Lifecycle
|
|
20
|
+
|
|
21
|
+
init(
|
|
22
|
+
animation: Animation,
|
|
23
|
+
imageProvider: AnimationImageProvider,
|
|
24
|
+
textProvider: AnimationTextProvider,
|
|
25
|
+
fontProvider: AnimationFontProvider,
|
|
26
|
+
logger: LottieLogger)
|
|
27
|
+
{
|
|
28
|
+
layerImageProvider = LayerImageProvider(imageProvider: imageProvider, assets: animation.assetLibrary?.imageAssets)
|
|
29
|
+
layerTextProvider = LayerTextProvider(textProvider: textProvider)
|
|
30
|
+
layerFontProvider = LayerFontProvider(fontProvider: fontProvider)
|
|
31
|
+
animationLayers = []
|
|
32
|
+
self.logger = logger
|
|
116
33
|
super.init()
|
|
117
34
|
bounds = animation.bounds
|
|
118
|
-
let layers = animation.layers.initializeCompositionLayers(
|
|
119
|
-
|
|
35
|
+
let layers = animation.layers.initializeCompositionLayers(
|
|
36
|
+
assetLibrary: animation.assetLibrary,
|
|
37
|
+
layerImageProvider: layerImageProvider,
|
|
38
|
+
textProvider: textProvider,
|
|
39
|
+
fontProvider: fontProvider,
|
|
40
|
+
frameRate: CGFloat(animation.framerate))
|
|
41
|
+
|
|
120
42
|
var imageLayers = [ImageCompositionLayer]()
|
|
121
43
|
var textLayers = [TextCompositionLayer]()
|
|
122
|
-
|
|
44
|
+
|
|
123
45
|
var mattedLayer: CompositionLayer? = nil
|
|
124
46
|
|
|
125
47
|
for layer in layers.reversed() {
|
|
@@ -137,14 +59,16 @@ final class AnimationContainer: CALayer {
|
|
|
137
59
|
mattedLayer = nil
|
|
138
60
|
continue
|
|
139
61
|
}
|
|
140
|
-
if
|
|
141
|
-
|
|
62
|
+
if
|
|
63
|
+
let matte = layer.matteType,
|
|
64
|
+
matte == .add || matte == .invert
|
|
65
|
+
{
|
|
142
66
|
/// We have a layer that requires a matte.
|
|
143
67
|
mattedLayer = layer
|
|
144
68
|
}
|
|
145
69
|
addSublayer(layer)
|
|
146
70
|
}
|
|
147
|
-
|
|
71
|
+
|
|
148
72
|
layerImageProvider.addImageLayers(imageLayers)
|
|
149
73
|
layerImageProvider.reloadImages()
|
|
150
74
|
layerTextProvider.addTextLayers(textLayers)
|
|
@@ -153,64 +77,200 @@ final class AnimationContainer: CALayer {
|
|
|
153
77
|
layerFontProvider.reloadTexts()
|
|
154
78
|
setNeedsDisplay()
|
|
155
79
|
}
|
|
156
|
-
|
|
157
|
-
///
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
80
|
+
|
|
81
|
+
/// Called by CoreAnimation to create a shadow copy of this layer
|
|
82
|
+
/// More details: https://developer.apple.com/documentation/quartzcore/calayer/1410842-init
|
|
83
|
+
override init(layer: Any) {
|
|
84
|
+
guard let typedLayer = layer as? Self else {
|
|
85
|
+
fatalError("\(Self.self).init(layer:) incorrectly called with \(type(of: layer))")
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
animationLayers = []
|
|
89
|
+
layerImageProvider = LayerImageProvider(imageProvider: BlankImageProvider(), assets: nil)
|
|
90
|
+
layerTextProvider = LayerTextProvider(textProvider: DefaultTextProvider())
|
|
91
|
+
layerFontProvider = LayerFontProvider(fontProvider: DefaultFontProvider())
|
|
92
|
+
logger = typedLayer.logger
|
|
163
93
|
super.init(layer: layer)
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
required init?(coder aDecoder: NSCoder) {
|
|
94
|
+
|
|
95
|
+
currentFrame = typedLayer.currentFrame
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
required init?(coder _: NSCoder) {
|
|
172
99
|
fatalError("init(coder:) has not been implemented")
|
|
173
100
|
}
|
|
174
|
-
|
|
101
|
+
|
|
102
|
+
// MARK: Public
|
|
103
|
+
|
|
104
|
+
public var respectAnimationFrameRate = false
|
|
105
|
+
|
|
175
106
|
// MARK: CALayer Animations
|
|
176
|
-
|
|
107
|
+
|
|
177
108
|
override public class func needsDisplay(forKey key: String) -> Bool {
|
|
178
109
|
if key == "currentFrame" {
|
|
179
110
|
return true
|
|
180
111
|
}
|
|
181
112
|
return super.needsDisplay(forKey: key)
|
|
182
113
|
}
|
|
183
|
-
|
|
114
|
+
|
|
184
115
|
override public func action(forKey event: String) -> CAAction? {
|
|
185
116
|
if event == "currentFrame" {
|
|
186
117
|
let animation = CABasicAnimation(keyPath: event)
|
|
187
118
|
animation.timingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName.linear)
|
|
188
|
-
animation.fromValue =
|
|
119
|
+
animation.fromValue = presentation()?.currentFrame
|
|
189
120
|
return animation
|
|
190
121
|
}
|
|
191
122
|
return super.action(forKey: event)
|
|
192
123
|
}
|
|
193
|
-
|
|
124
|
+
|
|
194
125
|
public override func display() {
|
|
195
126
|
guard Thread.isMainThread else { return }
|
|
196
127
|
var newFrame: CGFloat
|
|
197
|
-
if
|
|
198
|
-
|
|
199
|
-
|
|
128
|
+
if
|
|
129
|
+
let animationKeys = animationKeys(),
|
|
130
|
+
!animationKeys.isEmpty
|
|
131
|
+
{
|
|
132
|
+
newFrame = presentation()?.currentFrame ?? currentFrame
|
|
200
133
|
} else {
|
|
201
134
|
// We ignore the presentation's frame if there's no animation in the layer.
|
|
202
|
-
newFrame =
|
|
135
|
+
newFrame = currentFrame
|
|
203
136
|
}
|
|
204
137
|
if respectAnimationFrameRate {
|
|
205
138
|
newFrame = floor(newFrame)
|
|
206
139
|
}
|
|
207
|
-
animationLayers.forEach
|
|
140
|
+
animationLayers.forEach { $0.displayWithFrame(frame: newFrame, forceUpdates: false) }
|
|
208
141
|
}
|
|
209
|
-
|
|
210
|
-
}
|
|
211
142
|
|
|
212
|
-
|
|
213
|
-
|
|
143
|
+
// MARK: Internal
|
|
144
|
+
|
|
145
|
+
/// The animatable Current Frame Property
|
|
146
|
+
@NSManaged var currentFrame: CGFloat
|
|
147
|
+
|
|
148
|
+
var animationLayers: ContiguousArray<CompositionLayer>
|
|
149
|
+
|
|
150
|
+
var primaryAnimationKey: AnimationKey {
|
|
151
|
+
.managed
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
var isAnimationPlaying: Bool? {
|
|
155
|
+
nil // this state is managed by `AnimationView`
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
var _animationLayers: [CALayer] {
|
|
159
|
+
Array(animationLayers)
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
var imageProvider: AnimationImageProvider {
|
|
163
|
+
get {
|
|
164
|
+
layerImageProvider.imageProvider
|
|
165
|
+
}
|
|
166
|
+
set {
|
|
167
|
+
layerImageProvider.imageProvider = newValue
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
var renderScale: CGFloat = 1 {
|
|
172
|
+
didSet {
|
|
173
|
+
animationLayers.forEach({ $0.renderScale = renderScale })
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
var textProvider: AnimationTextProvider {
|
|
178
|
+
get { layerTextProvider.textProvider }
|
|
179
|
+
set { layerTextProvider.textProvider = newValue }
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
var fontProvider: AnimationFontProvider {
|
|
183
|
+
get { layerFontProvider.fontProvider }
|
|
184
|
+
set { layerFontProvider.fontProvider = newValue }
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
func reloadImages() {
|
|
188
|
+
layerImageProvider.reloadImages()
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
func removeAnimations() {
|
|
192
|
+
// no-op, since the primary animation is managed by the `AnimationView`.
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/// Forces the view to update its drawing.
|
|
196
|
+
func forceDisplayUpdate() {
|
|
197
|
+
animationLayers.forEach({ $0.displayWithFrame(frame: currentFrame, forceUpdates: true) })
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
func logHierarchyKeypaths() {
|
|
201
|
+
logger.info("Lottie: Logging Animation Keypaths")
|
|
202
|
+
animationLayers.forEach({ $0.logKeypaths(for: nil, logger: self.logger) })
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
func setValueProvider(_ valueProvider: AnyValueProvider, keypath: AnimationKeypath) {
|
|
206
|
+
for layer in animationLayers {
|
|
207
|
+
if let foundProperties = layer.nodeProperties(for: keypath) {
|
|
208
|
+
for property in foundProperties {
|
|
209
|
+
property.setProvider(provider: valueProvider)
|
|
210
|
+
}
|
|
211
|
+
layer.displayWithFrame(frame: presentation()?.currentFrame ?? currentFrame, forceUpdates: true)
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
func getValue(for keypath: AnimationKeypath, atFrame: CGFloat?) -> Any? {
|
|
217
|
+
for layer in animationLayers {
|
|
218
|
+
if
|
|
219
|
+
let foundProperties = layer.nodeProperties(for: keypath),
|
|
220
|
+
let first = foundProperties.first
|
|
221
|
+
{
|
|
222
|
+
return first.valueProvider.value(frame: atFrame ?? currentFrame)
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
return nil
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
func getOriginalValue(for keypath: AnimationKeypath, atFrame: AnimationFrameTime?) -> Any? {
|
|
229
|
+
for layer in animationLayers {
|
|
230
|
+
if
|
|
231
|
+
let foundProperties = layer.nodeProperties(for: keypath),
|
|
232
|
+
let first = foundProperties.first
|
|
233
|
+
{
|
|
234
|
+
return first.originalValueProvider.value(frame: atFrame ?? currentFrame)
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
return nil
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
func layer(for keypath: AnimationKeypath) -> CALayer? {
|
|
241
|
+
for layer in animationLayers {
|
|
242
|
+
if let foundLayer = layer.layer(for: keypath) {
|
|
243
|
+
return foundLayer
|
|
244
|
+
}
|
|
245
|
+
}
|
|
214
246
|
return nil
|
|
215
247
|
}
|
|
248
|
+
|
|
249
|
+
func animatorNodes(for keypath: AnimationKeypath) -> [AnimatorNode]? {
|
|
250
|
+
var results = [AnimatorNode]()
|
|
251
|
+
for layer in animationLayers {
|
|
252
|
+
if let nodes = layer.animatorNodes(for: keypath) {
|
|
253
|
+
results.append(contentsOf: nodes)
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
if results.count == 0 {
|
|
257
|
+
return nil
|
|
258
|
+
}
|
|
259
|
+
return results
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
// MARK: Fileprivate
|
|
263
|
+
|
|
264
|
+
fileprivate let layerImageProvider: LayerImageProvider
|
|
265
|
+
fileprivate let layerTextProvider: LayerTextProvider
|
|
266
|
+
fileprivate let layerFontProvider: LayerFontProvider
|
|
267
|
+
fileprivate let logger: LottieLogger
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
// MARK: - BlankImageProvider
|
|
271
|
+
|
|
272
|
+
private class BlankImageProvider: AnimationImageProvider {
|
|
273
|
+
func imageForAsset(asset _: ImageAsset) -> CGImage? {
|
|
274
|
+
nil
|
|
275
|
+
}
|
|
216
276
|
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
// Created by Jianjun Wu on 2022/5/12.
|
|
2
|
+
// Copyright © 2022 Airbnb Inc. All rights reserved.
|
|
3
|
+
|
|
4
|
+
import CoreGraphics
|
|
5
|
+
import Foundation
|
|
6
|
+
|
|
7
|
+
// MARK: - CachedImageProvider
|
|
8
|
+
|
|
9
|
+
private final class CachedImageProvider: AnimationImageProvider {
|
|
10
|
+
|
|
11
|
+
// MARK: Lifecycle
|
|
12
|
+
|
|
13
|
+
/// Initializes an image provider with an image provider
|
|
14
|
+
///
|
|
15
|
+
/// - Parameter imageProvider: The provider to load image from asset
|
|
16
|
+
///
|
|
17
|
+
public init(imageProvider: AnimationImageProvider) {
|
|
18
|
+
self.imageProvider = imageProvider
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
// MARK: Public
|
|
22
|
+
|
|
23
|
+
public func imageForAsset(asset: ImageAsset) -> CGImage? {
|
|
24
|
+
if let image = imageCache.object(forKey: asset.id as NSString) {
|
|
25
|
+
return image
|
|
26
|
+
}
|
|
27
|
+
if let image = imageProvider.imageForAsset(asset: asset) {
|
|
28
|
+
imageCache.setObject(image, forKey: asset.id as NSString)
|
|
29
|
+
return image
|
|
30
|
+
}
|
|
31
|
+
return nil
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// MARK: Internal
|
|
35
|
+
|
|
36
|
+
let imageCache: NSCache<NSString, CGImage> = .init()
|
|
37
|
+
let imageProvider: AnimationImageProvider
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
extension AnimationImageProvider {
|
|
41
|
+
/// Create a cache enabled image provider which will reuse the asset image with the same asset id
|
|
42
|
+
/// It wraps the current provider as image loader, and uses `NSCache` to cache the images for resue.
|
|
43
|
+
/// The cache will be reset when the `animation` is reset.
|
|
44
|
+
var cachedImageProvider: AnimationImageProvider {
|
|
45
|
+
CachedImageProvider(imageProvider: self)
|
|
46
|
+
}
|
|
47
|
+
}
|
|
@@ -5,22 +5,24 @@
|
|
|
5
5
|
// Created by Brandon Withrow on 1/25/19.
|
|
6
6
|
//
|
|
7
7
|
|
|
8
|
-
import Foundation
|
|
9
8
|
import CoreGraphics
|
|
9
|
+
import Foundation
|
|
10
10
|
|
|
11
11
|
extension Array where Element == LayerModel {
|
|
12
|
-
|
|
13
|
-
func initializeCompositionLayers(
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
12
|
+
|
|
13
|
+
func initializeCompositionLayers(
|
|
14
|
+
assetLibrary: AssetLibrary?,
|
|
15
|
+
layerImageProvider: LayerImageProvider,
|
|
16
|
+
textProvider: AnimationTextProvider,
|
|
17
|
+
fontProvider: AnimationFontProvider,
|
|
18
|
+
frameRate: CGFloat) -> [CompositionLayer]
|
|
19
|
+
{
|
|
18
20
|
var compositionLayers = [CompositionLayer]()
|
|
19
21
|
var layerMap = [Int : CompositionLayer]()
|
|
20
|
-
|
|
22
|
+
|
|
21
23
|
/// Organize the assets into a dictionary of [ID : ImageAsset]
|
|
22
24
|
var childLayers = [LayerModel]()
|
|
23
|
-
|
|
25
|
+
|
|
24
26
|
for layer in self {
|
|
25
27
|
if layer.hidden == true {
|
|
26
28
|
let genericLayer = NullCompositionLayer(layer: layer)
|
|
@@ -34,22 +36,29 @@ extension Array where Element == LayerModel {
|
|
|
34
36
|
let solidContainer = SolidCompositionLayer(solid: solidLayer)
|
|
35
37
|
compositionLayers.append(solidContainer)
|
|
36
38
|
layerMap[layer.index] = solidContainer
|
|
37
|
-
} else if
|
|
39
|
+
} else if
|
|
40
|
+
let precompLayer = layer as? PreCompLayerModel,
|
|
38
41
|
let assetLibrary = assetLibrary,
|
|
39
|
-
let precompAsset = assetLibrary.precompAssets[precompLayer.referenceID]
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
42
|
+
let precompAsset = assetLibrary.precompAssets[precompLayer.referenceID]
|
|
43
|
+
{
|
|
44
|
+
let precompContainer = PreCompositionLayer(
|
|
45
|
+
precomp: precompLayer,
|
|
46
|
+
asset: precompAsset,
|
|
47
|
+
layerImageProvider: layerImageProvider,
|
|
48
|
+
textProvider: textProvider,
|
|
49
|
+
fontProvider: fontProvider,
|
|
50
|
+
assetLibrary: assetLibrary,
|
|
51
|
+
frameRate: frameRate)
|
|
47
52
|
compositionLayers.append(precompContainer)
|
|
48
53
|
layerMap[layer.index] = precompContainer
|
|
49
|
-
} else if
|
|
54
|
+
} else if
|
|
55
|
+
let imageLayer = layer as? ImageLayerModel,
|
|
50
56
|
let assetLibrary = assetLibrary,
|
|
51
|
-
let imageAsset = assetLibrary.imageAssets[imageLayer.referenceID]
|
|
52
|
-
|
|
57
|
+
let imageAsset = assetLibrary.imageAssets[imageLayer.referenceID]
|
|
58
|
+
{
|
|
59
|
+
let imageContainer = ImageCompositionLayer(
|
|
60
|
+
imageLayer: imageLayer,
|
|
61
|
+
size: CGSize(width: imageAsset.width, height: imageAsset.height))
|
|
53
62
|
compositionLayers.append(imageContainer)
|
|
54
63
|
layerMap[layer.index] = imageContainer
|
|
55
64
|
} else if let textLayer = layer as? TextLayerModel {
|
|
@@ -65,7 +74,7 @@ extension Array where Element == LayerModel {
|
|
|
65
74
|
childLayers.append(layer)
|
|
66
75
|
}
|
|
67
76
|
}
|
|
68
|
-
|
|
77
|
+
|
|
69
78
|
/// Now link children with their parents
|
|
70
79
|
for layerModel in childLayers {
|
|
71
80
|
if let parentID = layerModel.parent {
|
|
@@ -74,8 +83,8 @@ extension Array where Element == LayerModel {
|
|
|
74
83
|
childLayer?.transformNode.parentNode = parentLayer?.transformNode
|
|
75
84
|
}
|
|
76
85
|
}
|
|
77
|
-
|
|
86
|
+
|
|
78
87
|
return compositionLayers
|
|
79
88
|
}
|
|
80
|
-
|
|
89
|
+
|
|
81
90
|
}
|