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
|
@@ -1,539 +0,0 @@
|
|
|
1
|
-
//
|
|
2
|
-
// MathKit.swift
|
|
3
|
-
// UIToolBox
|
|
4
|
-
//
|
|
5
|
-
// Created by Brandon Withrow on 10/10/18.
|
|
6
|
-
//
|
|
7
|
-
// From https://github.com/buba447/UIToolBox
|
|
8
|
-
|
|
9
|
-
import Foundation
|
|
10
|
-
import CoreGraphics
|
|
11
|
-
|
|
12
|
-
extension Int {
|
|
13
|
-
var cgFloat: CGFloat {
|
|
14
|
-
return CGFloat(self)
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
extension Double {
|
|
19
|
-
var cgFloat: CGFloat {
|
|
20
|
-
return CGFloat(self)
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
extension CGFloat: Interpolatable {
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
Interpolates the receiver to the given number by Amount.
|
|
29
|
-
- Parameter toNumber: The number to interpolate to.
|
|
30
|
-
- Parameter amount: The amount to interpolate from 0-1
|
|
31
|
-
|
|
32
|
-
```
|
|
33
|
-
let number = 5
|
|
34
|
-
let interpolated = number.interpolateTo(10, amount: 0.5)
|
|
35
|
-
print(interpolated)
|
|
36
|
-
// Result: 7.5
|
|
37
|
-
```
|
|
38
|
-
|
|
39
|
-
1. The amount can be greater than one and less than zero. The interpolation will not be clipped.
|
|
40
|
-
*/
|
|
41
|
-
func interpolateTo(_ to: CGFloat, amount: CGFloat) -> CGFloat {
|
|
42
|
-
return self + ((to - self) * CGFloat(amount))
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
func interpolateTo(_ to: CGFloat, amount: CGFloat, spatialOutTangent: CGPoint?, spatialInTangent: CGPoint?) -> CGFloat {
|
|
46
|
-
return interpolateTo(to, amount: amount)
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
func remap(fromLow: CGFloat, fromHigh: CGFloat, toLow: CGFloat, toHigh: CGFloat) -> CGFloat {
|
|
50
|
-
guard (fromHigh - fromLow) != 0 else {
|
|
51
|
-
// Would produce NAN
|
|
52
|
-
return 0
|
|
53
|
-
}
|
|
54
|
-
return toLow + (self - fromLow) * (toHigh - toLow) / (fromHigh - fromLow)
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
/**
|
|
58
|
-
Returns a value that is clamped between the two numbers
|
|
59
|
-
|
|
60
|
-
1. The order of arguments does not matter.
|
|
61
|
-
*/
|
|
62
|
-
func clamp(_ a: CGFloat, _ b: CGFloat) -> CGFloat {
|
|
63
|
-
return CGFloat(Double(self).clamp(Double(a), Double(b)))
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
/**
|
|
67
|
-
Returns the difference between the receiver and the given number.
|
|
68
|
-
- Parameter absolute: If *true* (Default) the returned value will always be positive.
|
|
69
|
-
*/
|
|
70
|
-
func diff(_ a: CGFloat, absolute: Bool = true) -> CGFloat {
|
|
71
|
-
return absolute ? abs(a - self) : a - self
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
func toRadians() -> CGFloat { return self * .pi / 180 }
|
|
75
|
-
func toDegrees() -> CGFloat { return self * 180 / .pi }
|
|
76
|
-
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
extension Double: Interpolatable {
|
|
80
|
-
|
|
81
|
-
/**
|
|
82
|
-
Interpolates the receiver to the given number by Amount.
|
|
83
|
-
- Parameter toNumber: The number to interpolate to.
|
|
84
|
-
- Parameter amount: The amount to interpolate from 0-1
|
|
85
|
-
|
|
86
|
-
```
|
|
87
|
-
let number = 5
|
|
88
|
-
let interpolated = number.interpolateTo(10, amount: 0.5)
|
|
89
|
-
print(interpolated)
|
|
90
|
-
// Result: 7.5
|
|
91
|
-
```
|
|
92
|
-
|
|
93
|
-
1. The amount can be greater than one and less than zero. The interpolation will not be clipped.
|
|
94
|
-
*/
|
|
95
|
-
func interpolateTo(_ to: Double, amount: CGFloat) -> Double {
|
|
96
|
-
return self + ((to - self) * Double(amount))
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
func interpolateTo(_ to: Double, amount: CGFloat, spatialOutTangent: CGPoint?, spatialInTangent: CGPoint?) -> Double {
|
|
100
|
-
return interpolateTo(to, amount: amount)
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
func remap(fromLow: Double, fromHigh: Double, toLow: Double, toHigh: Double) -> Double {
|
|
104
|
-
return toLow + (self - fromLow) * (toHigh - toLow) / (fromHigh - fromLow)
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
/**
|
|
108
|
-
Returns a value that is clamped between the two numbers
|
|
109
|
-
|
|
110
|
-
1. The order of arguments does not matter.
|
|
111
|
-
*/
|
|
112
|
-
func clamp(_ a: Double, _ b: Double) -> Double {
|
|
113
|
-
let minValue = a <= b ? a : b
|
|
114
|
-
let maxValue = a <= b ? b : a
|
|
115
|
-
return max(min(self, maxValue), minValue)
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
extension CGRect {
|
|
121
|
-
|
|
122
|
-
/// Initializes a new CGRect with a center point and size.
|
|
123
|
-
init(center: CGPoint, size: CGSize) {
|
|
124
|
-
self.init(x: center.x - (size.width * 0.5),
|
|
125
|
-
y: center.y - (size.height * 0.5),
|
|
126
|
-
width: size.width,
|
|
127
|
-
height: size.height)
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
/// Returns the total area of the rect.
|
|
131
|
-
var area: CGFloat {
|
|
132
|
-
return width * height
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
/// The center point of the rect. Settable.
|
|
137
|
-
var center: CGPoint {
|
|
138
|
-
get {
|
|
139
|
-
return CGPoint(x: midX, y: midY)
|
|
140
|
-
}
|
|
141
|
-
set {
|
|
142
|
-
origin = CGPoint(x: newValue.x - (size.width * 0.5),
|
|
143
|
-
y: newValue.y - (size.height * 0.5))
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
/// The top left point of the rect. Settable.
|
|
148
|
-
var topLeft: CGPoint {
|
|
149
|
-
get {
|
|
150
|
-
return CGPoint(x: minX, y: minY)
|
|
151
|
-
}
|
|
152
|
-
set {
|
|
153
|
-
origin = CGPoint(x: newValue.x,
|
|
154
|
-
y: newValue.y)
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
/// The bottom left point of the rect. Settable.
|
|
159
|
-
var bottomLeft: CGPoint {
|
|
160
|
-
get {
|
|
161
|
-
return CGPoint(x: minX, y: maxY)
|
|
162
|
-
}
|
|
163
|
-
set {
|
|
164
|
-
origin = CGPoint(x: newValue.x,
|
|
165
|
-
y: newValue.y - size.height)
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
/// The top right point of the rect. Settable.
|
|
170
|
-
var topRight: CGPoint {
|
|
171
|
-
get {
|
|
172
|
-
return CGPoint(x: maxX, y: minY)
|
|
173
|
-
}
|
|
174
|
-
set {
|
|
175
|
-
origin = CGPoint(x: newValue.x - size.width,
|
|
176
|
-
y: newValue.y)
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
/// The bottom right point of the rect. Settable.
|
|
181
|
-
var bottomRight: CGPoint {
|
|
182
|
-
get {
|
|
183
|
-
return CGPoint(x: maxX, y: maxY)
|
|
184
|
-
}
|
|
185
|
-
set {
|
|
186
|
-
origin = CGPoint(x: newValue.x - size.width,
|
|
187
|
-
y: newValue.y - size.height)
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
/**
|
|
192
|
-
Interpolates the receiver to the given rect by Amount.
|
|
193
|
-
- Parameter to: The rect to interpolate to.
|
|
194
|
-
- Parameter amount: The amount to interpolate from 0-1
|
|
195
|
-
|
|
196
|
-
```
|
|
197
|
-
let rect = CGRect(x:0, y:0, width: 50, height: 50)
|
|
198
|
-
let interpolated = rect.interpolateTo(CGRect(x:100, y:100, width: 100, height: 100), amount: 0.5)
|
|
199
|
-
print(interpolated)
|
|
200
|
-
// Result: (x: 50, y: 50, width: 75, height: 75)
|
|
201
|
-
```
|
|
202
|
-
|
|
203
|
-
1. The amount can be greater than one and less than zero. The interpolation will not be clipped.
|
|
204
|
-
*/
|
|
205
|
-
func interpolateTo(_ to: CGRect, amount: CGFloat) -> CGRect {
|
|
206
|
-
return CGRect(x: origin.x.interpolateTo(to.origin.x, amount: amount),
|
|
207
|
-
y: origin.y.interpolateTo(to.origin.y, amount: amount),
|
|
208
|
-
width: width.interpolateTo(to.width, amount: amount),
|
|
209
|
-
height: height.interpolateTo(to.height, amount: amount))
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
extension CGSize {
|
|
215
|
-
|
|
216
|
-
/**
|
|
217
|
-
Interpolates the receiver to the given size by Amount.
|
|
218
|
-
- Parameter to: The size to interpolate to.
|
|
219
|
-
- Parameter amount: The amount to interpolate from 0-1
|
|
220
|
-
|
|
221
|
-
```
|
|
222
|
-
let size = CGSize(width: 50, height: 50)
|
|
223
|
-
let interpolated = rect.interpolateTo(CGSize(width: 100, height: 100), amount: 0.5)
|
|
224
|
-
print(interpolated)
|
|
225
|
-
// Result: (width: 75, height: 75)
|
|
226
|
-
```
|
|
227
|
-
|
|
228
|
-
1. The amount can be greater than one and less than zero. The interpolation will not be clipped.
|
|
229
|
-
*/
|
|
230
|
-
func interpolateTo(_ to: CGSize, amount: CGFloat) -> CGSize {
|
|
231
|
-
return CGSize(width: width.interpolateTo(to.width, amount: amount),
|
|
232
|
-
height: height.interpolateTo(to.height, amount: amount))
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
/// Returns the scale float that will fit the receive inside of the given size.
|
|
236
|
-
func scaleThatFits(_ size: CGSize) -> CGFloat {
|
|
237
|
-
return CGFloat.minimum(width / size.width, height / size.height)
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
/// Adds receiver size to give size.
|
|
241
|
-
func add(_ size: CGSize) -> CGSize {
|
|
242
|
-
return CGSize(width: width + size.width, height: height + size.height)
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
/// Subtracts given size from receiver size.
|
|
246
|
-
func subtract(_ size: CGSize) -> CGSize {
|
|
247
|
-
return CGSize(width: width - size.width, height: height - size.height)
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
/// Multiplies receiver size by the given size.
|
|
251
|
-
func multiply(_ size: CGSize) -> CGSize {
|
|
252
|
-
return CGSize(width: width * size.width, height: height * size.height)
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
/// Operator convenience to add sizes with +
|
|
256
|
-
static func +(left: CGSize, right: CGSize) -> CGSize {
|
|
257
|
-
return left.add(right)
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
/// Operator convenience to subtract sizes with -
|
|
261
|
-
static func -(left: CGSize, right: CGSize) -> CGSize {
|
|
262
|
-
return left.subtract(right)
|
|
263
|
-
}
|
|
264
|
-
|
|
265
|
-
/// Operator convenience to multiply sizes with *
|
|
266
|
-
static func *(left: CGSize, right: CGFloat) -> CGSize {
|
|
267
|
-
return CGSize(width: left.width * right, height: left.height * right)
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
}
|
|
271
|
-
|
|
272
|
-
/// A struct that defines a line segment with two CGPoints
|
|
273
|
-
struct CGLine {
|
|
274
|
-
|
|
275
|
-
/// The Start of the line segment.
|
|
276
|
-
var start: CGPoint
|
|
277
|
-
/// The End of the line segment.
|
|
278
|
-
var end: CGPoint
|
|
279
|
-
|
|
280
|
-
/// Initializes a line segment with start and end points
|
|
281
|
-
init(start: CGPoint, end: CGPoint) {
|
|
282
|
-
self.start = start
|
|
283
|
-
self.end = end
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
/// The length of the line segment.
|
|
287
|
-
var length: CGFloat {
|
|
288
|
-
return end.distanceTo(start)
|
|
289
|
-
}
|
|
290
|
-
|
|
291
|
-
/// Returns a line segment that is normalized to a length of 1
|
|
292
|
-
func normalize() -> CGLine {
|
|
293
|
-
let len = length
|
|
294
|
-
guard len > 0 else {
|
|
295
|
-
return self
|
|
296
|
-
}
|
|
297
|
-
let relativeEnd = end - start
|
|
298
|
-
let relativeVector = CGPoint(x: relativeEnd.x / len, y: relativeEnd.y / len)
|
|
299
|
-
let absoluteVector = relativeVector + start
|
|
300
|
-
return CGLine(start: start, end: absoluteVector)
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
/// Trims a line segment to the given length
|
|
304
|
-
func trimmedToLength(_ toLength: CGFloat) -> CGLine {
|
|
305
|
-
let len = length
|
|
306
|
-
guard len > 0 else {
|
|
307
|
-
return self
|
|
308
|
-
}
|
|
309
|
-
let relativeEnd = end - start
|
|
310
|
-
let relativeVector = CGPoint(x: relativeEnd.x / len, y: relativeEnd.y / len)
|
|
311
|
-
let sizedVector = CGPoint(x: relativeVector.x * toLength, y: relativeVector.y * toLength)
|
|
312
|
-
let absoluteVector = sizedVector + start
|
|
313
|
-
return CGLine(start: start, end: absoluteVector)
|
|
314
|
-
}
|
|
315
|
-
|
|
316
|
-
/// Flips a line vertically and horizontally from the start point.
|
|
317
|
-
func flipped() -> CGLine {
|
|
318
|
-
let relativeEnd = end - start
|
|
319
|
-
let flippedEnd = CGPoint(x: relativeEnd.x * -1, y: relativeEnd.y * -1)
|
|
320
|
-
return CGLine(start: start, end: flippedEnd + start)
|
|
321
|
-
}
|
|
322
|
-
|
|
323
|
-
/// Move the line to the new start point.
|
|
324
|
-
func transpose(_ toPoint: CGPoint) -> CGLine {
|
|
325
|
-
let diff = toPoint - start
|
|
326
|
-
let newEnd = end + diff
|
|
327
|
-
return CGLine(start: toPoint, end: newEnd)
|
|
328
|
-
}
|
|
329
|
-
|
|
330
|
-
}
|
|
331
|
-
|
|
332
|
-
infix operator +|
|
|
333
|
-
infix operator +-
|
|
334
|
-
|
|
335
|
-
extension CGPoint: Interpolatable {
|
|
336
|
-
|
|
337
|
-
/// Returns the distance between the receiver and the given point.
|
|
338
|
-
func distanceTo(_ a: CGPoint) -> CGFloat {
|
|
339
|
-
let xDist = a.x - x
|
|
340
|
-
let yDist = a.y - y
|
|
341
|
-
return CGFloat(sqrt((xDist * xDist) + (yDist * yDist)))
|
|
342
|
-
}
|
|
343
|
-
|
|
344
|
-
/// Returns the length between the receiver and *CGPoint.zero*
|
|
345
|
-
var vectorLength: CGFloat {
|
|
346
|
-
return distanceTo(.zero)
|
|
347
|
-
}
|
|
348
|
-
|
|
349
|
-
func rounded(decimal: CGFloat) -> CGPoint {
|
|
350
|
-
return CGPoint(x: (round(decimal * x) / decimal), y: (round(decimal * y) / decimal))
|
|
351
|
-
}
|
|
352
|
-
|
|
353
|
-
/**
|
|
354
|
-
Interpolates the receiver to the given Point by Amount.
|
|
355
|
-
- Parameter to: The Point to interpolate to.
|
|
356
|
-
- Parameter amount: The amount to interpolate from 0-1
|
|
357
|
-
|
|
358
|
-
```
|
|
359
|
-
let point = CGPoint(width: 50, height: 50)
|
|
360
|
-
let interpolated = rect.interpolateTo(CGPoint(width: 100, height: 100), amount: 0.5)
|
|
361
|
-
print(interpolated)
|
|
362
|
-
// Result: (x: 75, y: 75)
|
|
363
|
-
```
|
|
364
|
-
|
|
365
|
-
1. The amount can be greater than one and less than zero. The interpolation will not be clipped.
|
|
366
|
-
*/
|
|
367
|
-
|
|
368
|
-
func interpolate(_ to: CGPoint, amount: CGFloat) -> CGPoint {
|
|
369
|
-
return CGPoint(x: x.interpolateTo(to.x, amount: amount),
|
|
370
|
-
y: y.interpolateTo(to.y, amount: amount))
|
|
371
|
-
}
|
|
372
|
-
|
|
373
|
-
func interpolate(_ to: CGPoint, outTangent: CGPoint, inTangent: CGPoint, amount: CGFloat, maxIterations: Int = 3, samples: Int = 20, accuracy: CGFloat = 1) -> CGPoint {
|
|
374
|
-
if amount == 0 {
|
|
375
|
-
return self
|
|
376
|
-
}
|
|
377
|
-
if amount == 1 {
|
|
378
|
-
return to
|
|
379
|
-
}
|
|
380
|
-
|
|
381
|
-
if self.colinear(outTangent, inTangent) == true,
|
|
382
|
-
outTangent.colinear(inTangent, to) == true {
|
|
383
|
-
return interpolate(to, amount: amount)
|
|
384
|
-
}
|
|
385
|
-
|
|
386
|
-
let step = 1 / CGFloat(samples)
|
|
387
|
-
|
|
388
|
-
var points: [(point: CGPoint, distance: CGFloat)] = [(point: self, distance: 0)]
|
|
389
|
-
var totalLength: CGFloat = 0
|
|
390
|
-
|
|
391
|
-
var previousPoint = self
|
|
392
|
-
var previousAmount = CGFloat(0)
|
|
393
|
-
|
|
394
|
-
var closestPoint: Int = 0
|
|
395
|
-
|
|
396
|
-
while previousAmount < 1 {
|
|
397
|
-
|
|
398
|
-
previousAmount = previousAmount + step
|
|
399
|
-
|
|
400
|
-
if previousAmount < amount {
|
|
401
|
-
closestPoint = closestPoint + 1
|
|
402
|
-
}
|
|
403
|
-
|
|
404
|
-
let newPoint = self.pointOnPath(to, outTangent: outTangent, inTangent: inTangent, amount: previousAmount)
|
|
405
|
-
let distance = previousPoint.distanceTo(newPoint)
|
|
406
|
-
totalLength = totalLength + distance
|
|
407
|
-
points.append((point: newPoint, distance: totalLength))
|
|
408
|
-
previousPoint = newPoint
|
|
409
|
-
}
|
|
410
|
-
|
|
411
|
-
let accurateDistance = amount * totalLength
|
|
412
|
-
var point = points[closestPoint]
|
|
413
|
-
|
|
414
|
-
var foundPoint: Bool = false
|
|
415
|
-
|
|
416
|
-
var pointAmount: CGFloat = CGFloat(closestPoint) * step
|
|
417
|
-
var nextPointAmount: CGFloat = pointAmount + step
|
|
418
|
-
|
|
419
|
-
var refineIterations = 0
|
|
420
|
-
while foundPoint == false {
|
|
421
|
-
refineIterations = refineIterations + 1
|
|
422
|
-
/// First see if the next point is still less than the projected length.
|
|
423
|
-
let nextPoint = points[closestPoint + 1]
|
|
424
|
-
if nextPoint.distance < accurateDistance {
|
|
425
|
-
point = nextPoint
|
|
426
|
-
closestPoint = closestPoint + 1
|
|
427
|
-
pointAmount = CGFloat(closestPoint) * step
|
|
428
|
-
nextPointAmount = pointAmount + step
|
|
429
|
-
if closestPoint == points.count {
|
|
430
|
-
foundPoint = true
|
|
431
|
-
}
|
|
432
|
-
continue
|
|
433
|
-
}
|
|
434
|
-
if accurateDistance < point.distance {
|
|
435
|
-
closestPoint = closestPoint - 1
|
|
436
|
-
if closestPoint < 0 {
|
|
437
|
-
foundPoint = true
|
|
438
|
-
continue
|
|
439
|
-
}
|
|
440
|
-
point = points[closestPoint]
|
|
441
|
-
pointAmount = CGFloat(closestPoint) * step
|
|
442
|
-
nextPointAmount = pointAmount + step
|
|
443
|
-
continue
|
|
444
|
-
}
|
|
445
|
-
|
|
446
|
-
/// Now we are certain the point is the closest point under the distance
|
|
447
|
-
let pointDiff = nextPoint.distance - point.distance
|
|
448
|
-
let proposedPointAmount = ((accurateDistance - point.distance) / pointDiff).remap(fromLow: 0, fromHigh: 1, toLow: pointAmount, toHigh: nextPointAmount)
|
|
449
|
-
|
|
450
|
-
let newPoint = self.pointOnPath(to, outTangent: outTangent, inTangent: inTangent, amount: proposedPointAmount)
|
|
451
|
-
let newDistance = point.distance + point.point.distanceTo(newPoint)
|
|
452
|
-
pointAmount = proposedPointAmount
|
|
453
|
-
point = (point: newPoint, distance: newDistance)
|
|
454
|
-
if accurateDistance - newDistance <= accuracy ||
|
|
455
|
-
newDistance - accurateDistance <= accuracy {
|
|
456
|
-
foundPoint = true
|
|
457
|
-
}
|
|
458
|
-
|
|
459
|
-
if refineIterations == maxIterations {
|
|
460
|
-
foundPoint = true
|
|
461
|
-
}
|
|
462
|
-
}
|
|
463
|
-
return point.point
|
|
464
|
-
}
|
|
465
|
-
|
|
466
|
-
func pointOnPath(_ to: CGPoint, outTangent: CGPoint, inTangent: CGPoint, amount: CGFloat) -> CGPoint {
|
|
467
|
-
let a = self.interpolate(outTangent, amount: amount)
|
|
468
|
-
let b = outTangent.interpolate(inTangent, amount: amount)
|
|
469
|
-
let c = inTangent.interpolate(to, amount: amount)
|
|
470
|
-
let d = a.interpolate(b, amount: amount)
|
|
471
|
-
let e = b.interpolate(c, amount: amount)
|
|
472
|
-
let f = d.interpolate(e, amount: amount)
|
|
473
|
-
return f
|
|
474
|
-
}
|
|
475
|
-
|
|
476
|
-
func colinear(_ a: CGPoint, _ b: CGPoint) -> Bool {
|
|
477
|
-
let area = x * (a.y - b.y) + a.x * (b.y - y) + b.x * (y - a.y);
|
|
478
|
-
let accuracy: CGFloat = 0.05
|
|
479
|
-
if area < accuracy && area > -accuracy {
|
|
480
|
-
return true
|
|
481
|
-
}
|
|
482
|
-
return false
|
|
483
|
-
}
|
|
484
|
-
|
|
485
|
-
func interpolateTo(_ to: CGPoint, amount: CGFloat, spatialOutTangent: CGPoint?, spatialInTangent: CGPoint?) -> CGPoint {
|
|
486
|
-
guard let outTan = spatialOutTangent,
|
|
487
|
-
let inTan = spatialInTangent else {
|
|
488
|
-
return interpolate(to, amount: amount)
|
|
489
|
-
}
|
|
490
|
-
let cp1 = self + outTan
|
|
491
|
-
let cp2 = to + inTan
|
|
492
|
-
|
|
493
|
-
return interpolate(to, outTangent: cp1, inTangent: cp2, amount: amount)
|
|
494
|
-
}
|
|
495
|
-
|
|
496
|
-
/// Subtracts the given point from the receiving point.
|
|
497
|
-
func subtract(_ point: CGPoint) -> CGPoint {
|
|
498
|
-
return CGPoint(x: x - point.x,
|
|
499
|
-
y: y - point.y)
|
|
500
|
-
}
|
|
501
|
-
|
|
502
|
-
/// Adds the given point from the receiving point.
|
|
503
|
-
func add(_ point: CGPoint) -> CGPoint {
|
|
504
|
-
return CGPoint(x: x + point.x,
|
|
505
|
-
y: y + point.y)
|
|
506
|
-
}
|
|
507
|
-
|
|
508
|
-
var isZero: Bool {
|
|
509
|
-
return (x == 0 && y == 0)
|
|
510
|
-
}
|
|
511
|
-
|
|
512
|
-
/// Operator convenience to divide points with /
|
|
513
|
-
static func / (lhs: CGPoint, rhs: CGFloat) -> CGPoint {
|
|
514
|
-
return CGPoint(x: lhs.x / CGFloat(rhs), y: lhs.y / CGFloat(rhs))
|
|
515
|
-
}
|
|
516
|
-
|
|
517
|
-
/// Operator convenience to multiply points with *
|
|
518
|
-
static func * (lhs: CGPoint, rhs: CGFloat) -> CGPoint {
|
|
519
|
-
return CGPoint(x: lhs.x * CGFloat(rhs), y: lhs.y * CGFloat(rhs))
|
|
520
|
-
}
|
|
521
|
-
|
|
522
|
-
/// Operator convenience to add points with +
|
|
523
|
-
static func +(left: CGPoint, right: CGPoint) -> CGPoint {
|
|
524
|
-
return left.add(right)
|
|
525
|
-
}
|
|
526
|
-
|
|
527
|
-
/// Operator convenience to subtract points with -
|
|
528
|
-
static func -(left: CGPoint, right: CGPoint) -> CGPoint {
|
|
529
|
-
return left.subtract(right)
|
|
530
|
-
}
|
|
531
|
-
|
|
532
|
-
static func +|(left: CGPoint, right: CGFloat) -> CGPoint {
|
|
533
|
-
return CGPoint(x: left.x, y: left.y + right)
|
|
534
|
-
}
|
|
535
|
-
|
|
536
|
-
static func +-(left: CGPoint, right: CGFloat) -> CGPoint {
|
|
537
|
-
return CGPoint(x: left.x + right, y: left.y)
|
|
538
|
-
}
|
|
539
|
-
}
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
//
|
|
2
|
-
// StringExtensions.swift
|
|
3
|
-
// lottie-swift
|
|
4
|
-
//
|
|
5
|
-
// Created by Brandon Withrow on 1/25/19.
|
|
6
|
-
//
|
|
7
|
-
|
|
8
|
-
import Foundation
|
|
9
|
-
import CoreGraphics
|
|
10
|
-
|
|
11
|
-
extension String {
|
|
12
|
-
|
|
13
|
-
func hexColorComponents() -> (red: CGFloat, green: CGFloat, blue: CGFloat) {
|
|
14
|
-
|
|
15
|
-
var cString:String = trimmingCharacters(in: .whitespacesAndNewlines).uppercased()
|
|
16
|
-
|
|
17
|
-
if (cString.hasPrefix("#")) {
|
|
18
|
-
cString.remove(at: cString.startIndex)
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
if ((cString.count) != 6) {
|
|
22
|
-
return (red: 0, green: 0, blue: 0)
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
var rgbValue:UInt32 = 0
|
|
26
|
-
Scanner(string: cString).scanHexInt32(&rgbValue)
|
|
27
|
-
|
|
28
|
-
return (red: CGFloat((rgbValue & 0xFF0000) >> 16) / 255.0,
|
|
29
|
-
green: CGFloat((rgbValue & 0x00FF00) >> 8) / 255.0,
|
|
30
|
-
blue: CGFloat(rgbValue & 0x0000FF) / 255.0)
|
|
31
|
-
}
|
|
32
|
-
}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
//
|
|
2
|
-
// Interpolatable.swift
|
|
3
|
-
// lottie-swift
|
|
4
|
-
//
|
|
5
|
-
// Created by Brandon Withrow on 1/14/19.
|
|
6
|
-
//
|
|
7
|
-
|
|
8
|
-
import Foundation
|
|
9
|
-
import CoreGraphics
|
|
10
|
-
|
|
11
|
-
protocol Interpolatable {
|
|
12
|
-
|
|
13
|
-
func interpolateTo(_ to: Self,
|
|
14
|
-
amount: CGFloat,
|
|
15
|
-
spatialOutTangent: CGPoint?,
|
|
16
|
-
spatialInTangent: CGPoint?) -> Self
|
|
17
|
-
|
|
18
|
-
}
|