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,100 +5,106 @@
|
|
|
5
5
|
// Created by Brandon Withrow on 2/19/19.
|
|
6
6
|
//
|
|
7
7
|
|
|
8
|
-
import Foundation
|
|
9
8
|
import CoreGraphics
|
|
9
|
+
import Foundation
|
|
10
10
|
import QuartzCore
|
|
11
11
|
|
|
12
|
+
// MARK: - TextAnimatorNodeProperties
|
|
13
|
+
|
|
12
14
|
final class TextAnimatorNodeProperties: NodePropertyMap, KeypathSearchable {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
15
|
+
|
|
16
|
+
// MARK: Lifecycle
|
|
17
|
+
|
|
16
18
|
init(textAnimator: TextAnimator) {
|
|
17
|
-
|
|
19
|
+
keypathName = textAnimator.name
|
|
18
20
|
var properties = [String : AnyNodeProperty]()
|
|
19
|
-
|
|
21
|
+
|
|
20
22
|
if let keyframeGroup = textAnimator.anchor {
|
|
21
|
-
|
|
22
|
-
properties["Anchor"] =
|
|
23
|
+
anchor = NodeProperty(provider: KeyframeInterpolator(keyframes: keyframeGroup.keyframes))
|
|
24
|
+
properties["Anchor"] = anchor
|
|
23
25
|
} else {
|
|
24
|
-
|
|
26
|
+
anchor = nil
|
|
25
27
|
}
|
|
26
|
-
|
|
28
|
+
|
|
27
29
|
if let keyframeGroup = textAnimator.position {
|
|
28
|
-
|
|
29
|
-
properties["Position"] =
|
|
30
|
+
position = NodeProperty(provider: KeyframeInterpolator(keyframes: keyframeGroup.keyframes))
|
|
31
|
+
properties["Position"] = position
|
|
30
32
|
} else {
|
|
31
|
-
|
|
33
|
+
position = nil
|
|
32
34
|
}
|
|
33
|
-
|
|
35
|
+
|
|
34
36
|
if let keyframeGroup = textAnimator.scale {
|
|
35
|
-
|
|
36
|
-
properties["Scale"] =
|
|
37
|
+
scale = NodeProperty(provider: KeyframeInterpolator(keyframes: keyframeGroup.keyframes))
|
|
38
|
+
properties["Scale"] = scale
|
|
37
39
|
} else {
|
|
38
|
-
|
|
40
|
+
scale = nil
|
|
39
41
|
}
|
|
40
|
-
|
|
42
|
+
|
|
41
43
|
if let keyframeGroup = textAnimator.skew {
|
|
42
|
-
|
|
43
|
-
properties["Skew"] =
|
|
44
|
+
skew = NodeProperty(provider: KeyframeInterpolator(keyframes: keyframeGroup.keyframes))
|
|
45
|
+
properties["Skew"] = skew
|
|
44
46
|
} else {
|
|
45
|
-
|
|
47
|
+
skew = nil
|
|
46
48
|
}
|
|
47
|
-
|
|
49
|
+
|
|
48
50
|
if let keyframeGroup = textAnimator.skewAxis {
|
|
49
|
-
|
|
50
|
-
properties["Skew Axis"] =
|
|
51
|
+
skewAxis = NodeProperty(provider: KeyframeInterpolator(keyframes: keyframeGroup.keyframes))
|
|
52
|
+
properties["Skew Axis"] = skewAxis
|
|
51
53
|
} else {
|
|
52
|
-
|
|
54
|
+
skewAxis = nil
|
|
53
55
|
}
|
|
54
|
-
|
|
56
|
+
|
|
55
57
|
if let keyframeGroup = textAnimator.rotation {
|
|
56
|
-
|
|
57
|
-
properties["Rotation"] =
|
|
58
|
+
rotation = NodeProperty(provider: KeyframeInterpolator(keyframes: keyframeGroup.keyframes))
|
|
59
|
+
properties["Rotation"] = rotation
|
|
58
60
|
} else {
|
|
59
|
-
|
|
61
|
+
rotation = nil
|
|
60
62
|
}
|
|
61
|
-
|
|
63
|
+
|
|
62
64
|
if let keyframeGroup = textAnimator.opacity {
|
|
63
|
-
|
|
64
|
-
properties["Opacity"] =
|
|
65
|
+
opacity = NodeProperty(provider: KeyframeInterpolator(keyframes: keyframeGroup.keyframes))
|
|
66
|
+
properties["Opacity"] = opacity
|
|
65
67
|
} else {
|
|
66
|
-
|
|
68
|
+
opacity = nil
|
|
67
69
|
}
|
|
68
|
-
|
|
70
|
+
|
|
69
71
|
if let keyframeGroup = textAnimator.strokeColor {
|
|
70
|
-
|
|
71
|
-
properties["Stroke Color"] =
|
|
72
|
+
strokeColor = NodeProperty(provider: KeyframeInterpolator(keyframes: keyframeGroup.keyframes))
|
|
73
|
+
properties["Stroke Color"] = strokeColor
|
|
72
74
|
} else {
|
|
73
|
-
|
|
75
|
+
strokeColor = nil
|
|
74
76
|
}
|
|
75
|
-
|
|
77
|
+
|
|
76
78
|
if let keyframeGroup = textAnimator.fillColor {
|
|
77
|
-
|
|
78
|
-
properties["Fill Color"] =
|
|
79
|
+
fillColor = NodeProperty(provider: KeyframeInterpolator(keyframes: keyframeGroup.keyframes))
|
|
80
|
+
properties["Fill Color"] = fillColor
|
|
79
81
|
} else {
|
|
80
|
-
|
|
82
|
+
fillColor = nil
|
|
81
83
|
}
|
|
82
|
-
|
|
84
|
+
|
|
83
85
|
if let keyframeGroup = textAnimator.strokeWidth {
|
|
84
|
-
|
|
85
|
-
properties["Stroke Width"] =
|
|
86
|
+
strokeWidth = NodeProperty(provider: KeyframeInterpolator(keyframes: keyframeGroup.keyframes))
|
|
87
|
+
properties["Stroke Width"] = strokeWidth
|
|
86
88
|
} else {
|
|
87
|
-
|
|
89
|
+
strokeWidth = nil
|
|
88
90
|
}
|
|
89
|
-
|
|
91
|
+
|
|
90
92
|
if let keyframeGroup = textAnimator.tracking {
|
|
91
|
-
|
|
92
|
-
properties["Tracking"] =
|
|
93
|
+
tracking = NodeProperty(provider: KeyframeInterpolator(keyframes: keyframeGroup.keyframes))
|
|
94
|
+
properties["Tracking"] = tracking
|
|
93
95
|
} else {
|
|
94
|
-
|
|
96
|
+
tracking = nil
|
|
95
97
|
}
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
98
|
+
|
|
99
|
+
keypathProperties = properties
|
|
100
|
+
|
|
99
101
|
self.properties = Array(keypathProperties.values)
|
|
100
102
|
}
|
|
101
|
-
|
|
103
|
+
|
|
104
|
+
// MARK: Internal
|
|
105
|
+
|
|
106
|
+
let keypathName: String
|
|
107
|
+
|
|
102
108
|
let anchor: NodeProperty<Vector3D>?
|
|
103
109
|
let position: NodeProperty<Vector3D>?
|
|
104
110
|
let scale: NodeProperty<Vector3D>?
|
|
@@ -110,137 +116,150 @@ final class TextAnimatorNodeProperties: NodePropertyMap, KeypathSearchable {
|
|
|
110
116
|
let fillColor: NodeProperty<Color>?
|
|
111
117
|
let strokeWidth: NodeProperty<Vector1D>?
|
|
112
118
|
let tracking: NodeProperty<Vector1D>?
|
|
113
|
-
|
|
114
|
-
let keypathProperties: [String
|
|
119
|
+
|
|
120
|
+
let keypathProperties: [String: AnyNodeProperty]
|
|
115
121
|
let properties: [AnyNodeProperty]
|
|
116
|
-
|
|
122
|
+
|
|
117
123
|
var caTransform: CATransform3D {
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
+
CATransform3D.makeTransform(
|
|
125
|
+
anchor: anchor?.value.pointValue ?? .zero,
|
|
126
|
+
position: position?.value.pointValue ?? .zero,
|
|
127
|
+
scale: scale?.value.sizeValue ?? CGSize(width: 100, height: 100),
|
|
128
|
+
rotation: rotation?.value.cgFloatValue ?? 0,
|
|
129
|
+
skew: skew?.value.cgFloatValue,
|
|
130
|
+
skewAxis: skewAxis?.value.cgFloatValue)
|
|
124
131
|
}
|
|
125
132
|
}
|
|
126
133
|
|
|
134
|
+
// MARK: - TextOutputNode
|
|
135
|
+
|
|
127
136
|
final class TextOutputNode: NodeOutput {
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
137
|
+
|
|
138
|
+
// MARK: Lifecycle
|
|
139
|
+
|
|
140
|
+
init(parent: TextOutputNode?) {
|
|
141
|
+
parentTextNode = parent
|
|
131
142
|
}
|
|
132
|
-
|
|
143
|
+
|
|
144
|
+
// MARK: Internal
|
|
145
|
+
|
|
133
146
|
var parentTextNode: TextOutputNode?
|
|
134
|
-
var isEnabled
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
147
|
+
var isEnabled = true
|
|
148
|
+
|
|
149
|
+
var outputPath: CGPath?
|
|
150
|
+
|
|
151
|
+
var parent: NodeOutput? {
|
|
152
|
+
parentTextNode
|
|
138
153
|
}
|
|
139
154
|
|
|
140
|
-
fileprivate var _xform: CATransform3D?
|
|
141
|
-
fileprivate var _opacity: CGFloat?
|
|
142
|
-
fileprivate var _strokeColor: CGColor?
|
|
143
|
-
fileprivate var _fillColor: CGColor?
|
|
144
|
-
fileprivate var _tracking: CGFloat?
|
|
145
|
-
fileprivate var _strokeWidth: CGFloat?
|
|
146
|
-
|
|
147
155
|
var xform: CATransform3D {
|
|
148
156
|
get {
|
|
149
|
-
|
|
157
|
+
_xform ?? parentTextNode?.xform ?? CATransform3DIdentity
|
|
150
158
|
}
|
|
151
159
|
set {
|
|
152
160
|
_xform = newValue
|
|
153
161
|
}
|
|
154
162
|
}
|
|
155
|
-
|
|
163
|
+
|
|
156
164
|
var opacity: CGFloat {
|
|
157
165
|
get {
|
|
158
|
-
|
|
166
|
+
_opacity ?? parentTextNode?.opacity ?? 1
|
|
159
167
|
}
|
|
160
168
|
set {
|
|
161
169
|
_opacity = newValue
|
|
162
170
|
}
|
|
163
171
|
}
|
|
164
|
-
|
|
172
|
+
|
|
165
173
|
var strokeColor: CGColor? {
|
|
166
174
|
get {
|
|
167
|
-
|
|
175
|
+
_strokeColor ?? parentTextNode?.strokeColor
|
|
168
176
|
}
|
|
169
177
|
set {
|
|
170
178
|
_strokeColor = newValue
|
|
171
179
|
}
|
|
172
180
|
}
|
|
173
|
-
|
|
181
|
+
|
|
174
182
|
var fillColor: CGColor? {
|
|
175
183
|
get {
|
|
176
|
-
|
|
184
|
+
_fillColor ?? parentTextNode?.fillColor
|
|
177
185
|
}
|
|
178
186
|
set {
|
|
179
187
|
_fillColor = newValue
|
|
180
188
|
}
|
|
181
189
|
}
|
|
182
|
-
|
|
190
|
+
|
|
183
191
|
var tracking: CGFloat {
|
|
184
192
|
get {
|
|
185
|
-
|
|
193
|
+
_tracking ?? parentTextNode?.tracking ?? 0
|
|
186
194
|
}
|
|
187
195
|
set {
|
|
188
196
|
_tracking = newValue
|
|
189
197
|
}
|
|
190
198
|
}
|
|
191
|
-
|
|
199
|
+
|
|
192
200
|
var strokeWidth: CGFloat {
|
|
193
201
|
get {
|
|
194
|
-
|
|
202
|
+
_strokeWidth ?? parentTextNode?.strokeWidth ?? 0
|
|
195
203
|
}
|
|
196
204
|
set {
|
|
197
205
|
_strokeWidth = newValue
|
|
198
206
|
}
|
|
199
207
|
}
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
func hasOutputUpdates(_ forFrame: CGFloat) -> Bool {
|
|
208
|
+
|
|
209
|
+
func hasOutputUpdates(_: CGFloat) -> Bool {
|
|
203
210
|
// TODO Fix This
|
|
204
|
-
|
|
211
|
+
true
|
|
205
212
|
}
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
213
|
+
|
|
214
|
+
// MARK: Fileprivate
|
|
215
|
+
|
|
216
|
+
fileprivate var _xform: CATransform3D?
|
|
217
|
+
fileprivate var _opacity: CGFloat?
|
|
218
|
+
fileprivate var _strokeColor: CGColor?
|
|
219
|
+
fileprivate var _fillColor: CGColor?
|
|
220
|
+
fileprivate var _tracking: CGFloat?
|
|
221
|
+
fileprivate var _strokeWidth: CGFloat?
|
|
209
222
|
}
|
|
210
223
|
|
|
224
|
+
// MARK: - TextAnimatorNode
|
|
225
|
+
|
|
211
226
|
class TextAnimatorNode: AnimatorNode {
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
var outputNode: NodeOutput {
|
|
216
|
-
return textOutputNode
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
let textAnimatorProperties: TextAnimatorNodeProperties
|
|
220
|
-
|
|
227
|
+
|
|
228
|
+
// MARK: Lifecycle
|
|
229
|
+
|
|
221
230
|
init(parentNode: TextAnimatorNode?, textAnimator: TextAnimator) {
|
|
222
|
-
|
|
223
|
-
|
|
231
|
+
textOutputNode = TextOutputNode(parent: parentNode?.textOutputNode)
|
|
232
|
+
textAnimatorProperties = TextAnimatorNodeProperties(textAnimator: textAnimator)
|
|
224
233
|
self.parentNode = parentNode
|
|
225
234
|
}
|
|
226
|
-
|
|
235
|
+
|
|
236
|
+
// MARK: Internal
|
|
237
|
+
|
|
238
|
+
let textOutputNode: TextOutputNode
|
|
239
|
+
|
|
240
|
+
let textAnimatorProperties: TextAnimatorNodeProperties
|
|
241
|
+
|
|
242
|
+
let parentNode: AnimatorNode?
|
|
243
|
+
var hasLocalUpdates = false
|
|
244
|
+
var hasUpstreamUpdates = false
|
|
245
|
+
var lastUpdateFrame: CGFloat? = nil
|
|
246
|
+
var isEnabled = true
|
|
247
|
+
|
|
248
|
+
var outputNode: NodeOutput {
|
|
249
|
+
textOutputNode
|
|
250
|
+
}
|
|
251
|
+
|
|
227
252
|
// MARK: Animator Node Protocol
|
|
228
|
-
|
|
253
|
+
|
|
229
254
|
var propertyMap: NodePropertyMap & KeypathSearchable {
|
|
230
|
-
|
|
255
|
+
textAnimatorProperties
|
|
231
256
|
}
|
|
232
|
-
|
|
233
|
-
let parentNode: AnimatorNode?
|
|
234
|
-
var hasLocalUpdates: Bool = false
|
|
235
|
-
var hasUpstreamUpdates: Bool = false
|
|
236
|
-
var lastUpdateFrame: CGFloat? = nil
|
|
237
|
-
var isEnabled: Bool = true
|
|
238
|
-
|
|
257
|
+
|
|
239
258
|
func localUpdatesPermeateDownstream() -> Bool {
|
|
240
|
-
|
|
259
|
+
true
|
|
241
260
|
}
|
|
242
|
-
|
|
243
|
-
func rebuildOutputs(frame: CGFloat) {
|
|
261
|
+
|
|
262
|
+
func rebuildOutputs(frame _: CGFloat) {
|
|
244
263
|
textOutputNode.xform = textAnimatorProperties.caTransform
|
|
245
264
|
textOutputNode.opacity = (textAnimatorProperties.opacity?.value.cgFloatValue ?? 100) * 0.01
|
|
246
265
|
textOutputNode.strokeColor = textAnimatorProperties.strokeColor?.value.cgColorValue
|
|
@@ -8,125 +8,126 @@
|
|
|
8
8
|
import Foundation
|
|
9
9
|
import QuartzCore
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
11
|
+
// MARK: - NodeOutput
|
|
12
|
+
|
|
13
|
+
/// Defines the basic outputs of an animator node.
|
|
14
|
+
///
|
|
15
15
|
protocol NodeOutput {
|
|
16
|
-
|
|
16
|
+
|
|
17
17
|
/// The parent node.
|
|
18
18
|
var parent: NodeOutput? { get }
|
|
19
|
-
|
|
19
|
+
|
|
20
20
|
/// Returns true if there are any updates upstream. OutputPath must be built before returning.
|
|
21
21
|
func hasOutputUpdates(_ forFrame: CGFloat) -> Bool
|
|
22
|
-
|
|
22
|
+
|
|
23
23
|
var outputPath: CGPath? { get }
|
|
24
|
-
|
|
24
|
+
|
|
25
25
|
var isEnabled: Bool { get set }
|
|
26
26
|
}
|
|
27
27
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
the
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
28
|
+
// MARK: - AnimatorNode
|
|
29
|
+
|
|
30
|
+
/// The Animator Node is the base node in the render system tree.
|
|
31
|
+
///
|
|
32
|
+
/// It defines a single node that has an output path and option input node.
|
|
33
|
+
/// At animation time the root animation node is asked to update its contents for
|
|
34
|
+
/// the current frame.
|
|
35
|
+
/// The node reaches up its chain of nodes until the first node that does not need
|
|
36
|
+
/// updating is found. Then each node updates its contents down the render pipeline.
|
|
37
|
+
/// Each node adds its local path to its input path and passes it forward.
|
|
38
|
+
///
|
|
39
|
+
/// An animator node holds a group of interpolators. These interpolators determine
|
|
40
|
+
/// if the node needs an update for the current frame.
|
|
41
|
+
///
|
|
42
42
|
protocol AnimatorNode: AnyObject, KeypathSearchable {
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
*/
|
|
43
|
+
|
|
44
|
+
/// The available properties of the Node.
|
|
45
|
+
///
|
|
46
|
+
/// These properties are automatically updated each frame.
|
|
47
|
+
/// These properties are also settable and gettable through the dynamic
|
|
48
|
+
/// property system.
|
|
49
|
+
///
|
|
52
50
|
var propertyMap: NodePropertyMap & KeypathSearchable { get }
|
|
53
|
-
|
|
51
|
+
|
|
54
52
|
/// The upstream input node
|
|
55
53
|
var parentNode: AnimatorNode? { get }
|
|
56
|
-
|
|
54
|
+
|
|
57
55
|
/// The output of the node.
|
|
58
56
|
var outputNode: NodeOutput { get }
|
|
59
|
-
|
|
57
|
+
|
|
60
58
|
/// Update the outputs of the node. Called if local contents were update or if outputsNeedUpdate returns true.
|
|
61
59
|
func rebuildOutputs(frame: CGFloat)
|
|
62
|
-
|
|
60
|
+
|
|
63
61
|
/// Setters for marking current node state.
|
|
64
62
|
var isEnabled: Bool { get set }
|
|
65
63
|
var hasLocalUpdates: Bool { get set }
|
|
66
64
|
var hasUpstreamUpdates: Bool { get set }
|
|
67
65
|
var lastUpdateFrame: CGFloat? { get set }
|
|
68
|
-
|
|
66
|
+
|
|
69
67
|
// MARK: Optional
|
|
70
|
-
|
|
68
|
+
|
|
71
69
|
/// Marks if updates to this node affect nodes downstream.
|
|
72
70
|
func localUpdatesPermeateDownstream() -> Bool
|
|
73
71
|
func forceUpstreamOutputUpdates() -> Bool
|
|
74
|
-
|
|
72
|
+
|
|
75
73
|
/// Called at the end of this nodes update cycle. Always called. Optional.
|
|
76
74
|
func performAdditionalLocalUpdates(frame: CGFloat, forceLocalUpdate: Bool) -> Bool
|
|
77
75
|
func performAdditionalOutputUpdates(_ frame: CGFloat, forceOutputUpdate: Bool)
|
|
78
|
-
|
|
76
|
+
|
|
79
77
|
/// The default simply returns `hasLocalUpdates`
|
|
80
78
|
func shouldRebuildOutputs(frame: CGFloat) -> Bool
|
|
81
79
|
}
|
|
82
80
|
|
|
83
81
|
/// Basic Node Logic
|
|
84
82
|
extension AnimatorNode {
|
|
85
|
-
|
|
86
|
-
func shouldRebuildOutputs(frame: CGFloat) -> Bool {
|
|
87
|
-
|
|
83
|
+
|
|
84
|
+
func shouldRebuildOutputs(frame _: CGFloat) -> Bool {
|
|
85
|
+
hasLocalUpdates
|
|
88
86
|
}
|
|
89
|
-
|
|
87
|
+
|
|
90
88
|
func localUpdatesPermeateDownstream() -> Bool {
|
|
91
89
|
/// Optional override
|
|
92
|
-
|
|
90
|
+
true
|
|
93
91
|
}
|
|
94
|
-
|
|
92
|
+
|
|
95
93
|
func forceUpstreamOutputUpdates() -> Bool {
|
|
96
94
|
/// Optional
|
|
97
|
-
|
|
95
|
+
false
|
|
98
96
|
}
|
|
99
|
-
|
|
100
|
-
func performAdditionalLocalUpdates(frame: CGFloat, forceLocalUpdate: Bool) -> Bool {
|
|
97
|
+
|
|
98
|
+
func performAdditionalLocalUpdates(frame _: CGFloat, forceLocalUpdate: Bool) -> Bool {
|
|
101
99
|
/// Optional
|
|
102
|
-
|
|
100
|
+
forceLocalUpdate
|
|
103
101
|
}
|
|
104
|
-
|
|
105
|
-
func performAdditionalOutputUpdates(_
|
|
102
|
+
|
|
103
|
+
func performAdditionalOutputUpdates(_: CGFloat, forceOutputUpdate _: Bool) {
|
|
106
104
|
/// Optional
|
|
107
105
|
}
|
|
108
106
|
|
|
109
|
-
@discardableResult
|
|
107
|
+
@discardableResult
|
|
108
|
+
func updateOutputs(_ frame: CGFloat, forceOutputUpdate: Bool) -> Bool {
|
|
110
109
|
guard isEnabled else {
|
|
111
110
|
// Disabled node, pass through.
|
|
112
111
|
lastUpdateFrame = frame
|
|
113
112
|
return parentNode?.updateOutputs(frame, forceOutputUpdate: forceOutputUpdate) ?? false
|
|
114
113
|
}
|
|
115
|
-
|
|
114
|
+
|
|
116
115
|
if forceOutputUpdate == false && lastUpdateFrame != nil && lastUpdateFrame! == frame {
|
|
117
116
|
/// This node has already updated for this frame. Go ahead and return the results.
|
|
118
117
|
return hasUpstreamUpdates || hasLocalUpdates
|
|
119
118
|
}
|
|
120
119
|
|
|
121
120
|
/// Ask if this node should force output updates upstream.
|
|
122
|
-
let forceUpstreamUpdates =
|
|
123
|
-
|
|
121
|
+
let forceUpstreamUpdates = forceOutputUpdate || forceUpstreamOutputUpdates()
|
|
122
|
+
|
|
124
123
|
/// Perform upstream output updates. Optionally mark upstream updates if any.
|
|
125
|
-
hasUpstreamUpdates = (
|
|
126
|
-
|
|
124
|
+
hasUpstreamUpdates = (
|
|
125
|
+
parentNode?
|
|
126
|
+
.updateOutputs(frame, forceOutputUpdate: forceUpstreamUpdates) ?? false || hasUpstreamUpdates)
|
|
127
|
+
|
|
127
128
|
/// Perform additional local output updates
|
|
128
129
|
performAdditionalOutputUpdates(frame, forceOutputUpdate: forceUpstreamUpdates)
|
|
129
|
-
|
|
130
|
+
|
|
130
131
|
/// If there are local updates, or if updates have been force, rebuild outputs
|
|
131
132
|
if forceUpstreamUpdates || shouldRebuildOutputs(frame: frame) {
|
|
132
133
|
lastUpdateFrame = frame
|
|
@@ -134,64 +135,64 @@ extension AnimatorNode {
|
|
|
134
135
|
}
|
|
135
136
|
return hasUpstreamUpdates || hasLocalUpdates
|
|
136
137
|
}
|
|
137
|
-
|
|
138
|
-
|
|
138
|
+
|
|
139
139
|
/// Rebuilds the content of this node, and upstream nodes if necessary.
|
|
140
|
-
@discardableResult
|
|
140
|
+
@discardableResult
|
|
141
|
+
func updateContents(_ frame: CGFloat, forceLocalUpdate: Bool) -> Bool {
|
|
141
142
|
guard isEnabled else {
|
|
142
143
|
// Disabled node, pass through.
|
|
143
144
|
return parentNode?.updateContents(frame, forceLocalUpdate: forceLocalUpdate) ?? false
|
|
144
145
|
}
|
|
145
|
-
|
|
146
|
+
|
|
146
147
|
if forceLocalUpdate == false && lastUpdateFrame != nil && lastUpdateFrame! == frame {
|
|
147
148
|
/// This node has already updated for this frame. Go ahead and return the results.
|
|
148
149
|
return localUpdatesPermeateDownstream() ? hasUpstreamUpdates || hasLocalUpdates : hasUpstreamUpdates
|
|
149
150
|
}
|
|
150
|
-
|
|
151
|
+
|
|
151
152
|
/// Are there local updates? If so mark the node.
|
|
152
153
|
hasLocalUpdates = forceLocalUpdate ? forceLocalUpdate : propertyMap.needsLocalUpdate(frame: frame)
|
|
153
|
-
|
|
154
|
+
|
|
154
155
|
/// Were there upstream updates? If so mark the node
|
|
155
156
|
hasUpstreamUpdates = parentNode?.updateContents(frame, forceLocalUpdate: forceLocalUpdate) ?? false
|
|
156
|
-
|
|
157
|
+
|
|
157
158
|
/// Perform property updates if necessary.
|
|
158
159
|
if hasLocalUpdates {
|
|
159
160
|
/// Rebuild local properties
|
|
160
161
|
propertyMap.updateNodeProperties(frame: frame)
|
|
161
162
|
}
|
|
162
|
-
|
|
163
|
+
|
|
163
164
|
/// Ask the node to perform any other updates it might have.
|
|
164
165
|
hasUpstreamUpdates = performAdditionalLocalUpdates(frame: frame, forceLocalUpdate: forceLocalUpdate) || hasUpstreamUpdates
|
|
165
|
-
|
|
166
|
+
|
|
166
167
|
/// If the node can update nodes downstream, notify them, otherwise pass on any upstream updates downstream.
|
|
167
168
|
return localUpdatesPermeateDownstream() ? hasUpstreamUpdates || hasLocalUpdates : hasUpstreamUpdates
|
|
168
169
|
}
|
|
169
|
-
|
|
170
|
+
|
|
170
171
|
func updateTree(_ frame: CGFloat, forceUpdates: Bool = false) {
|
|
171
172
|
updateContents(frame, forceLocalUpdate: forceUpdates)
|
|
172
173
|
updateOutputs(frame, forceOutputUpdate: forceUpdates)
|
|
173
174
|
}
|
|
174
|
-
|
|
175
|
+
|
|
175
176
|
}
|
|
176
177
|
|
|
177
178
|
extension AnimatorNode {
|
|
178
179
|
/// Default implementation for Keypath searchable.
|
|
179
180
|
/// Forward all calls to the propertyMap.
|
|
180
|
-
|
|
181
|
+
|
|
181
182
|
var keypathName: String {
|
|
182
|
-
|
|
183
|
+
propertyMap.keypathName
|
|
183
184
|
}
|
|
184
|
-
|
|
185
|
-
var keypathProperties: [String
|
|
186
|
-
|
|
185
|
+
|
|
186
|
+
var keypathProperties: [String: AnyNodeProperty] {
|
|
187
|
+
propertyMap.keypathProperties
|
|
187
188
|
}
|
|
188
|
-
|
|
189
|
+
|
|
189
190
|
var childKeypaths: [KeypathSearchable] {
|
|
190
|
-
|
|
191
|
+
propertyMap.childKeypaths
|
|
191
192
|
}
|
|
192
|
-
|
|
193
|
+
|
|
193
194
|
var keypathLayer: CALayer? {
|
|
194
|
-
|
|
195
|
+
nil
|
|
195
196
|
}
|
|
196
|
-
|
|
197
|
+
|
|
197
198
|
}
|
|
@@ -7,14 +7,16 @@
|
|
|
7
7
|
|
|
8
8
|
import Foundation
|
|
9
9
|
|
|
10
|
+
// MARK: - PathNode
|
|
11
|
+
|
|
10
12
|
protocol PathNode {
|
|
11
13
|
var pathOutput: PathOutputNode { get }
|
|
12
14
|
}
|
|
13
15
|
|
|
14
16
|
extension PathNode where Self: AnimatorNode {
|
|
15
|
-
|
|
17
|
+
|
|
16
18
|
var outputNode: NodeOutput {
|
|
17
|
-
|
|
19
|
+
pathOutput
|
|
18
20
|
}
|
|
19
|
-
|
|
21
|
+
|
|
20
22
|
}
|