lottie-ios 3.4.0 → 3.4.3
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/workflows/main.yml +10 -7
- package/.github/workflows/stale_issues.yml +17 -0
- package/.swiftpm/xcode/package.xcworkspace/xcuserdata/calstephens.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- package/Lottie.xcodeproj/project.pbxproj +33 -21
- package/Lottie.xcodeproj/xcshareddata/xcschemes/Lottie (macOS).xcscheme +2 -2
- package/Lottie.xcworkspace/xcuserdata/calstephens.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- package/Lottie.xcworkspace/xcuserdata/calstephens.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +5 -6
- package/Lottie.xcworkspace/xcuserdata/calstephens.xcuserdatad/xcdebugger/Expressions.xcexplist +114 -1
- package/Lottie.xcworkspace/xcuserdata/calstephens.xcuserdatad/xcschemes/xcschememanagement.plist +30 -0
- package/Package.swift +1 -1
- package/README.md +5 -6
- package/Rakefile +52 -17
- package/Sources/Private/CoreAnimation/Animations/CAAnimation+TimingConfiguration.swift +7 -2
- package/Sources/Private/CoreAnimation/Animations/CALayer+addAnimation.swift +192 -67
- package/Sources/Private/CoreAnimation/Animations/CombinedShapeAnimation.swift +28 -0
- package/Sources/Private/CoreAnimation/Animations/EllipseAnimation.swift +31 -4
- package/Sources/Private/CoreAnimation/Animations/GradientAnimations.swift +98 -43
- package/Sources/Private/CoreAnimation/Animations/LayerProperty.swift +19 -19
- package/Sources/Private/CoreAnimation/Animations/RectangleAnimation.swift +34 -7
- package/Sources/Private/CoreAnimation/Animations/ShapeAnimation.swift +25 -14
- package/Sources/Private/CoreAnimation/Animations/StarAnimation.swift +61 -32
- package/Sources/Private/CoreAnimation/Animations/StrokeAnimation.swift +6 -2
- package/Sources/Private/CoreAnimation/CoreAnimationLayer.swift +29 -11
- package/Sources/Private/CoreAnimation/Extensions/KeyframeGroup+exactlyOneKeyframe.swift +2 -2
- package/Sources/Private/CoreAnimation/Extensions/Keyframes+combinedIfPossible.swift +116 -23
- package/Sources/Private/CoreAnimation/Layers/AnimationLayer.swift +9 -0
- package/Sources/Private/CoreAnimation/Layers/BaseCompositionLayer.swift +2 -1
- package/Sources/Private/CoreAnimation/Layers/CALayer+setupLayerHierarchy.swift +48 -12
- package/Sources/Private/CoreAnimation/Layers/GradientRenderLayer.swift +10 -3
- package/Sources/Private/CoreAnimation/Layers/LayerModel+makeAnimationLayer.swift +5 -0
- package/Sources/Private/CoreAnimation/Layers/MaskCompositionLayer.swift +1 -1
- package/Sources/Private/CoreAnimation/Layers/PreCompLayer.swift +2 -2
- package/Sources/Private/CoreAnimation/Layers/RepeaterLayer.swift +85 -0
- package/Sources/Private/CoreAnimation/Layers/ShapeItemLayer.swift +94 -38
- package/Sources/Private/CoreAnimation/Layers/ShapeLayer.swift +131 -46
- package/Sources/Private/CoreAnimation/Layers/TextLayer.swift +16 -2
- package/Sources/Private/MainThread/LayerContainers/CompLayers/CompositionLayer.swift +1 -1
- package/Sources/Private/MainThread/LayerContainers/CompLayers/MaskContainerLayer.swift +0 -2
- package/Sources/Private/MainThread/LayerContainers/CompLayers/PreCompositionLayer.swift +2 -2
- package/Sources/Private/MainThread/LayerContainers/MainThreadAnimationLayer.swift +1 -2
- package/Sources/Private/MainThread/LayerContainers/Utility/CoreTextRenderLayer.swift +30 -1
- package/Sources/Private/MainThread/LayerContainers/Utility/InvertedMatteLayer.swift +1 -0
- package/Sources/Private/MainThread/LayerContainers/Utility/LayerTransformNode.swift +0 -1
- package/Sources/Private/MainThread/NodeRenderSystem/Extensions/ItemsExtension.swift +5 -2
- package/Sources/Private/MainThread/NodeRenderSystem/Nodes/ModifierNodes/TrimPathNode.swift +4 -7
- package/Sources/Private/MainThread/NodeRenderSystem/Nodes/OutputNodes/Renderables/GradientFillRenderer.swift +5 -0
- package/Sources/Private/MainThread/NodeRenderSystem/Nodes/OutputNodes/Renderables/GradientStrokeRenderer.swift +1 -2
- package/Sources/Private/MainThread/NodeRenderSystem/Nodes/OutputNodes/Renderables/LegacyGradientFillRenderer.swift +1 -1
- package/Sources/Private/MainThread/NodeRenderSystem/Nodes/OutputNodes/Renderables/StrokeRenderer.swift +1 -1
- package/Sources/Private/MainThread/NodeRenderSystem/Nodes/PathNodes/RectNode.swift +1 -1
- package/Sources/Private/MainThread/NodeRenderSystem/Nodes/PathNodes/StarNode.swift +3 -3
- package/Sources/Private/MainThread/NodeRenderSystem/Nodes/RenderNodes/GradientFillNode.swift +3 -0
- package/Sources/Private/MainThread/NodeRenderSystem/Nodes/RenderNodes/GradientStrokeNode.swift +1 -1
- package/Sources/Private/MainThread/NodeRenderSystem/Nodes/RenderNodes/StrokeNode.swift +28 -1
- package/Sources/Private/MainThread/NodeRenderSystem/RenderLayers/ShapeContainerLayer.swift +1 -1
- package/Sources/Private/MainThread/NodeRenderSystem/RenderLayers/ShapeRenderLayer.swift +0 -1
- package/Sources/Private/Model/Animation.swift +4 -4
- package/Sources/Private/Model/Keyframes/KeyframeGroup.swift +25 -0
- package/Sources/Private/Model/ShapeItems/Ellipse.swift +0 -1
- package/Sources/Private/Model/ShapeItems/Fill.swift +1 -1
- package/Sources/Private/Model/ShapeItems/GradientFill.swift +14 -1
- package/Sources/Private/Model/ShapeItems/GradientStroke.swift +0 -1
- package/Sources/Private/Model/ShapeItems/Group.swift +6 -1
- package/Sources/Private/Model/ShapeItems/Merge.swift +0 -1
- package/Sources/Private/Model/ShapeItems/Rectangle.swift +0 -1
- package/Sources/Private/Model/ShapeItems/Repeater.swift +0 -1
- package/Sources/Private/Model/ShapeItems/ShapeTransform.swift +0 -1
- package/Sources/Private/Model/ShapeItems/Star.swift +0 -1
- package/Sources/Private/Model/ShapeItems/Stroke.swift +0 -1
- package/Sources/Private/Model/ShapeItems/Trim.swift +0 -1
- package/Sources/Private/Model/Text/TextAnimator.swift +0 -1
- package/Sources/Private/Utility/Debugging/LayerDebugging.swift +1 -2
- package/Sources/Private/Utility/Extensions/MathKit.swift +1 -2
- package/Sources/Private/Utility/Extensions/StringExtensions.swift +0 -1
- package/Sources/Private/Utility/Interpolatable/InterpolatableExtensions.swift +0 -1
- package/Sources/Private/{MainThread/NodeRenderSystem/NodeProperties/ValueProviders → Utility/Interpolatable}/KeyframeInterpolator.swift +1 -4
- package/Sources/Private/Utility/Primitives/BezierPath.swift +1 -2
- package/Sources/Private/Utility/Primitives/CurveVertex.swift +2 -4
- package/Sources/Public/Animation/AnimationPublic.swift +2 -4
- package/Sources/Public/Animation/AnimationView.swift +29 -7
- package/Sources/Public/Animation/AnimationViewInitializers.swift +13 -11
- package/Sources/Public/DynamicProperties/ValueProviders/GradientValueProvider.swift +0 -2
- package/Sources/Public/FontProvider/AnimationFontProvider.swift +1 -1
- package/Sources/Public/Logging/LottieLogger.swift +15 -2
- package/Sources/Public/TextProvider/AnimationTextProvider.swift +1 -1
- package/Sources/Public/iOS/AnimatedButton.swift +10 -4
- package/Sources/Public/iOS/AnimatedControl.swift +3 -5
- package/Sources/Public/iOS/AnimatedSwitch.swift +9 -6
- package/Sources/Public/iOS/BundleImageProvider.swift +2 -3
- package/Sources/Public/iOS/FilepathImageProvider.swift +1 -2
- package/Sources/Public/macOS/BundleImageProvider.macOS.swift +1 -2
- package/Sources/Public/macOS/FilepathImageProvider.macOS.swift +1 -3
- package/Tests/AnimationKeypathTests.swift +10 -1
- package/Tests/AutomaticEngineTests.swift +1 -0
- package/Tests/ParsingTests.swift +2 -1
- package/Tests/PerformanceTests.swift +28 -29
- package/Tests/SnapshotConfiguration.swift +19 -0
- package/Tests/SnapshotTests.swift +4 -0
- package/Tests/Utils/HardcodedTextProvider.swift +27 -0
- package/lottie-ios.podspec +2 -2
- package/package.json +1 -1
- package/script/test-carthage/CarthageTest/AppDelegate.swift +6 -7
- package/script/test-carthage/CarthageTest/ViewController.swift +1 -1
- 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 +159 -5
- package/script/test-carthage/CarthageTest.xcodeproj/project.xcworkspace/xcuserdata/calstephens.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- package/script/test-carthage/CarthageTest.xcodeproj/xcuserdata/calstephens.xcuserdatad/xcschemes/xcschememanagement.plist +19 -0
- package/Lottie.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +0 -23
- package/Mintfile +0 -3
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~-7Vi1RszY1XYnR2CCkEwIpKG8NwwA9zsZEz_WD7Dv6kKh4RC7N7ob8NIRVHGUJKp7eXxlpeI_gzD87Pcs_2u0g== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~-SKV2drO-SFlrlh-wrzECDMkUSr-aF1lV9h-5onOy94zSTsD-oI45s0-KpOK45L-kq3hRY7v9vm-xmh00_eheg== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~-_CU_vuaiFfObSeDFfmp7GuB20ThMSAL-P_RUMowiQLbdu-y0bU9upIm3q8g6XmXUG5hP6J1az0Ma5Hi_rhhRg== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~03aPYP6VHJjZj5DlphGarj0xdw43qu09Onx5SReZoPvg9zh5uL212E-KWfGct9jf6JG0JFV2tdbBi7X_8bH9aw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~1Z82GPBBPc1VLvn4O7V5glb6lgyXteNlDREUzV_TPymM4ra4UkBMklzV90lEqoYRCDuRVzaQHaDYbmYp3-8CFw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~1mFDCboXpUu9pSHAiVGr1O_QgqEEtvJp_LUhickxLZo0Z5pj3fvadn1l2MzEOd4bFsVBZifUvcyPa7dzlMWF-A== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~2_L9PUjv2JDKu1n8bDLb4XLB-yex6ZVjDDMwfuKAr7teDw-SKgLgkW6H-m_gjWChIVdB4vW6yvHP7XJxvXtRNA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~4VqMqsI5lOfxRppnud6-VDWcNsU8J7VgFCJfW2dXPwOcAkvU-I8Um5yp9n0Zv6nr3VmcxYggaVMDFfR0U_vjKw== +0 -1
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~4krT4ZMzDOu34msFUq0Xod142kw4pAeSWX4JSxlsjOI0Wanu3343qeespgFi61MTWq1DdH9XXspVKqGlGm_fyw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~5_aJsdP-e3dRTAUnH-y1U2plaCuUi1vyHriaZuNK0xFe8wGl9Qft6uLCX2Qt6CRBKJQluEe9o0uRWw1eb42FHQ== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~8b0bSqV7eND54zvHvu1v2Htpm7yn-BOEFw5d3mITJrXWNykJ5BTR9WbrD80JEctNcT-rDqO2xfrQk1tFWeY6Sw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~9u8KAGpgtSm-mQ12Py8RZUbYbDlBhM3w1I2MQO53K2CSn6IePp7g65DBcdXTYMfG1bgoJ-6x30fjnGe-2UYsDQ== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~Bw7uMs4wqB9ahfEqGii2FkQ9pvZmG6HGe2hmbAT2wyM5hpn8Xh5dELysMcEz6hEsqmn6HdRdLOLZhC_fNaXzgA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~BwUq2xXQYuE8ya6HT6lfNsdtEjz5AKGf8GvLY6VBxQyIY1vgj_Gov-3NeM69OS66BQRDK0PG9H4Oyg0R48E4vg== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~EkDVUR6dcnzxV_lYjkrJ5QGMVTCvb_upAoBF6DBu61sQkGvZN3fSRTsJ1XfJIZO-JUzdNoVA3D_CcvokL0gnQg== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~FUkcLSJ8RAuPenM4HFG1R-sN5-cDBGcTxgR2jaVCna7xV0ZTyBHriB1Nn59mariNlJDiCoBtMUQEmauGxWtfBA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~FqsuZe4RVLOOVUYLTL-GTIohZ8TdSfxx7m2KJtLYFPGOdE4XorTX7Oc7kXbhghPRppXT3jW-slI37M34YNEvLQ== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~G4F_NtyTj3i46fmKm0NorHAeq8tYWWYf6uv5yC1DwzdpWVoYbOPufmFNvdEbxZt4AMdV0gKx3HI46EAXNOQVFg== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~GxetzGUNDgaBBXcTmLK6p9JBDX3I3QPshshbui1IaEWvJbQko-E36tCKwaJYHbleAWz9FqkAM_Tqx3YOmSVkVg== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~H1Wjd5kKWDW4t3SDodxiHV72V8WT0xwPubw5cJTNLkPRLgaILFPh-dpy8EOUNgy1KzrDujFsm9EcTsbuqtMPLA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~JpI5MH4zCgebUHFpXVn4zjtsGtMNnO7BQZWfNARAB5UWa9gqz6YXHR3uLCJ_AvJ3lh53BUVkavsx9TY2FMmxbA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~JujNYkJtcux0Ni4QnR64zu4Wz_zYjyKvYaYZm5ypxTLPSzF3_jNE_NO4sdbDamF8wEqWoky1uf4ZE0JT3L607A== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~KJSEA6DKnb2_FRPSqKZGh41eo-C8x448J9kEBrH012bUrZfOSDvrgmIrU0Vz7Ri3gaS9aKKmSaVMvXsHSlTJVA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~MStOwu3jBlJtcRnxrseVOuhI4kCj--ggFPG7sqrq5w1hjrI3bVyD-bm1Jwyx0noY3wT1rHDEvaGWnV2qsGjGwg== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~McsJ8kFVf3IjhgXIRdw8Xx-EXgbV071bmlj2BBnk52xrWl3sEeiIyxwUsF7mIWvMRWfcFfu4VGHYyqfk2BeHXw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~NHt9fVe4kDdbxnglKcEwXaRK-WsYEOaD23Kbl8SJPRMYHr_Z6SJd_HmG3BROHHR_M6TgSmucONpDJdTj5tjuFw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~Nfo2iwCPcfAcOBIVyoUAK0-PIfr5qYxIKZt-uaSaTBdrTNxAuJ1ItmeDPZ3VdJJmxD_c22No7x482bdd3_yYtw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~S2Qlu11xBhEd5aGSzWsnw1TR8u8PiOF93GO0j5bfNoAFCVzxKOwhRFoIXba2EpQnLQqFdIKyhWN3l70A4GPHmg== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~W7a7M37RO9jgck2zeR0471Pm7e8K0Kqj5tXEouDjvqKZXSrWxMaWD28oqkKKYAiU4608R4S9mM11KyphljdMSw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~XUo1oyPCrlL7CA74wG-OzQ06VOWJYWvHGFHU7keZN1SKaIXjHX5qi_kBzjG_rBCi89-S8GVmCy7S3PHSjG8SbQ== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~Xh0VmDvFNMELHu08-vrs54pegVyUwwDRxx_nXkwyD0NjnYozyqcGAKAr_QWHmw6F8XyuWg51M9KGpJJIFzzGuw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~Xve-wMBp_lxVUgD9qH5GwieGP9cAWtm0xULZvdGjBRUMvaevmpCB5gnbMBuIXAO6a1c9v6WUq0jNVX7ut5HvOw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~ZU1XkZFgnEE22CXEF-pOlcj5f10x-KM1Vw9d4IOLu-NiTZcz7koYPixhdrB1PJr8J-h9NpJmfqEastfxamA1jQ== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~_YkNYEHTsbbtFILJpzH3HenH0t4ShI25dIMdve541CF5bl-jPF3X3F7tq-t5dvP0TEkATsOJdLQdBp1xv4Q-ag== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~boy6mpn2jkwm60jjgQ0TG25UqRdN46LzmgTVCrpy6nBOgkLCGkGHcbceiwjU1itS_vj3-iQX0ZnrWOQrPyfHNA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~bwzpVZ9hAqGDHhXs2FRA82dfGfLmc7-m0uQhZDDfHHO7hQ17M_Np341BZX4WDLhYYS4cdUgaDodlNpdfpG3nXw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~cBxe-9PpAGFdAsYkmdN3lJVqEliLcRYlyoAov0aPZfJGwUr_cOm3XpjO7nmf_2eLf8UAx-rycjnJzw07xLrNCA== +0 -1
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~dirWk6W4Pav1oyciuflfJlRu0iuxbYOmrpQapOJ0mV9C1SQ-jvDRv_7h753Cy18-SwULARUdWsyUy3yNNvxF7w== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~ebwZVjSEHroc9jtIm4jd_h_YAqEBcOkAZ4HPNJT8pLCldjRcTq-obQLakxXOhfuoOBlYBoZLuO-Y0lskeZRYKw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~gfcRcmRIr0h09d0jiZsA7nUeQv2XtapxuYEXZy1Z9um0tTJQvz-O5ef5f7zhLenLvjnDtDtlY_aY4Hvpce6e1Q== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~hgOgiVCyv2R0W-f0qKw5xYPeUwj8_ccCM9vKH_7vAQcCO9t8BwR1APGRBv20AONmp-PYMXmtgsBlQkNBRBpdQA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~hrhCl-YRAAr8ByNB_LCgEBsVNHMp92gTIUknetpUHMjcXl4Hpn_uY-h6C45oga0ZALnfGCo6iKTmiPLa4Qvnpg== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~n2yoR7JsyL4DSUwmjnpE4Iq9Qi_eeZrmpPU8cdehDFKfESK7nwxXxfrSMQbk0BQ2lgGPadoRcd1-qr1xVz97jA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~nMCcZm8WvPogyO_nuJ926Q3Q2dqVMN2LdjEL1Kq2wJ_RG-rH-e_6v41l1xZbCsQTa3XykQdEiXNc0HtAvT6IRA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~oc3C7xkUt-OWDL6rrsxs-seS4Fu1bqBWAAXCHalgShaGg9MUrOiRbHT2DcAnhyQFKx6x5FRbvjmYoQWrQiXJZA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~p-ihj7SEgkDXpMu9hvKE_wiX9cvtwyXrdIn964BfedXHKGpC6o7mMPxEyC0kRPVi_EZs_MRV5bAPEpl5h5we0g== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~qlhO_D9oE8uSKH-mZqyRF9pp4Zv1Tv0dIYcqrH4hb1VWlIxcdxmg2j0M8496cQeFXC5bn_JMXdBlD-d6cnFF8w== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~tjpiyIxJR_boTdUNrtFDuKIZoY84fI4lA1oMJbq9e2ZmYKIK5FeRN2O8cV_yMOYJGr4lbv03kTmT70mCjUc2_Q== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~wULeoj18eEKJWAKx1uFQVwS48cUGFcYPRJQj1Ro5XNJsWCwppGSCdIPhwifD6Z2f_j3zfI2SmC2Gg81sBXXW7g== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~zrEihMys4NVV5rx6FmuzEGO2TjloI3OiC7yzIhvqYoRo43ibb2F-Km6Jf4NX-ac62pOLBYZRcjQTvYMpn75_oA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~-7Vi1RszY1XYnR2CCkEwIpKG8NwwA9zsZEz_WD7Dv6kKh4RC7N7ob8NIRVHGUJKp7eXxlpeI_gzD87Pcs_2u0g== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~-SKV2drO-SFlrlh-wrzECDMkUSr-aF1lV9h-5onOy94zSTsD-oI45s0-KpOK45L-kq3hRY7v9vm-xmh00_eheg== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~-_CU_vuaiFfObSeDFfmp7GuB20ThMSAL-P_RUMowiQLbdu-y0bU9upIm3q8g6XmXUG5hP6J1az0Ma5Hi_rhhRg== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~03aPYP6VHJjZj5DlphGarj0xdw43qu09Onx5SReZoPvg9zh5uL212E-KWfGct9jf6JG0JFV2tdbBi7X_8bH9aw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~1Z82GPBBPc1VLvn4O7V5glb6lgyXteNlDREUzV_TPymM4ra4UkBMklzV90lEqoYRCDuRVzaQHaDYbmYp3-8CFw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~1mFDCboXpUu9pSHAiVGr1O_QgqEEtvJp_LUhickxLZo0Z5pj3fvadn1l2MzEOd4bFsVBZifUvcyPa7dzlMWF-A== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~2_L9PUjv2JDKu1n8bDLb4XLB-yex6ZVjDDMwfuKAr7teDw-SKgLgkW6H-m_gjWChIVdB4vW6yvHP7XJxvXtRNA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~4VqMqsI5lOfxRppnud6-VDWcNsU8J7VgFCJfW2dXPwOcAkvU-I8Um5yp9n0Zv6nr3VmcxYggaVMDFfR0U_vjKw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~4krT4ZMzDOu34msFUq0Xod142kw4pAeSWX4JSxlsjOI0Wanu3343qeespgFi61MTWq1DdH9XXspVKqGlGm_fyw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~5_aJsdP-e3dRTAUnH-y1U2plaCuUi1vyHriaZuNK0xFe8wGl9Qft6uLCX2Qt6CRBKJQluEe9o0uRWw1eb42FHQ== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~8b0bSqV7eND54zvHvu1v2Htpm7yn-BOEFw5d3mITJrXWNykJ5BTR9WbrD80JEctNcT-rDqO2xfrQk1tFWeY6Sw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~9u8KAGpgtSm-mQ12Py8RZUbYbDlBhM3w1I2MQO53K2CSn6IePp7g65DBcdXTYMfG1bgoJ-6x30fjnGe-2UYsDQ== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~Bw7uMs4wqB9ahfEqGii2FkQ9pvZmG6HGe2hmbAT2wyM5hpn8Xh5dELysMcEz6hEsqmn6HdRdLOLZhC_fNaXzgA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~BwUq2xXQYuE8ya6HT6lfNsdtEjz5AKGf8GvLY6VBxQyIY1vgj_Gov-3NeM69OS66BQRDK0PG9H4Oyg0R48E4vg== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~EkDVUR6dcnzxV_lYjkrJ5QGMVTCvb_upAoBF6DBu61sQkGvZN3fSRTsJ1XfJIZO-JUzdNoVA3D_CcvokL0gnQg== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~FUkcLSJ8RAuPenM4HFG1R-sN5-cDBGcTxgR2jaVCna7xV0ZTyBHriB1Nn59mariNlJDiCoBtMUQEmauGxWtfBA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~FqsuZe4RVLOOVUYLTL-GTIohZ8TdSfxx7m2KJtLYFPGOdE4XorTX7Oc7kXbhghPRppXT3jW-slI37M34YNEvLQ== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~G4F_NtyTj3i46fmKm0NorHAeq8tYWWYf6uv5yC1DwzdpWVoYbOPufmFNvdEbxZt4AMdV0gKx3HI46EAXNOQVFg== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~GxetzGUNDgaBBXcTmLK6p9JBDX3I3QPshshbui1IaEWvJbQko-E36tCKwaJYHbleAWz9FqkAM_Tqx3YOmSVkVg== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~H1Wjd5kKWDW4t3SDodxiHV72V8WT0xwPubw5cJTNLkPRLgaILFPh-dpy8EOUNgy1KzrDujFsm9EcTsbuqtMPLA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~JpI5MH4zCgebUHFpXVn4zjtsGtMNnO7BQZWfNARAB5UWa9gqz6YXHR3uLCJ_AvJ3lh53BUVkavsx9TY2FMmxbA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~JujNYkJtcux0Ni4QnR64zu4Wz_zYjyKvYaYZm5ypxTLPSzF3_jNE_NO4sdbDamF8wEqWoky1uf4ZE0JT3L607A== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~KJSEA6DKnb2_FRPSqKZGh41eo-C8x448J9kEBrH012bUrZfOSDvrgmIrU0Vz7Ri3gaS9aKKmSaVMvXsHSlTJVA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~MStOwu3jBlJtcRnxrseVOuhI4kCj--ggFPG7sqrq5w1hjrI3bVyD-bm1Jwyx0noY3wT1rHDEvaGWnV2qsGjGwg== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~McsJ8kFVf3IjhgXIRdw8Xx-EXgbV071bmlj2BBnk52xrWl3sEeiIyxwUsF7mIWvMRWfcFfu4VGHYyqfk2BeHXw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~NHt9fVe4kDdbxnglKcEwXaRK-WsYEOaD23Kbl8SJPRMYHr_Z6SJd_HmG3BROHHR_M6TgSmucONpDJdTj5tjuFw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~Nfo2iwCPcfAcOBIVyoUAK0-PIfr5qYxIKZt-uaSaTBdrTNxAuJ1ItmeDPZ3VdJJmxD_c22No7x482bdd3_yYtw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~S2Qlu11xBhEd5aGSzWsnw1TR8u8PiOF93GO0j5bfNoAFCVzxKOwhRFoIXba2EpQnLQqFdIKyhWN3l70A4GPHmg== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~W7a7M37RO9jgck2zeR0471Pm7e8K0Kqj5tXEouDjvqKZXSrWxMaWD28oqkKKYAiU4608R4S9mM11KyphljdMSw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~XUo1oyPCrlL7CA74wG-OzQ06VOWJYWvHGFHU7keZN1SKaIXjHX5qi_kBzjG_rBCi89-S8GVmCy7S3PHSjG8SbQ== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~Xh0VmDvFNMELHu08-vrs54pegVyUwwDRxx_nXkwyD0NjnYozyqcGAKAr_QWHmw6F8XyuWg51M9KGpJJIFzzGuw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~Xve-wMBp_lxVUgD9qH5GwieGP9cAWtm0xULZvdGjBRUMvaevmpCB5gnbMBuIXAO6a1c9v6WUq0jNVX7ut5HvOw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~ZU1XkZFgnEE22CXEF-pOlcj5f10x-KM1Vw9d4IOLu-NiTZcz7koYPixhdrB1PJr8J-h9NpJmfqEastfxamA1jQ== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~_YkNYEHTsbbtFILJpzH3HenH0t4ShI25dIMdve541CF5bl-jPF3X3F7tq-t5dvP0TEkATsOJdLQdBp1xv4Q-ag== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~boy6mpn2jkwm60jjgQ0TG25UqRdN46LzmgTVCrpy6nBOgkLCGkGHcbceiwjU1itS_vj3-iQX0ZnrWOQrPyfHNA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~bwzpVZ9hAqGDHhXs2FRA82dfGfLmc7-m0uQhZDDfHHO7hQ17M_Np341BZX4WDLhYYS4cdUgaDodlNpdfpG3nXw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~cBxe-9PpAGFdAsYkmdN3lJVqEliLcRYlyoAov0aPZfJGwUr_cOm3XpjO7nmf_2eLf8UAx-rycjnJzw07xLrNCA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~dirWk6W4Pav1oyciuflfJlRu0iuxbYOmrpQapOJ0mV9C1SQ-jvDRv_7h753Cy18-SwULARUdWsyUy3yNNvxF7w== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~ebwZVjSEHroc9jtIm4jd_h_YAqEBcOkAZ4HPNJT8pLCldjRcTq-obQLakxXOhfuoOBlYBoZLuO-Y0lskeZRYKw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~gfcRcmRIr0h09d0jiZsA7nUeQv2XtapxuYEXZy1Z9um0tTJQvz-O5ef5f7zhLenLvjnDtDtlY_aY4Hvpce6e1Q== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~hgOgiVCyv2R0W-f0qKw5xYPeUwj8_ccCM9vKH_7vAQcCO9t8BwR1APGRBv20AONmp-PYMXmtgsBlQkNBRBpdQA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~hrhCl-YRAAr8ByNB_LCgEBsVNHMp92gTIUknetpUHMjcXl4Hpn_uY-h6C45oga0ZALnfGCo6iKTmiPLa4Qvnpg== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~n2yoR7JsyL4DSUwmjnpE4Iq9Qi_eeZrmpPU8cdehDFKfESK7nwxXxfrSMQbk0BQ2lgGPadoRcd1-qr1xVz97jA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~nMCcZm8WvPogyO_nuJ926Q3Q2dqVMN2LdjEL1Kq2wJ_RG-rH-e_6v41l1xZbCsQTa3XykQdEiXNc0HtAvT6IRA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~oc3C7xkUt-OWDL6rrsxs-seS4Fu1bqBWAAXCHalgShaGg9MUrOiRbHT2DcAnhyQFKx6x5FRbvjmYoQWrQiXJZA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~p-ihj7SEgkDXpMu9hvKE_wiX9cvtwyXrdIn964BfedXHKGpC6o7mMPxEyC0kRPVi_EZs_MRV5bAPEpl5h5we0g== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~qlhO_D9oE8uSKH-mZqyRF9pp4Zv1Tv0dIYcqrH4hb1VWlIxcdxmg2j0M8496cQeFXC5bn_JMXdBlD-d6cnFF8w== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~tjpiyIxJR_boTdUNrtFDuKIZoY84fI4lA1oMJbq9e2ZmYKIK5FeRN2O8cV_yMOYJGr4lbv03kTmT70mCjUc2_Q== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~wULeoj18eEKJWAKx1uFQVwS48cUGFcYPRJQj1Ro5XNJsWCwppGSCdIPhwifD6Z2f_j3zfI2SmC2Gg81sBXXW7g== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~zrEihMys4NVV5rx6FmuzEGO2TjloI3OiC7yzIhvqYoRo43ibb2F-Km6Jf4NX-ac62pOLBYZRcjQTvYMpn75_oA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Info.plist +0 -29
- package/Tests/Samples/9squares_AlBoardman.json +0 -1
- package/Tests/Samples/Boat_Loader.json +0 -1
- package/Tests/Samples/HamburgerArrow.json +0 -1
- package/Tests/Samples/IconTransitions.json +0 -1
- package/Tests/Samples/Images/dog.png +0 -0
- package/Tests/Samples/Issues/issue_1403.json +0 -1
- package/Tests/Samples/Issues/issue_1407.json +0 -1
- package/Tests/Samples/Issues/issue_1488.json +0 -1
- package/Tests/Samples/Issues/issue_1505.json +0 -1
- package/Tests/Samples/Issues/issue_1628.json +0 -1
- package/Tests/Samples/Issues/pr_1536.json +0 -1
- package/Tests/Samples/Issues/pr_1563.json +0 -8439
- package/Tests/Samples/Issues/pr_1592.json +0 -5527
- package/Tests/Samples/Issues/pr_1599.json +0 -738
- package/Tests/Samples/Issues/pr_1604_1.json +0 -1
- package/Tests/Samples/Issues/pr_1604_2.json +0 -1
- package/Tests/Samples/LottieFiles/LICENSE.md +0 -14
- package/Tests/Samples/LottieFiles/bounce_strokes.json +0 -1
- package/Tests/Samples/LottieFiles/cactus.json +0 -1
- package/Tests/Samples/LottieFiles/dog_car_ride.json +0 -1
- package/Tests/Samples/LottieFiles/draft_icon.json +0 -1
- package/Tests/Samples/LottieFiles/gradient_1.json +0 -1
- package/Tests/Samples/LottieFiles/gradient_2.json +0 -1
- package/Tests/Samples/LottieFiles/gradient_pill.json +0 -1
- package/Tests/Samples/LottieFiles/gradient_shapes.json +0 -1
- package/Tests/Samples/LottieFiles/gradient_square.json +0 -1
- package/Tests/Samples/LottieFiles/growth.json +0 -1
- package/Tests/Samples/LottieFiles/infinity_loader.json +0 -1
- package/Tests/Samples/LottieFiles/loading_dots_1.json +0 -1
- package/Tests/Samples/LottieFiles/loading_dots_2.json +0 -1
- package/Tests/Samples/LottieFiles/loading_dots_3.json +0 -1
- package/Tests/Samples/LottieFiles/loading_gradient_strokes.json +0 -1
- package/Tests/Samples/LottieFiles/settings_slider.json +0 -1
- package/Tests/Samples/LottieFiles/shop.json +0 -1
- package/Tests/Samples/LottieFiles/step_loader.json +0 -1
- package/Tests/Samples/LottieLogo1.json +0 -1
- package/Tests/Samples/LottieLogo1_masked.json +0 -1
- package/Tests/Samples/LottieLogo2.json +0 -1
- package/Tests/Samples/MotionCorpse_Jrcanest.json +0 -1
- package/Tests/Samples/Nonanimating/BasicLayers.json +0 -1
- package/Tests/Samples/Nonanimating/DisableNodesTest.json +0 -1
- package/Tests/Samples/Nonanimating/FirstText.json +0 -1
- package/Tests/Samples/Nonanimating/GeometryTransformTest.json +0 -1
- package/Tests/Samples/Nonanimating/Text_AnimatedProperties.json +0 -1
- package/Tests/Samples/Nonanimating/Text_Glyph.json +0 -1
- package/Tests/Samples/Nonanimating/Text_NoAnimation.json +0 -1
- package/Tests/Samples/Nonanimating/Text_NoGlyph.json +0 -1
- package/Tests/Samples/Nonanimating/Zoom.json +0 -1
- package/Tests/Samples/Nonanimating/_dog.json +0 -1
- package/Tests/Samples/Nonanimating/base64Test.json +0 -1
- package/Tests/Samples/Nonanimating/blend_mode_test.json +0 -1
- package/Tests/Samples/Nonanimating/keypathTest.json +0 -1
- package/Tests/Samples/Nonanimating/verifyLineHeight.json +0 -1
- package/Tests/Samples/PinJump.json +0 -1
- package/Tests/Samples/Private/BrokenLottieFiles/growth_man.json +0 -874
- package/Tests/Samples/Private/BrokenLottieFiles/rocket.json +0 -1
- package/Tests/Samples/Private/China_EmptyState_Itinerary.json +0 -1
- package/Tests/Samples/Private/LoaderHourglass.json +0 -12070
- package/Tests/Samples/Private/README.md +0 -7
- package/Tests/Samples/Private/Urgency/alarm_animated.json +0 -1
- package/Tests/Samples/Private/Urgency/diamond_animated.json +0 -1
- package/Tests/Samples/Private/Urgency/eye_animated.json +0 -1
- package/Tests/Samples/Private/Urgency/light_bulb_animated.json +0 -1
- package/Tests/Samples/Private/Urgency/light_bulb_static.json +0 -1
- package/Tests/Samples/Private/Urgency/piggy_bank_static.json +0 -1
- package/Tests/Samples/Private/Urgency/price_tag_legacy.json +0 -1
- package/Tests/Samples/Private/Urgency/rausch_alarm.json +0 -1
- package/Tests/Samples/Private/Urgency/rausch_alert.json +0 -1
- package/Tests/Samples/Private/Urgency/rausch_clock.json +0 -1
- package/Tests/Samples/Private/Urgency/rausch_diamond.json +0 -1
- package/Tests/Samples/Private/Urgency/rausch_money.json +0 -1
- package/Tests/Samples/Private/Urgency/rausch_piggy_bank.json +0 -1
- package/Tests/Samples/Private/Urgency/rausch_tag.json +0 -1
- package/Tests/Samples/Private/Urgency/red_envelope_animated.json +0 -1
- package/Tests/Samples/Private/Urgency/tag_animated.json +0 -1
- package/Tests/Samples/Private/Urgency/trophy_animated.json +0 -1
- package/Tests/Samples/Private/Urgency/wings_key_animated.json +0 -1
- package/Tests/Samples/Private/_flexible.json +0 -1
- package/Tests/Samples/Private/aircover.json +0 -1
- package/Tests/Samples/Private/belo_spin_rausch.json +0 -1
- package/Tests/Samples/Private/celebration.json +0 -2821
- package/Tests/Samples/Private/checkbox.json +0 -1
- package/Tests/Samples/Private/checkbox_small.json +0 -1
- package/Tests/Samples/Private/getting_your_trip_ready.json +0 -3540
- package/Tests/Samples/Private/gradient_afternoon.json +0 -1
- package/Tests/Samples/Private/gradient_brand.json +0 -1
- package/Tests/Samples/Private/gradient_evening.json +0 -1
- package/Tests/Samples/Private/gradient_morning.json +0 -1
- package/Tests/Samples/Private/issue_1467.json +0 -1
- package/Tests/Samples/Private/loading_dots.json +0 -1
- package/Tests/Samples/Private/loading_dots_small.json +0 -1
- package/Tests/Samples/Private/payment_loader.json +0 -1
- package/Tests/Samples/Private/radio_button.json +0 -1
- package/Tests/Samples/Private/selfie_intro.json +0 -1
- package/Tests/Samples/Private/stepper_add.json +0 -1
- package/Tests/Samples/Private/stepper_subtract.json +0 -1
- package/Tests/Samples/Private/switch.json +0 -1
- package/Tests/Samples/Private/thumb.json +0 -1
- package/Tests/Samples/Private/toggle_no.json +0 -1
- package/Tests/Samples/Private/toggle_yes.json +0 -1
- package/Tests/Samples/Private/user_error_black_and_white.json +0 -1
- package/Tests/Samples/Private/user_error_cut_off.json +0 -1
- package/Tests/Samples/Switch.json +0 -1
- package/Tests/Samples/Switch_States.json +0 -1
- package/Tests/Samples/TwitterHeart.json +0 -1
- package/Tests/Samples/TwitterHeartButton.json +0 -1
- package/Tests/Samples/TypeFace/A.json +0 -1
- package/Tests/Samples/TypeFace/Apostrophe.json +0 -1
- package/Tests/Samples/TypeFace/B.json +0 -1
- package/Tests/Samples/TypeFace/BlinkingCursor.json +0 -1
- package/Tests/Samples/TypeFace/C.json +0 -1
- package/Tests/Samples/TypeFace/Colon.json +0 -1
- package/Tests/Samples/TypeFace/Comma.json +0 -1
- package/Tests/Samples/TypeFace/D.json +0 -1
- package/Tests/Samples/TypeFace/E.json +0 -1
- package/Tests/Samples/TypeFace/F.json +0 -1
- package/Tests/Samples/TypeFace/G.json +0 -1
- package/Tests/Samples/TypeFace/H.json +0 -1
- package/Tests/Samples/TypeFace/I.json +0 -1
- package/Tests/Samples/TypeFace/J.json +0 -1
- package/Tests/Samples/TypeFace/K.json +0 -1
- package/Tests/Samples/TypeFace/L.json +0 -1
- package/Tests/Samples/TypeFace/M.json +0 -1
- package/Tests/Samples/TypeFace/N.json +0 -1
- package/Tests/Samples/TypeFace/O.json +0 -1
- package/Tests/Samples/TypeFace/P.json +0 -1
- package/Tests/Samples/TypeFace/Q.json +0 -1
- package/Tests/Samples/TypeFace/R.json +0 -1
- package/Tests/Samples/TypeFace/S.json +0 -1
- package/Tests/Samples/TypeFace/T.json +0 -1
- package/Tests/Samples/TypeFace/U.json +0 -1
- package/Tests/Samples/TypeFace/V.json +0 -1
- package/Tests/Samples/TypeFace/W.json +0 -1
- package/Tests/Samples/TypeFace/X.json +0 -1
- package/Tests/Samples/TypeFace/Y.json +0 -1
- package/Tests/Samples/TypeFace/Z.json +0 -1
- package/Tests/Samples/Watermelon.json +0 -1
- package/Tests/Samples/setValueTest.json +0 -1
- package/Tests/Samples/timeremap.json +0 -1
- package/Tests/Samples/vcTransition1.json +0 -1
- package/Tests/Samples/vcTransition2.json +0 -1
- package/script/lint/airbnb.swiftformat +0 -68
- package/script/lint/swiftlint.yml +0 -38
- package/script/test-carthage/Carthage/Build/.lottie-ios.version +0 -19
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/Info.plist +0 -46
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/BCSymbolMaps/BF971162-BE99-3507-B5B3-11947DC6B176.bcsymbolmap +0 -14778
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/Lottie.framework/Headers/Lottie-Swift.h +0 -673
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/Lottie.framework/Info.plist +0 -0
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/Lottie.framework/Lottie +0 -0
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/Lottie.framework/Modules/Lottie.swiftmodule/arm64-apple-ios.swiftdoc +0 -0
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/Lottie.framework/Modules/Lottie.swiftmodule/arm64-apple-ios.swiftmodule +0 -0
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/Lottie.framework/Modules/Lottie.swiftmodule/arm64.swiftdoc +0 -0
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/Lottie.framework/Modules/Lottie.swiftmodule/arm64.swiftmodule +0 -0
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/Lottie.framework/Modules/module.modulemap +0 -4
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/dSYMs/Lottie.framework.dSYM/Contents/Info.plist +0 -20
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/dSYMs/Lottie.framework.dSYM/Contents/Resources/DWARF/Lottie +0 -0
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Headers/Lottie-Swift.h +0 -1352
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Info.plist +0 -0
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Lottie +0 -0
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/Lottie.swiftmodule/Project/arm64-apple-ios-simulator.swiftsourceinfo +0 -0
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/Lottie.swiftmodule/Project/arm64.swiftsourceinfo +0 -0
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/Lottie.swiftmodule/Project/x86_64-apple-ios-simulator.swiftsourceinfo +0 -0
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/Lottie.swiftmodule/Project/x86_64.swiftsourceinfo +0 -0
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/Lottie.swiftmodule/arm64-apple-ios-simulator.swiftdoc +0 -0
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/Lottie.swiftmodule/arm64-apple-ios-simulator.swiftmodule +0 -0
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/Lottie.swiftmodule/arm64.swiftdoc +0 -0
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/Lottie.swiftmodule/arm64.swiftmodule +0 -0
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/Lottie.swiftmodule/x86_64-apple-ios-simulator.swiftdoc +0 -0
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/Lottie.swiftmodule/x86_64-apple-ios-simulator.swiftmodule +0 -0
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/Lottie.swiftmodule/x86_64.swiftdoc +0 -0
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/Lottie.swiftmodule/x86_64.swiftmodule +0 -0
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/module.modulemap +0 -4
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/_CodeSignature/CodeResources +0 -256
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/dSYMs/Lottie.framework.dSYM/Contents/Info.plist +0 -20
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/dSYMs/Lottie.framework.dSYM/Contents/Resources/DWARF/Lottie +0 -0
- package/script/test-carthage/Carthage/Checkouts/lottie-ios/Lottie.xcodeproj/project.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- package/script/test-carthage/Carthage/Checkouts/lottie-ios/Lottie.xcodeproj/xcuserdata/cal.xcuserdatad/xcschemes/xcschememanagement.plist +0 -37
- package/script/test-carthage/Carthage/Checkouts/lottie-ios/Lottie.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
|
@@ -82,7 +82,6 @@ extension Animation {
|
|
|
82
82
|
animationCache: AnimationCacheProvider? = nil)
|
|
83
83
|
-> Animation?
|
|
84
84
|
{
|
|
85
|
-
|
|
86
85
|
/// Check cache for animation
|
|
87
86
|
if
|
|
88
87
|
let animationCache = animationCache,
|
|
@@ -173,14 +172,14 @@ extension Animation {
|
|
|
173
172
|
///
|
|
174
173
|
public static func loadedFrom(
|
|
175
174
|
url: URL,
|
|
175
|
+
session: URLSession = .shared,
|
|
176
176
|
closure: @escaping Animation.DownloadClosure,
|
|
177
177
|
animationCache: AnimationCacheProvider?)
|
|
178
178
|
{
|
|
179
|
-
|
|
180
179
|
if let animationCache = animationCache, let animation = animationCache.animation(forKey: url.absoluteString) {
|
|
181
180
|
closure(animation)
|
|
182
181
|
} else {
|
|
183
|
-
let task =
|
|
182
|
+
let task = session.dataTask(with: url) { data, _, error in
|
|
184
183
|
guard error == nil, let jsonData = data else {
|
|
185
184
|
DispatchQueue.main.async {
|
|
186
185
|
closure(nil)
|
|
@@ -198,7 +197,6 @@ extension Animation {
|
|
|
198
197
|
closure(nil)
|
|
199
198
|
}
|
|
200
199
|
}
|
|
201
|
-
|
|
202
200
|
}
|
|
203
201
|
task.resume()
|
|
204
202
|
}
|
|
@@ -358,7 +358,6 @@ final public class AnimationView: AnimationViewBase {
|
|
|
358
358
|
/// Animatable.
|
|
359
359
|
public var viewportFrame: CGRect? = nil {
|
|
360
360
|
didSet {
|
|
361
|
-
|
|
362
361
|
// This is really ugly, but is needed to trigger a layout pass within an animation block.
|
|
363
362
|
// Typically this happens automatically, when layout objects are UIView based.
|
|
364
363
|
// The animation layer is a CALayer which will not implicitly grab the animation
|
|
@@ -466,7 +465,7 @@ final public class AnimationView: AnimationViewBase {
|
|
|
466
465
|
}
|
|
467
466
|
|
|
468
467
|
let context = AnimationContext(
|
|
469
|
-
playFrom: fromFrame ??
|
|
468
|
+
playFrom: fromFrame ?? currentFrame,
|
|
470
469
|
playTo: toFrame,
|
|
471
470
|
closure: completion)
|
|
472
471
|
addNewAnimationForContext(context)
|
|
@@ -490,7 +489,6 @@ final public class AnimationView: AnimationViewBase {
|
|
|
490
489
|
loopMode: LottieLoopMode? = nil,
|
|
491
490
|
completion: LottieCompletionBlock? = nil)
|
|
492
491
|
{
|
|
493
|
-
|
|
494
492
|
guard let animation = animation, let markers = animation.markerMap, let to = markers[toMarker] else {
|
|
495
493
|
return
|
|
496
494
|
}
|
|
@@ -927,7 +925,11 @@ final public class AnimationView: AnimationViewBase {
|
|
|
927
925
|
|
|
928
926
|
// MARK: Fileprivate
|
|
929
927
|
|
|
928
|
+
/// Context describing the animation that is currently playing in this `AnimationView`
|
|
929
|
+
/// - When non-nil, an animation is currently playing in this view. Otherwise,
|
|
930
|
+
/// the view is paused on a specific frame.
|
|
930
931
|
fileprivate var animationContext: AnimationContext?
|
|
932
|
+
|
|
931
933
|
fileprivate var _activeAnimationName: String = AnimationView.animationName
|
|
932
934
|
fileprivate var animationID = 0
|
|
933
935
|
|
|
@@ -943,7 +945,6 @@ final public class AnimationView: AnimationViewBase {
|
|
|
943
945
|
}
|
|
944
946
|
|
|
945
947
|
fileprivate func makeAnimationLayer(usingEngine renderingEngine: RenderingEngineOption) {
|
|
946
|
-
|
|
947
948
|
/// Remove current animation if any
|
|
948
949
|
removeCurrentAnimation()
|
|
949
950
|
|
|
@@ -995,6 +996,7 @@ final public class AnimationView: AnimationViewBase {
|
|
|
995
996
|
let coreAnimationLayer = try CoreAnimationLayer(
|
|
996
997
|
animation: animation,
|
|
997
998
|
imageProvider: imageProvider.cachedImageProvider,
|
|
999
|
+
textProvider: textProvider,
|
|
998
1000
|
fontProvider: fontProvider,
|
|
999
1001
|
compatibilityTrackerMode: .track,
|
|
1000
1002
|
logger: logger)
|
|
@@ -1029,6 +1031,7 @@ final public class AnimationView: AnimationViewBase {
|
|
|
1029
1031
|
let coreAnimationLayer = try CoreAnimationLayer(
|
|
1030
1032
|
animation: animation,
|
|
1031
1033
|
imageProvider: imageProvider.cachedImageProvider,
|
|
1034
|
+
textProvider: textProvider,
|
|
1032
1035
|
fontProvider: fontProvider,
|
|
1033
1036
|
compatibilityTrackerMode: .abort,
|
|
1034
1037
|
logger: logger)
|
|
@@ -1131,12 +1134,18 @@ final public class AnimationView: AnimationViewBase {
|
|
|
1131
1134
|
/// - This is not necessary with the Core Animation engine, and skipping
|
|
1132
1135
|
/// this step lets us avoid building the animations twice (once paused
|
|
1133
1136
|
/// and once again playing)
|
|
1137
|
+
/// - This method should only be called immediately before setting up another
|
|
1138
|
+
/// animation -- otherwise this AnimationView could be put in an inconsistent state.
|
|
1134
1139
|
fileprivate func removeCurrentAnimationIfNecessary() {
|
|
1135
1140
|
switch currentRenderingEngine {
|
|
1136
1141
|
case .mainThread:
|
|
1137
1142
|
removeCurrentAnimation()
|
|
1138
1143
|
case .coreAnimation, nil:
|
|
1139
|
-
|
|
1144
|
+
// We still need to remove the `animationContext`, since it should only be present
|
|
1145
|
+
// when an animation is actually playing. Without this calling `removeCurrentAnimationIfNecessary()`
|
|
1146
|
+
// and then setting the animation to a specific paused frame would put this
|
|
1147
|
+
// `AnimationView` in an inconsistent state.
|
|
1148
|
+
animationContext = nil
|
|
1140
1149
|
}
|
|
1141
1150
|
}
|
|
1142
1151
|
|
|
@@ -1203,10 +1212,19 @@ final public class AnimationView: AnimationViewBase {
|
|
|
1203
1212
|
|
|
1204
1213
|
if let coreAnimationLayer = animationlayer as? CoreAnimationLayer {
|
|
1205
1214
|
var animationContext = animationContext
|
|
1215
|
+
|
|
1216
|
+
// Core Animation doesn't natively support negative speed values,
|
|
1217
|
+
// so instead we can swap `playFrom` / `playTo`
|
|
1218
|
+
if animationSpeed < 0 {
|
|
1219
|
+
let temp = animationContext.playFrom
|
|
1220
|
+
animationContext.playFrom = animationContext.playTo
|
|
1221
|
+
animationContext.playTo = temp
|
|
1222
|
+
}
|
|
1223
|
+
|
|
1206
1224
|
var timingConfiguration = CoreAnimationLayer.CAMediaTimingConfiguration(
|
|
1207
1225
|
autoreverses: loopMode.caAnimationConfiguration.autoreverses,
|
|
1208
1226
|
repeatCount: loopMode.caAnimationConfiguration.repeatCount,
|
|
1209
|
-
speed: Float(animationSpeed))
|
|
1227
|
+
speed: abs(Float(animationSpeed)))
|
|
1210
1228
|
|
|
1211
1229
|
// The animation should start playing from the `currentFrame`,
|
|
1212
1230
|
// if `currentFrame` is included in the time range being played.
|
|
@@ -1227,7 +1245,11 @@ final public class AnimationView: AnimationViewBase {
|
|
|
1227
1245
|
// the duration of the _first_ loop. Instead of setting `playFrom`, we just add a `timeOffset`
|
|
1228
1246
|
// so the first loop begins at `currentTime` but all subsequent loops are the standard duration.
|
|
1229
1247
|
default:
|
|
1230
|
-
|
|
1248
|
+
if animationSpeed < 0 {
|
|
1249
|
+
timingConfiguration.timeOffset = animation.time(forFrame: animationContext.playFrom) - currentTime
|
|
1250
|
+
} else {
|
|
1251
|
+
timingConfiguration.timeOffset = currentTime - animation.time(forFrame: animationContext.playFrom)
|
|
1252
|
+
}
|
|
1231
1253
|
}
|
|
1232
1254
|
}
|
|
1233
1255
|
|
|
@@ -23,11 +23,12 @@ extension AnimationView {
|
|
|
23
23
|
name: String,
|
|
24
24
|
bundle: Bundle = Bundle.main,
|
|
25
25
|
imageProvider: AnimationImageProvider? = nil,
|
|
26
|
-
animationCache: AnimationCacheProvider? = LRUAnimationCache.sharedCache
|
|
26
|
+
animationCache: AnimationCacheProvider? = LRUAnimationCache.sharedCache,
|
|
27
|
+
configuration: LottieConfiguration = .shared)
|
|
27
28
|
{
|
|
28
29
|
let animation = Animation.named(name, bundle: bundle, subdirectory: nil, animationCache: animationCache)
|
|
29
30
|
let provider = imageProvider ?? BundleImageProvider(bundle: bundle, searchPath: nil)
|
|
30
|
-
self.init(animation: animation, imageProvider: provider)
|
|
31
|
+
self.init(animation: animation, imageProvider: provider, configuration: configuration)
|
|
31
32
|
}
|
|
32
33
|
|
|
33
34
|
/// Loads a Lottie animation from a JSON file in a specific path on disk.
|
|
@@ -38,12 +39,13 @@ extension AnimationView {
|
|
|
38
39
|
public convenience init(
|
|
39
40
|
filePath: String,
|
|
40
41
|
imageProvider: AnimationImageProvider? = nil,
|
|
41
|
-
animationCache: AnimationCacheProvider? = LRUAnimationCache.sharedCache
|
|
42
|
+
animationCache: AnimationCacheProvider? = LRUAnimationCache.sharedCache,
|
|
43
|
+
configuration: LottieConfiguration = .shared)
|
|
42
44
|
{
|
|
43
45
|
let animation = Animation.filepath(filePath, animationCache: animationCache)
|
|
44
46
|
let provider = imageProvider ??
|
|
45
47
|
FilepathImageProvider(filepath: URL(fileURLWithPath: filePath).deletingLastPathComponent().path)
|
|
46
|
-
self.init(animation: animation, imageProvider: provider)
|
|
48
|
+
self.init(animation: animation, imageProvider: provider, configuration: configuration)
|
|
47
49
|
}
|
|
48
50
|
|
|
49
51
|
/// Loads a Lottie animation asynchronously from the URL
|
|
@@ -56,15 +58,14 @@ extension AnimationView {
|
|
|
56
58
|
url: URL,
|
|
57
59
|
imageProvider: AnimationImageProvider? = nil,
|
|
58
60
|
closure: @escaping AnimationView.DownloadClosure,
|
|
59
|
-
animationCache: AnimationCacheProvider? = LRUAnimationCache.sharedCache
|
|
61
|
+
animationCache: AnimationCacheProvider? = LRUAnimationCache.sharedCache,
|
|
62
|
+
configuration: LottieConfiguration = .shared)
|
|
60
63
|
{
|
|
61
|
-
|
|
62
64
|
if let animationCache = animationCache, let animation = animationCache.animation(forKey: url.absoluteString) {
|
|
63
|
-
self.init(animation: animation, imageProvider: imageProvider)
|
|
65
|
+
self.init(animation: animation, imageProvider: imageProvider, configuration: configuration)
|
|
64
66
|
closure(nil)
|
|
65
67
|
} else {
|
|
66
|
-
|
|
67
|
-
self.init(animation: nil, imageProvider: imageProvider)
|
|
68
|
+
self.init(animation: nil, imageProvider: imageProvider, configuration: configuration)
|
|
68
69
|
|
|
69
70
|
Animation.loadedFrom(url: url, closure: { animation in
|
|
70
71
|
if let animation = animation {
|
|
@@ -87,11 +88,12 @@ extension AnimationView {
|
|
|
87
88
|
asset name: String,
|
|
88
89
|
bundle: Bundle = Bundle.main,
|
|
89
90
|
imageProvider: AnimationImageProvider? = nil,
|
|
90
|
-
animationCache: AnimationCacheProvider? = LRUAnimationCache.sharedCache
|
|
91
|
+
animationCache: AnimationCacheProvider? = LRUAnimationCache.sharedCache,
|
|
92
|
+
configuration: LottieConfiguration = .shared)
|
|
91
93
|
{
|
|
92
94
|
let animation = Animation.asset(name, bundle: bundle, animationCache: animationCache)
|
|
93
95
|
let provider = imageProvider ?? BundleImageProvider(bundle: bundle, searchPath: nil)
|
|
94
|
-
self.init(animation: animation, imageProvider: provider)
|
|
96
|
+
self.init(animation: animation, imageProvider: provider, configuration: configuration)
|
|
95
97
|
}
|
|
96
98
|
|
|
97
99
|
// MARK: Public
|
|
@@ -94,13 +94,11 @@ public final class GradientValueProvider: ValueProvider {
|
|
|
94
94
|
private var value: [Double] = []
|
|
95
95
|
|
|
96
96
|
private func value(from colors: [Color], locations: [Double]) -> [Double] {
|
|
97
|
-
|
|
98
97
|
var colorValues = [Double]()
|
|
99
98
|
var alphaValues = [Double]()
|
|
100
99
|
var shouldAddAlphaValues = false
|
|
101
100
|
|
|
102
101
|
for i in 0..<colors.count {
|
|
103
|
-
|
|
104
102
|
if colors[i].a < 1 { shouldAddAlphaValues = true }
|
|
105
103
|
|
|
106
104
|
let location = locations.count > i
|
|
@@ -10,8 +10,19 @@ public final class LottieLogger {
|
|
|
10
10
|
// MARK: Lifecycle
|
|
11
11
|
|
|
12
12
|
public init(
|
|
13
|
-
assert: @escaping Assert =
|
|
14
|
-
|
|
13
|
+
assert: @escaping Assert = { condition, message, file, line in
|
|
14
|
+
// If we default to `Swift.assert` directly with `assert: Assert = Swift.assert`,
|
|
15
|
+
// the call will unexpectedly not respect the -O flag and will crash in release
|
|
16
|
+
// https://github.com/apple/swift/issues/60249
|
|
17
|
+
Swift.assert(condition(), message(), file: file, line: line)
|
|
18
|
+
},
|
|
19
|
+
assertionFailure: @escaping AssertionFailure = { message, file, line in
|
|
20
|
+
// If we default to `Swift.assertionFailure` directly with
|
|
21
|
+
// `assertionFailure: AssertionFailure = Swift.assertionFailure`,
|
|
22
|
+
// the call will unexpectedly not respect the -O flag and will crash in release
|
|
23
|
+
// https://github.com/apple/swift/issues/60249
|
|
24
|
+
Swift.assertionFailure(message(), file: file, line: line)
|
|
25
|
+
},
|
|
15
26
|
warn: @escaping Warn = { message, _, _ in
|
|
16
27
|
#if DEBUG
|
|
17
28
|
// swiftlint:disable:next no_direct_standard_out_logs
|
|
@@ -114,10 +125,12 @@ extension LottieLogger {
|
|
|
114
125
|
LottieLogger(
|
|
115
126
|
assert: { condition, message, _, _ in
|
|
116
127
|
if !condition() {
|
|
128
|
+
// swiftlint:disable:next no_direct_standard_out_logs
|
|
117
129
|
print(message())
|
|
118
130
|
}
|
|
119
131
|
},
|
|
120
132
|
assertionFailure: { message, _, _ in
|
|
133
|
+
// swiftlint:disable:next no_direct_standard_out_logs
|
|
121
134
|
print(message())
|
|
122
135
|
})
|
|
123
136
|
}
|
|
@@ -18,20 +18,26 @@ open class AnimatedButton: AnimatedControl {
|
|
|
18
18
|
configuration: LottieConfiguration = .shared)
|
|
19
19
|
{
|
|
20
20
|
super.init(animation: animation, configuration: configuration)
|
|
21
|
-
|
|
21
|
+
isAccessibilityElement = true
|
|
22
22
|
}
|
|
23
23
|
|
|
24
24
|
public override init() {
|
|
25
25
|
super.init()
|
|
26
|
-
|
|
26
|
+
isAccessibilityElement = true
|
|
27
27
|
}
|
|
28
28
|
|
|
29
29
|
required public init?(coder aDecoder: NSCoder) {
|
|
30
30
|
super.init(coder: aDecoder)
|
|
31
|
+
isAccessibilityElement = true
|
|
31
32
|
}
|
|
32
33
|
|
|
33
34
|
// MARK: Public
|
|
34
35
|
|
|
36
|
+
public override var accessibilityTraits: UIAccessibilityTraits {
|
|
37
|
+
set { super.accessibilityTraits = newValue }
|
|
38
|
+
get { super.accessibilityTraits.union(.button) }
|
|
39
|
+
}
|
|
40
|
+
|
|
35
41
|
/// Sets the play range for the given UIControlEvent.
|
|
36
42
|
public func setPlayRange(fromProgress: AnimationProgressTime, toProgress: AnimationProgressTime, event: UIControl.Event) {
|
|
37
43
|
rangesForEvents[event.rawValue] = (from: fromProgress, to: toProgress)
|
|
@@ -70,9 +76,9 @@ open class AnimatedButton: AnimatedControl {
|
|
|
70
76
|
}
|
|
71
77
|
}
|
|
72
78
|
|
|
73
|
-
// MARK:
|
|
79
|
+
// MARK: Private
|
|
74
80
|
|
|
75
|
-
|
|
81
|
+
private var rangesForEvents: [UInt : (from: CGFloat, to: CGFloat)] =
|
|
76
82
|
[UIControl.Event.touchUpInside.rawValue : (from: 0, to: 1)]
|
|
77
83
|
}
|
|
78
84
|
#endif
|
|
@@ -100,9 +100,7 @@ open class AnimatedControl: UIControl {
|
|
|
100
100
|
super.cancelTracking(with: event)
|
|
101
101
|
}
|
|
102
102
|
|
|
103
|
-
open func animationDidSet() {
|
|
104
|
-
|
|
105
|
-
}
|
|
103
|
+
open func animationDidSet() { }
|
|
106
104
|
|
|
107
105
|
// MARK: Public
|
|
108
106
|
|
|
@@ -158,9 +156,9 @@ open class AnimatedControl: UIControl {
|
|
|
158
156
|
}
|
|
159
157
|
}
|
|
160
158
|
|
|
161
|
-
// MARK:
|
|
159
|
+
// MARK: Private
|
|
162
160
|
|
|
163
|
-
|
|
161
|
+
private func commonInit() {
|
|
164
162
|
animationView.clipsToBounds = false
|
|
165
163
|
clipsToBounds = true
|
|
166
164
|
animationView.translatesAutoresizingMaskIntoConstraints = false
|
|
@@ -32,8 +32,8 @@ open class AnimatedSwitch: AnimatedControl {
|
|
|
32
32
|
hapticGenerator = NullHapticGenerator()
|
|
33
33
|
#endif
|
|
34
34
|
super.init(animation: animation, configuration: configuration)
|
|
35
|
+
isAccessibilityElement = true
|
|
35
36
|
updateOnState(isOn: _isOn, animated: false, shouldFireHaptics: false)
|
|
36
|
-
accessibilityTraits = UIAccessibilityTraits.button
|
|
37
37
|
}
|
|
38
38
|
|
|
39
39
|
public override init() {
|
|
@@ -48,8 +48,8 @@ open class AnimatedSwitch: AnimatedControl {
|
|
|
48
48
|
hapticGenerator = NullHapticGenerator()
|
|
49
49
|
#endif
|
|
50
50
|
super.init()
|
|
51
|
+
isAccessibilityElement = true
|
|
51
52
|
updateOnState(isOn: _isOn, animated: false, shouldFireHaptics: false)
|
|
52
|
-
accessibilityTraits = UIAccessibilityTraits.button
|
|
53
53
|
}
|
|
54
54
|
|
|
55
55
|
required public init?(coder aDecoder: NSCoder) {
|
|
@@ -64,7 +64,7 @@ open class AnimatedSwitch: AnimatedControl {
|
|
|
64
64
|
hapticGenerator = NullHapticGenerator()
|
|
65
65
|
#endif
|
|
66
66
|
super.init(coder: aDecoder)
|
|
67
|
-
|
|
67
|
+
isAccessibilityElement = true
|
|
68
68
|
}
|
|
69
69
|
|
|
70
70
|
// MARK: Public
|
|
@@ -79,6 +79,11 @@ open class AnimatedSwitch: AnimatedControl {
|
|
|
79
79
|
/// The cancel behavior for the switch. See CancelBehavior for options
|
|
80
80
|
public var cancelBehavior: CancelBehavior = .reverse
|
|
81
81
|
|
|
82
|
+
public override var accessibilityTraits: UIAccessibilityTraits {
|
|
83
|
+
set { super.accessibilityTraits = newValue }
|
|
84
|
+
get { super.accessibilityTraits.union(.button) }
|
|
85
|
+
}
|
|
86
|
+
|
|
82
87
|
/// The current state of the switch.
|
|
83
88
|
public var isOn: Bool {
|
|
84
89
|
set {
|
|
@@ -203,9 +208,7 @@ protocol ImpactGenerator {
|
|
|
203
208
|
// MARK: - NullHapticGenerator
|
|
204
209
|
|
|
205
210
|
class NullHapticGenerator: ImpactGenerator {
|
|
206
|
-
func generateImpact() {
|
|
207
|
-
|
|
208
|
-
}
|
|
211
|
+
func generateImpact() { }
|
|
209
212
|
}
|
|
210
213
|
|
|
211
214
|
#if os(iOS)
|
|
@@ -32,7 +32,6 @@ public class BundleImageProvider: AnimationImageProvider {
|
|
|
32
32
|
// MARK: Public
|
|
33
33
|
|
|
34
34
|
public func imageForAsset(asset: ImageAsset) -> CGImage? {
|
|
35
|
-
|
|
36
35
|
if
|
|
37
36
|
let data = Data(imageAsset: asset),
|
|
38
37
|
let image = UIImage(data: data)
|
|
@@ -68,7 +67,7 @@ public class BundleImageProvider: AnimationImageProvider {
|
|
|
68
67
|
|
|
69
68
|
if imagePath == nil {
|
|
70
69
|
guard let image = UIImage(named: asset.name, in: bundle, compatibleWith: nil) else {
|
|
71
|
-
LottieLogger.shared.
|
|
70
|
+
LottieLogger.shared.warn("Could not find image \"\(asset.name)\" in bundle")
|
|
72
71
|
return nil
|
|
73
72
|
}
|
|
74
73
|
return image.cgImage
|
|
@@ -76,7 +75,7 @@ public class BundleImageProvider: AnimationImageProvider {
|
|
|
76
75
|
|
|
77
76
|
guard let foundPath = imagePath, let image = UIImage(contentsOfFile: foundPath) else {
|
|
78
77
|
/// No image found.
|
|
79
|
-
LottieLogger.shared.
|
|
78
|
+
LottieLogger.shared.warn("Could not find image \"\(asset.name)\" in bundle")
|
|
80
79
|
return nil
|
|
81
80
|
}
|
|
82
81
|
return image.cgImage
|
|
@@ -29,7 +29,6 @@ public class FilepathImageProvider: AnimationImageProvider {
|
|
|
29
29
|
// MARK: Public
|
|
30
30
|
|
|
31
31
|
public func imageForAsset(asset: ImageAsset) -> CGImage? {
|
|
32
|
-
|
|
33
32
|
if
|
|
34
33
|
asset.name.hasPrefix("data:"),
|
|
35
34
|
let url = URL(string: asset.name),
|
|
@@ -49,7 +48,7 @@ public class FilepathImageProvider: AnimationImageProvider {
|
|
|
49
48
|
return UIImage(contentsOfFile: pathWithDirectory)?.cgImage
|
|
50
49
|
}
|
|
51
50
|
|
|
52
|
-
LottieLogger.shared.
|
|
51
|
+
LottieLogger.shared.warn("Could not find image \"\(asset.name)\" in bundle")
|
|
53
52
|
return nil
|
|
54
53
|
}
|
|
55
54
|
|
|
@@ -29,7 +29,6 @@ public class BundleImageProvider: AnimationImageProvider {
|
|
|
29
29
|
// MARK: Public
|
|
30
30
|
|
|
31
31
|
public func imageForAsset(asset: ImageAsset) -> CGImage? {
|
|
32
|
-
|
|
33
32
|
if
|
|
34
33
|
let data = Data(imageAsset: asset),
|
|
35
34
|
let image = NSImage(data: data)
|
|
@@ -65,7 +64,7 @@ public class BundleImageProvider: AnimationImageProvider {
|
|
|
65
64
|
|
|
66
65
|
guard let foundPath = imagePath, let image = NSImage(contentsOfFile: foundPath) else {
|
|
67
66
|
/// No image found.
|
|
68
|
-
LottieLogger.shared.
|
|
67
|
+
LottieLogger.shared.warn("Could not find image \"\(asset.name)\" in bundle")
|
|
69
68
|
return nil
|
|
70
69
|
}
|
|
71
70
|
return image.lottie_CGImage
|
|
@@ -28,7 +28,6 @@ public class FilepathImageProvider: AnimationImageProvider {
|
|
|
28
28
|
// MARK: Public
|
|
29
29
|
|
|
30
30
|
public func imageForAsset(asset: ImageAsset) -> CGImage? {
|
|
31
|
-
|
|
32
31
|
if
|
|
33
32
|
asset.name.hasPrefix("data:"),
|
|
34
33
|
let url = URL(string: asset.name),
|
|
@@ -40,7 +39,6 @@ public class FilepathImageProvider: AnimationImageProvider {
|
|
|
40
39
|
|
|
41
40
|
let directPath = filepath.appendingPathComponent(asset.name).path
|
|
42
41
|
if FileManager.default.fileExists(atPath: directPath) {
|
|
43
|
-
|
|
44
42
|
return NSImage(contentsOfFile: directPath)?.lottie_CGImage
|
|
45
43
|
}
|
|
46
44
|
|
|
@@ -49,7 +47,7 @@ public class FilepathImageProvider: AnimationImageProvider {
|
|
|
49
47
|
return NSImage(contentsOfFile: pathWithDirectory)?.lottie_CGImage
|
|
50
48
|
}
|
|
51
49
|
|
|
52
|
-
LottieLogger.shared.
|
|
50
|
+
LottieLogger.shared.warn("Could not find image \"\(asset.name)\" in bundle")
|
|
53
51
|
return nil
|
|
54
52
|
}
|
|
55
53
|
|
|
@@ -49,6 +49,10 @@ final class AnimationKeypathTests: XCTestCase {
|
|
|
49
49
|
snapshotHierarchyKeypaths(
|
|
50
50
|
animationName: "Switch",
|
|
51
51
|
configuration: LottieConfiguration(renderingEngine: .coreAnimation))
|
|
52
|
+
|
|
53
|
+
snapshotHierarchyKeypaths(
|
|
54
|
+
animationName: "Issues/issue_1664",
|
|
55
|
+
configuration: LottieConfiguration(renderingEngine: .coreAnimation))
|
|
52
56
|
}
|
|
53
57
|
|
|
54
58
|
/// The Core Animation engine supports a subset of the keypaths supported by the Main Thread engine.
|
|
@@ -58,7 +62,12 @@ final class AnimationKeypathTests: XCTestCase {
|
|
|
58
62
|
let coreAnimationKeypaths = hierarchyKeypaths(animationName: "Switch", configuration: .init(renderingEngine: .coreAnimation))
|
|
59
63
|
|
|
60
64
|
for coreAnimationKeypath in coreAnimationKeypaths {
|
|
61
|
-
XCTAssert(
|
|
65
|
+
XCTAssert(
|
|
66
|
+
mainThreadKeypaths.contains(coreAnimationKeypath),
|
|
67
|
+
"""
|
|
68
|
+
\(coreAnimationKeypath) from Core Animation rendering engine \
|
|
69
|
+
is not supported in Main Thread rendering engine
|
|
70
|
+
""")
|
|
62
71
|
}
|
|
63
72
|
}
|
|
64
73
|
|
|
@@ -19,6 +19,7 @@ final class AutomaticEngineTests: XCTestCase {
|
|
|
19
19
|
let animationLayer = try XCTUnwrap(CoreAnimationLayer(
|
|
20
20
|
animation: animation,
|
|
21
21
|
imageProvider: BundleImageProvider(bundle: Bundle.main, searchPath: nil),
|
|
22
|
+
textProvider: DefaultTextProvider(),
|
|
22
23
|
fontProvider: DefaultFontProvider(),
|
|
23
24
|
compatibilityTrackerMode: .track,
|
|
24
25
|
logger: .shared))
|
package/Tests/ParsingTests.swift
CHANGED
|
@@ -33,7 +33,8 @@ func XCTAssertNoDiff<T>(
|
|
|
33
33
|
_ expected: @autoclosure () throws -> T,
|
|
34
34
|
_ received: @autoclosure () throws -> T,
|
|
35
35
|
file: StaticString = #filePath,
|
|
36
|
-
line: UInt = #line) rethrows
|
|
36
|
+
line: UInt = #line) rethrows
|
|
37
|
+
{
|
|
37
38
|
let expected = try expected()
|
|
38
39
|
let received = try received()
|
|
39
40
|
let diff = diff(expected, received)
|
|
@@ -50,7 +50,7 @@ final class PerformanceTests: XCTestCase {
|
|
|
50
50
|
|
|
51
51
|
// The automatic engine option should have the same performance as the core animation engine,
|
|
52
52
|
// when rendering an animation supported by the CA engine.
|
|
53
|
-
XCTAssertEqual(ratio, 1.0, accuracy: 0.
|
|
53
|
+
XCTAssertEqual(ratio, 1.0, accuracy: 0.5)
|
|
54
54
|
}
|
|
55
55
|
|
|
56
56
|
func testAnimationViewScrubbing_simpleAnimation() {
|
|
@@ -66,7 +66,7 @@ final class PerformanceTests: XCTestCase {
|
|
|
66
66
|
func testParsing_simpleAnimation() throws {
|
|
67
67
|
let data = try XCTUnwrap(Bundle.module.getAnimationData("loading_dots_1", subdirectory: "Samples/LottieFiles"))
|
|
68
68
|
let ratio = try compareDeserializationPerformance(data: data, iterations: 2000)
|
|
69
|
-
XCTAssertEqual(ratio, 2, accuracy: 0.
|
|
69
|
+
XCTAssertEqual(ratio, 2, accuracy: 0.65)
|
|
70
70
|
}
|
|
71
71
|
|
|
72
72
|
func testParsing_complexAnimation() throws {
|
|
@@ -106,41 +106,40 @@ final class PerformanceTests: XCTestCase {
|
|
|
106
106
|
{
|
|
107
107
|
let engineAPerformance = measurePerformance {
|
|
108
108
|
for _ in 0..<iterations {
|
|
109
|
-
|
|
110
|
-
// in order for the layers to be deallocated immediately. Otherwise
|
|
111
|
-
// the layers aren't deallocated until the end of the test run,
|
|
112
|
-
// which causes memory usage to grow unbounded.
|
|
113
|
-
CATransaction.begin()
|
|
114
|
-
let animationView = setupAnimationView(with: animation, configuration: .init(renderingEngine: engineA))
|
|
115
|
-
// Call `display()` on the layer to make sure any pending setup occurs immediately
|
|
116
|
-
animationView.animationLayer!.display()
|
|
117
|
-
CATransaction.commit()
|
|
109
|
+
setUpAndTearDownAnimationView(with: animation, configuration: .init(renderingEngine: engineA))
|
|
118
110
|
}
|
|
119
111
|
}
|
|
120
112
|
|
|
121
|
-
|
|
113
|
+
LottieLogger.shared.info("\(engineA) engine took \(engineAPerformance) seconds")
|
|
122
114
|
|
|
123
115
|
let engineBPerformance = measurePerformance {
|
|
124
116
|
for _ in 0..<iterations {
|
|
125
|
-
|
|
126
|
-
// in order for the layers to be deallocated immediately. Otherwise
|
|
127
|
-
// the layers aren't deallocated until the end of the test run,
|
|
128
|
-
// which causes memory usage to grow unbounded.
|
|
129
|
-
CATransaction.begin()
|
|
130
|
-
let animationView = setupAnimationView(with: animation, configuration: .init(renderingEngine: engineB))
|
|
131
|
-
// Call `display()` on the layer to make sure any pending setup occurs immediately
|
|
132
|
-
animationView.animationLayer!.display()
|
|
133
|
-
CATransaction.commit()
|
|
117
|
+
setUpAndTearDownAnimationView(with: animation, configuration: .init(renderingEngine: engineB))
|
|
134
118
|
}
|
|
135
119
|
}
|
|
136
120
|
|
|
137
|
-
|
|
121
|
+
LottieLogger.shared.info("\(engineB) engine took \(engineBPerformance) seconds")
|
|
138
122
|
|
|
139
123
|
let ratio = engineBPerformance / engineAPerformance
|
|
140
|
-
|
|
124
|
+
LottieLogger.shared.info("\(engineB) engine took \(ratio)x as long as \(engineA) engine")
|
|
141
125
|
return ratio
|
|
142
126
|
}
|
|
143
127
|
|
|
128
|
+
private func setUpAndTearDownAnimationView(with animation: Animation, configuration: LottieConfiguration) {
|
|
129
|
+
// Each animation setup needs to be wrapped in its own `CATransaction`
|
|
130
|
+
// in order for the layers to be deallocated immediately. Otherwise
|
|
131
|
+
// the layers aren't deallocated until the end of the test run,
|
|
132
|
+
// which causes memory usage to grow unbounded.
|
|
133
|
+
CATransaction.begin()
|
|
134
|
+
let animationView = setupAnimationView(with: animation, configuration: configuration)
|
|
135
|
+
// Call `display()` on the layer to make sure any pending setup occurs immediately
|
|
136
|
+
animationView.animationLayer!.display()
|
|
137
|
+
CATransaction.commit()
|
|
138
|
+
|
|
139
|
+
/// The view / layer is deallocated when the transaction is flushed
|
|
140
|
+
CATransaction.flush()
|
|
141
|
+
}
|
|
142
|
+
|
|
144
143
|
/// Compares performance of scrubbing the given animation with both the Main Thread and Core Animation engine,
|
|
145
144
|
/// and returns the ratio of how much slower the Core Animation is than the Main Thread engine
|
|
146
145
|
private func compareEngineScrubbingPerformance(for animation: Animation, iterations: Int) -> Double {
|
|
@@ -156,7 +155,7 @@ final class PerformanceTests: XCTestCase {
|
|
|
156
155
|
}
|
|
157
156
|
}
|
|
158
157
|
|
|
159
|
-
|
|
158
|
+
LottieLogger.shared.info("Main thread engine took \(mainThreadEnginePerformance) seconds")
|
|
160
159
|
|
|
161
160
|
let coreAnimationView = setupAnimationView(with: animation, configuration: .init(renderingEngine: .coreAnimation))
|
|
162
161
|
let coreAnimationEnginePerformance = measurePerformance {
|
|
@@ -168,10 +167,10 @@ final class PerformanceTests: XCTestCase {
|
|
|
168
167
|
}
|
|
169
168
|
}
|
|
170
169
|
|
|
171
|
-
|
|
170
|
+
LottieLogger.shared.info("Core Animation engine took \(coreAnimationEnginePerformance) seconds")
|
|
172
171
|
|
|
173
172
|
let ratio = coreAnimationEnginePerformance / mainThreadEnginePerformance
|
|
174
|
-
|
|
173
|
+
LottieLogger.shared.info("Core Animation engine took \(ratio)x as long as the Main Thread engine")
|
|
175
174
|
return ratio
|
|
176
175
|
}
|
|
177
176
|
|
|
@@ -182,7 +181,7 @@ final class PerformanceTests: XCTestCase {
|
|
|
182
181
|
}
|
|
183
182
|
}
|
|
184
183
|
|
|
185
|
-
|
|
184
|
+
LottieLogger.shared.info("Codable deserialization took \(codablePerformance) seconds")
|
|
186
185
|
|
|
187
186
|
let dictPerformance = try measurePerformance {
|
|
188
187
|
for _ in 0..<iterations {
|
|
@@ -190,9 +189,9 @@ final class PerformanceTests: XCTestCase {
|
|
|
190
189
|
}
|
|
191
190
|
}
|
|
192
191
|
|
|
193
|
-
|
|
192
|
+
LottieLogger.shared.info("DictionaryBased deserialization took \(dictPerformance) seconds")
|
|
194
193
|
let ratio = codablePerformance / dictPerformance
|
|
195
|
-
|
|
194
|
+
LottieLogger.shared.info("Codable deserialization took \(ratio)x as long as DictionaryBased")
|
|
196
195
|
return ratio
|
|
197
196
|
}
|
|
198
197
|
|