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
|
@@ -19,7 +19,6 @@ final class NodeTree {
|
|
|
19
19
|
|
|
20
20
|
extension Array where Element == ShapeItem {
|
|
21
21
|
func initializeNodeTree() -> NodeTree {
|
|
22
|
-
|
|
23
22
|
let nodeTree = NodeTree()
|
|
24
23
|
|
|
25
24
|
for item in self {
|
|
@@ -73,7 +72,6 @@ extension Array where Element == ShapeItem {
|
|
|
73
72
|
nodeTree.transform = xform
|
|
74
73
|
continue
|
|
75
74
|
} else if let group = item as? Group {
|
|
76
|
-
|
|
77
75
|
let tree = group.items.initializeNodeTree()
|
|
78
76
|
let node = GroupNode(name: group.name, parentNode: nodeTree.rootNode, tree: tree)
|
|
79
77
|
nodeTree.rootNode = node
|
|
@@ -81,6 +79,11 @@ extension Array where Element == ShapeItem {
|
|
|
81
79
|
/// Now add all child paths to current tree
|
|
82
80
|
nodeTree.paths.append(contentsOf: tree.paths)
|
|
83
81
|
nodeTree.renderContainers.append(node.container)
|
|
82
|
+
} else if item is Repeater {
|
|
83
|
+
LottieLogger.shared.assertionFailure("""
|
|
84
|
+
The Main Thread rendering engine doesn't currently support repeaters.
|
|
85
|
+
To play an animation with repeaters, you can use the Core Animation rendering engine instead.
|
|
86
|
+
""")
|
|
84
87
|
}
|
|
85
88
|
|
|
86
89
|
if let pathNode = nodeTree.rootNode as? PathNode {
|
|
@@ -142,7 +142,6 @@ final class TrimPathNode: AnimatorNode {
|
|
|
142
142
|
|
|
143
143
|
/// Now loop through all path containers
|
|
144
144
|
for pathContainer in upstreamPaths {
|
|
145
|
-
|
|
146
145
|
let pathEnd = pathStart + pathContainer.totalLength
|
|
147
146
|
|
|
148
147
|
if
|
|
@@ -214,11 +213,10 @@ final class TrimPathNode: AnimatorNode {
|
|
|
214
213
|
let subpaths = pathContainer.removePaths(updateFrame: frame)
|
|
215
214
|
var subpathStart: CGFloat = 0
|
|
216
215
|
for path in subpaths {
|
|
217
|
-
|
|
218
216
|
let subpathEnd = subpathStart + path.length
|
|
219
217
|
|
|
220
218
|
if
|
|
221
|
-
!startCutLength.isInRange(subpathStart, subpathEnd)
|
|
219
|
+
!startCutLength.isInRange(subpathStart, subpathEnd),
|
|
222
220
|
!endCutLength.isInRange(subpathStart, subpathEnd)
|
|
223
221
|
{
|
|
224
222
|
// The whole path is included. Add
|
|
@@ -226,7 +224,7 @@ final class TrimPathNode: AnimatorNode {
|
|
|
226
224
|
pathContainer.appendPath(path, updateFrame: frame)
|
|
227
225
|
|
|
228
226
|
} else if
|
|
229
|
-
startCutLength.isInRange(subpathStart, subpathEnd)
|
|
227
|
+
startCutLength.isInRange(subpathStart, subpathEnd),
|
|
230
228
|
!endCutLength.isInRange(subpathStart, subpathEnd)
|
|
231
229
|
{
|
|
232
230
|
/// The start of the path needs to be trimmed
|
|
@@ -235,7 +233,7 @@ final class TrimPathNode: AnimatorNode {
|
|
|
235
233
|
let newPath = path.trim(fromPosition: cutLength / path.length, toPosition: 1, offset: 0, trimSimultaneously: false)
|
|
236
234
|
pathContainer.appendPath(newPath, updateFrame: frame)
|
|
237
235
|
} else if
|
|
238
|
-
!startCutLength.isInRange(subpathStart, subpathEnd)
|
|
236
|
+
!startCutLength.isInRange(subpathStart, subpathEnd),
|
|
239
237
|
endCutLength.isInRange(subpathStart, subpathEnd)
|
|
240
238
|
{
|
|
241
239
|
// S|=======E----------------------|
|
|
@@ -244,7 +242,7 @@ final class TrimPathNode: AnimatorNode {
|
|
|
244
242
|
pathContainer.appendPath(newPath, updateFrame: frame)
|
|
245
243
|
break
|
|
246
244
|
} else if
|
|
247
|
-
startCutLength.isInRange(subpathStart, subpathEnd)
|
|
245
|
+
startCutLength.isInRange(subpathStart, subpathEnd),
|
|
248
246
|
endCutLength.isInRange(subpathStart, subpathEnd)
|
|
249
247
|
{
|
|
250
248
|
// |-------S============E---------|
|
|
@@ -272,7 +270,6 @@ final class TrimPathNode: AnimatorNode {
|
|
|
272
270
|
|
|
273
271
|
pathStart = pathEnd
|
|
274
272
|
}
|
|
275
|
-
|
|
276
273
|
}
|
|
277
274
|
|
|
278
275
|
// MARK: Fileprivate
|
|
@@ -198,6 +198,11 @@ final class GradientFillRenderer: PassThroughOutputNode, Renderable {
|
|
|
198
198
|
}
|
|
199
199
|
}
|
|
200
200
|
|
|
201
|
+
var fillRule: CAShapeLayerFillRule {
|
|
202
|
+
get { maskLayer.fillRule }
|
|
203
|
+
set { maskLayer.fillRule = newValue }
|
|
204
|
+
}
|
|
205
|
+
|
|
201
206
|
func render(_: CGContext) {
|
|
202
207
|
// do nothing
|
|
203
208
|
}
|
|
@@ -42,7 +42,7 @@ final class GradientStrokeRenderer: PassThroughOutputNode, Renderable {
|
|
|
42
42
|
}
|
|
43
43
|
|
|
44
44
|
func render(_ inContext: CGContext) {
|
|
45
|
-
guard inContext.path != nil
|
|
45
|
+
guard inContext.path != nil, inContext.path!.isEmpty == false else {
|
|
46
46
|
return
|
|
47
47
|
}
|
|
48
48
|
|
|
@@ -56,7 +56,6 @@ final class GradientStrokeRenderer: PassThroughOutputNode, Renderable {
|
|
|
56
56
|
|
|
57
57
|
/// Now draw the gradient.
|
|
58
58
|
gradientRender.render(inContext)
|
|
59
|
-
|
|
60
59
|
}
|
|
61
60
|
|
|
62
61
|
func renderBoundsFor(_ boundingBox: CGRect) -> CGRect {
|
|
@@ -58,7 +58,7 @@ final class LegacyGradientFillRenderer: PassThroughOutputNode, Renderable {
|
|
|
58
58
|
}
|
|
59
59
|
|
|
60
60
|
func render(_ inContext: CGContext) {
|
|
61
|
-
guard inContext.path != nil
|
|
61
|
+
guard inContext.path != nil, inContext.path!.isEmpty == false else {
|
|
62
62
|
return
|
|
63
63
|
}
|
|
64
64
|
hasUpdate = false
|
|
@@ -140,7 +140,7 @@ final class StrokeRenderer: PassThroughOutputNode, Renderable {
|
|
|
140
140
|
}
|
|
141
141
|
|
|
142
142
|
func render(_ inContext: CGContext) {
|
|
143
|
-
guard inContext.path != nil
|
|
143
|
+
guard inContext.path != nil, inContext.path!.isEmpty == false else {
|
|
144
144
|
return
|
|
145
145
|
}
|
|
146
146
|
guard let color = color else { return }
|
|
@@ -171,7 +171,7 @@ extension BezierPath {
|
|
|
171
171
|
CurveVertex(
|
|
172
172
|
CGPoint(x: 0, y: radius), // In tangent
|
|
173
173
|
CGPoint(x: 0, y: radius), // Point
|
|
174
|
-
CGPoint(x: -controlPoint, y: radius))// Out tangent
|
|
174
|
+
CGPoint(x: -controlPoint, y: radius)) // Out tangent
|
|
175
175
|
.translated(CGPoint(x: radius, y: -radius))
|
|
176
176
|
.translated(CGPoint(x: -size.width, y: size.height))
|
|
177
177
|
.translated(position),
|
|
@@ -158,17 +158,17 @@ extension BezierPath {
|
|
|
158
158
|
for i in 0..<numPoints {
|
|
159
159
|
var radius = longSegment ? outerRadius : innerRadius
|
|
160
160
|
var dTheta = halfAnglePerPoint
|
|
161
|
-
if partialPointRadius != 0
|
|
161
|
+
if partialPointRadius != 0, i == numPoints - 2 {
|
|
162
162
|
dTheta = anglePerPoint * partialPointAmount / 2
|
|
163
163
|
}
|
|
164
|
-
if partialPointRadius != 0
|
|
164
|
+
if partialPointRadius != 0, i == numPoints - 1 {
|
|
165
165
|
radius = partialPointRadius
|
|
166
166
|
}
|
|
167
167
|
previousPoint = point
|
|
168
168
|
point.x = (radius * cos(currentAngle))
|
|
169
169
|
point.y = (radius * sin(currentAngle))
|
|
170
170
|
|
|
171
|
-
if innerRoundedness == 0
|
|
171
|
+
if innerRoundedness == 0, outerRoundedness == 0 {
|
|
172
172
|
vertices.append(CurveVertex(point: point + position, inTangentRelative: .zero, outTangentRelative: .zero))
|
|
173
173
|
} else {
|
|
174
174
|
let cp1Theta = (atan2(previousPoint.y, previousPoint.x) - CGFloat.pi / 2)
|
package/Sources/Private/MainThread/NodeRenderSystem/Nodes/RenderNodes/GradientFillNode.swift
CHANGED
|
@@ -22,6 +22,7 @@ final class GradientFillProperties: NodePropertyMap, KeypathSearchable {
|
|
|
22
22
|
colors = NodeProperty(provider: KeyframeInterpolator(keyframes: gradientfill.colors.keyframes))
|
|
23
23
|
gradientType = gradientfill.gradientType
|
|
24
24
|
numberOfColors = gradientfill.numberOfColors
|
|
25
|
+
fillRule = gradientfill.fillRule
|
|
25
26
|
keypathProperties = [
|
|
26
27
|
"Opacity" : opacity,
|
|
27
28
|
"Start Point" : startPoint,
|
|
@@ -42,6 +43,7 @@ final class GradientFillProperties: NodePropertyMap, KeypathSearchable {
|
|
|
42
43
|
|
|
43
44
|
let gradientType: GradientType
|
|
44
45
|
let numberOfColors: Int
|
|
46
|
+
let fillRule: FillRule
|
|
45
47
|
|
|
46
48
|
let keypathProperties: [String: AnyNodeProperty]
|
|
47
49
|
let properties: [AnyNodeProperty]
|
|
@@ -98,5 +100,6 @@ final class GradientFillNode: AnimatorNode, RenderNode {
|
|
|
98
100
|
fillRender.colors = fillProperties.colors.value.map { CGFloat($0) }
|
|
99
101
|
fillRender.type = fillProperties.gradientType
|
|
100
102
|
fillRender.numberOfColors = fillProperties.numberOfColors
|
|
103
|
+
fillRender.fillRule = fillProperties.fillRule.caFillRule
|
|
101
104
|
}
|
|
102
105
|
}
|
package/Sources/Private/MainThread/NodeRenderSystem/Nodes/RenderNodes/GradientStrokeNode.swift
CHANGED
|
@@ -140,7 +140,7 @@ final class GradientStrokeNode: AnimatorNode, RenderNode {
|
|
|
140
140
|
|
|
141
141
|
/// Get dash lengths
|
|
142
142
|
let dashLengths = strokeProperties.dashPattern.value.map { $0.cgFloatValue }
|
|
143
|
-
if dashLengths.count > 0 {
|
|
143
|
+
if dashLengths.count > 0, dashLengths.isSupportedLayerDashPattern {
|
|
144
144
|
strokeRender.strokeRender.dashPhase = strokeProperties.dashPhase.value.cgFloatValue
|
|
145
145
|
strokeRender.strokeRender.dashLengths = dashLengths
|
|
146
146
|
} else {
|
|
@@ -118,7 +118,7 @@ final class StrokeNode: AnimatorNode, RenderNode {
|
|
|
118
118
|
|
|
119
119
|
/// Get dash lengths
|
|
120
120
|
let dashLengths = strokeProperties.dashPattern.value.map { $0.cgFloatValue }
|
|
121
|
-
if dashLengths.count > 0 {
|
|
121
|
+
if dashLengths.count > 0, dashLengths.isSupportedLayerDashPattern {
|
|
122
122
|
strokeRender.dashPhase = strokeProperties.dashPhase.value.cgFloatValue
|
|
123
123
|
strokeRender.dashLengths = dashLengths
|
|
124
124
|
} else {
|
|
@@ -148,6 +148,33 @@ extension Array where Element == DashElement {
|
|
|
148
148
|
dashPatterns.append(dash.value.keyframes)
|
|
149
149
|
}
|
|
150
150
|
}
|
|
151
|
+
|
|
152
|
+
dashPatterns = ContiguousArray(dashPatterns.map { pattern in
|
|
153
|
+
ContiguousArray(pattern.map { keyframe -> Keyframe<Vector1D> in
|
|
154
|
+
// The recommended way to create a stroke of round dots, in theory,
|
|
155
|
+
// is to use a value of 0 followed by the stroke width, but for
|
|
156
|
+
// some reason Core Animation incorrectly (?) renders these as pills
|
|
157
|
+
// instead of circles. As a workaround, for parity with Lottie on other
|
|
158
|
+
// platforms, we can change `0`s to `0.01`: https://stackoverflow.com/a/38036486
|
|
159
|
+
if keyframe.value.cgFloatValue == 0 {
|
|
160
|
+
return keyframe.withValue(Vector1D(0.01))
|
|
161
|
+
} else {
|
|
162
|
+
return keyframe
|
|
163
|
+
}
|
|
164
|
+
})
|
|
165
|
+
})
|
|
166
|
+
|
|
151
167
|
return (dashPatterns, dashPhase)
|
|
152
168
|
}
|
|
153
169
|
}
|
|
170
|
+
|
|
171
|
+
extension Array where Element == CGFloat {
|
|
172
|
+
// If all of the items in the dash pattern are zeros, then we shouldn't attempt to render it.
|
|
173
|
+
// This causes Core Animation to have extremely poor performance for some reason, even though
|
|
174
|
+
// it doesn't affect the appearance of the animation.
|
|
175
|
+
// - We check for `== 0.01` instead of `== 0` because `dashPattern.shapeLayerConfiguration`
|
|
176
|
+
// converts all `0` values to `0.01` to work around a different Core Animation rendering issue.
|
|
177
|
+
var isSupportedLayerDashPattern: Bool {
|
|
178
|
+
!allSatisfy { $0 == 0.01 }
|
|
179
|
+
}
|
|
180
|
+
}
|
|
@@ -31,8 +31,8 @@ public final class Animation: Codable, DictionaryInitializable {
|
|
|
31
31
|
startFrame = try container.decode(AnimationFrameTime.self, forKey: .startFrame)
|
|
32
32
|
endFrame = try container.decode(AnimationFrameTime.self, forKey: .endFrame)
|
|
33
33
|
framerate = try container.decode(Double.self, forKey: .framerate)
|
|
34
|
-
width = try container.decode(
|
|
35
|
-
height = try container.decode(
|
|
34
|
+
width = try container.decode(Double.self, forKey: .width)
|
|
35
|
+
height = try container.decode(Double.self, forKey: .height)
|
|
36
36
|
layers = try container.decode([LayerModel].self, ofFamily: LayerType.self, forKey: .layers)
|
|
37
37
|
glyphs = try container.decodeIfPresent([Glyph].self, forKey: .glyphs)
|
|
38
38
|
fonts = try container.decodeIfPresent(FontList.self, forKey: .fonts)
|
|
@@ -137,10 +137,10 @@ public final class Animation: Codable, DictionaryInitializable {
|
|
|
137
137
|
let type: CoordinateSpace
|
|
138
138
|
|
|
139
139
|
/// The height of the composition in points.
|
|
140
|
-
let width:
|
|
140
|
+
let width: Double
|
|
141
141
|
|
|
142
142
|
/// The width of the composition in points.
|
|
143
|
-
let height:
|
|
143
|
+
let height: Double
|
|
144
144
|
|
|
145
145
|
/// The list of animation layers
|
|
146
146
|
let layers: [LayerModel]
|
|
@@ -195,3 +195,28 @@ extension Keyframe {
|
|
|
195
195
|
spatialOutTangent: spatialOutTangent)
|
|
196
196
|
}
|
|
197
197
|
}
|
|
198
|
+
|
|
199
|
+
extension KeyframeGroup {
|
|
200
|
+
/// Maps the values of each individual keyframe in this group
|
|
201
|
+
func map<NewValue>(_ transformation: (T) throws -> NewValue) rethrows -> KeyframeGroup<NewValue> {
|
|
202
|
+
KeyframeGroup<NewValue>(keyframes: ContiguousArray(try keyframes.map { keyframe in
|
|
203
|
+
keyframe.withValue(try transformation(keyframe.value))
|
|
204
|
+
}))
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
// MARK: - AnyKeyframeGroup
|
|
209
|
+
|
|
210
|
+
/// A type-erased wrapper for `KeyframeGroup`s
|
|
211
|
+
protocol AnyKeyframeGroup {
|
|
212
|
+
var untyped: KeyframeGroup<Any> { get }
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
// MARK: - KeyframeGroup + AnyKeyframeGroup
|
|
216
|
+
|
|
217
|
+
extension KeyframeGroup: AnyKeyframeGroup {
|
|
218
|
+
/// An untyped copy of these keyframes
|
|
219
|
+
var untyped: KeyframeGroup<Any> {
|
|
220
|
+
map { $0 as Any }
|
|
221
|
+
}
|
|
222
|
+
}
|
|
@@ -17,7 +17,6 @@ enum FillRule: Int, Codable {
|
|
|
17
17
|
|
|
18
18
|
// MARK: - Fill
|
|
19
19
|
|
|
20
|
-
/// An item that defines a fill render
|
|
21
20
|
final class Fill: ShapeItem {
|
|
22
21
|
|
|
23
22
|
// MARK: Lifecycle
|
|
@@ -54,6 +53,7 @@ final class Fill: ShapeItem {
|
|
|
54
53
|
/// The color keyframes for the fill
|
|
55
54
|
let color: KeyframeGroup<Color>
|
|
56
55
|
|
|
56
|
+
/// The fill rule to use when filling a path
|
|
57
57
|
let fillRule: FillRule
|
|
58
58
|
|
|
59
59
|
override func encode(to encoder: Encoder) throws {
|
|
@@ -17,7 +17,6 @@ enum GradientType: Int, Codable {
|
|
|
17
17
|
|
|
18
18
|
// MARK: - GradientFill
|
|
19
19
|
|
|
20
|
-
/// An item that define a gradient fill
|
|
21
20
|
final class GradientFill: ShapeItem {
|
|
22
21
|
|
|
23
22
|
// MARK: Lifecycle
|
|
@@ -30,6 +29,7 @@ final class GradientFill: ShapeItem {
|
|
|
30
29
|
gradientType = try container.decode(GradientType.self, forKey: .gradientType)
|
|
31
30
|
highlightLength = try container.decodeIfPresent(KeyframeGroup<Vector1D>.self, forKey: .highlightLength)
|
|
32
31
|
highlightAngle = try container.decodeIfPresent(KeyframeGroup<Vector1D>.self, forKey: .highlightAngle)
|
|
32
|
+
fillRule = try container.decodeIfPresent(FillRule.self, forKey: .fillRule) ?? .nonZeroWinding
|
|
33
33
|
let colorsContainer = try container.nestedContainer(keyedBy: GradientDataKeys.self, forKey: .colors)
|
|
34
34
|
colors = try colorsContainer.decode(KeyframeGroup<[Double]>.self, forKey: .colors)
|
|
35
35
|
numberOfColors = try colorsContainer.decode(Int.self, forKey: .numberOfColors)
|
|
@@ -62,6 +62,14 @@ final class GradientFill: ShapeItem {
|
|
|
62
62
|
let nestedColorsDictionary: [String: Any] = try colorsDictionary.value(for: GradientDataKeys.colors)
|
|
63
63
|
colors = try KeyframeGroup<[Double]>(dictionary: nestedColorsDictionary)
|
|
64
64
|
numberOfColors = try colorsDictionary.value(for: GradientDataKeys.numberOfColors)
|
|
65
|
+
if
|
|
66
|
+
let fillRuleRawValue = dictionary[CodingKeys.fillRule.rawValue] as? Int,
|
|
67
|
+
let fillRule = FillRule(rawValue: fillRuleRawValue)
|
|
68
|
+
{
|
|
69
|
+
self.fillRule = fillRule
|
|
70
|
+
} else {
|
|
71
|
+
fillRule = .nonZeroWinding
|
|
72
|
+
}
|
|
65
73
|
try super.init(dictionary: dictionary)
|
|
66
74
|
}
|
|
67
75
|
|
|
@@ -91,6 +99,9 @@ final class GradientFill: ShapeItem {
|
|
|
91
99
|
/// The Colors of the gradient.
|
|
92
100
|
let colors: KeyframeGroup<[Double]>
|
|
93
101
|
|
|
102
|
+
/// The fill rule to use when filling a path
|
|
103
|
+
let fillRule: FillRule
|
|
104
|
+
|
|
94
105
|
override func encode(to encoder: Encoder) throws {
|
|
95
106
|
try super.encode(to: encoder)
|
|
96
107
|
var container = encoder.container(keyedBy: CodingKeys.self)
|
|
@@ -100,6 +111,7 @@ final class GradientFill: ShapeItem {
|
|
|
100
111
|
try container.encode(gradientType, forKey: .gradientType)
|
|
101
112
|
try container.encodeIfPresent(highlightLength, forKey: .highlightLength)
|
|
102
113
|
try container.encodeIfPresent(highlightAngle, forKey: .highlightAngle)
|
|
114
|
+
try container.encodeIfPresent(fillRule, forKey: .fillRule)
|
|
103
115
|
var colorsContainer = container.nestedContainer(keyedBy: GradientDataKeys.self, forKey: .colors)
|
|
104
116
|
try colorsContainer.encode(numberOfColors, forKey: .numberOfColors)
|
|
105
117
|
try colorsContainer.encode(colors, forKey: .colors)
|
|
@@ -115,6 +127,7 @@ final class GradientFill: ShapeItem {
|
|
|
115
127
|
case highlightLength = "h"
|
|
116
128
|
case highlightAngle = "a"
|
|
117
129
|
case colors = "g"
|
|
130
|
+
case fillRule = "r"
|
|
118
131
|
}
|
|
119
132
|
|
|
120
133
|
private enum GradientDataKeys: String, CodingKey {
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
|
|
8
8
|
import Foundation
|
|
9
9
|
|
|
10
|
-
/// An item that define
|
|
10
|
+
/// An item that define a a group of shape items
|
|
11
11
|
final class Group: ShapeItem {
|
|
12
12
|
|
|
13
13
|
// MARK: Lifecycle
|
|
@@ -24,6 +24,11 @@ final class Group: ShapeItem {
|
|
|
24
24
|
try super.init(dictionary: dictionary)
|
|
25
25
|
}
|
|
26
26
|
|
|
27
|
+
init(items: [ShapeItem], name: String) {
|
|
28
|
+
self.items = items
|
|
29
|
+
super.init(name: name, type: .group, hidden: false)
|
|
30
|
+
}
|
|
31
|
+
|
|
27
32
|
// MARK: Internal
|
|
28
33
|
|
|
29
34
|
/// A list of shape items.
|
|
@@ -26,7 +26,6 @@ final class TextAnimator: Codable, DictionaryInitializable {
|
|
|
26
26
|
skewAxis = try animatorContainer.decodeIfPresent(KeyframeGroup<Vector1D>.self, forKey: .skewAxis)
|
|
27
27
|
rotation = try animatorContainer.decodeIfPresent(KeyframeGroup<Vector1D>.self, forKey: .rotation)
|
|
28
28
|
opacity = try animatorContainer.decodeIfPresent(KeyframeGroup<Vector1D>.self, forKey: .opacity)
|
|
29
|
-
|
|
30
29
|
}
|
|
31
30
|
|
|
32
31
|
init(dictionary: [String: Any]) throws {
|
|
@@ -53,7 +53,7 @@ extension CALayer {
|
|
|
53
53
|
string = string + " "
|
|
54
54
|
}
|
|
55
55
|
string = string + "|_" + String(describing: self)
|
|
56
|
-
|
|
56
|
+
LottieLogger.shared.info(string)
|
|
57
57
|
if let sublayers = sublayers {
|
|
58
58
|
for sublayer in sublayers {
|
|
59
59
|
sublayer.logLayerTree(withIndent: withIndent + 1)
|
|
@@ -75,7 +75,6 @@ extension CALayer {
|
|
|
75
75
|
|
|
76
76
|
@nonobjc
|
|
77
77
|
func setDebuggingState(visible: Bool) {
|
|
78
|
-
|
|
79
78
|
var sublayers = self.sublayers
|
|
80
79
|
if let cust = self as? CustomLayerDebugging {
|
|
81
80
|
sublayers = cust.layerForDebugging().sublayers
|
|
@@ -344,7 +344,6 @@ extension CGPoint {
|
|
|
344
344
|
var closestPoint = 0
|
|
345
345
|
|
|
346
346
|
while previousAmount < 1 {
|
|
347
|
-
|
|
348
347
|
previousAmount = previousAmount + step
|
|
349
348
|
|
|
350
349
|
if previousAmount < amount {
|
|
@@ -429,7 +428,7 @@ extension CGPoint {
|
|
|
429
428
|
func colinear(_ a: CGPoint, _ b: CGPoint) -> Bool {
|
|
430
429
|
let area = x * (a.y - b.y) + a.x * (b.y - y) + b.x * (y - a.y);
|
|
431
430
|
let accuracy: CGFloat = 0.05
|
|
432
|
-
if area < accuracy
|
|
431
|
+
if area < accuracy, area > -accuracy {
|
|
433
432
|
return true
|
|
434
433
|
}
|
|
435
434
|
return false
|
|
@@ -149,7 +149,7 @@ final class KeyframeInterpolator<ValueType>: ValueProvider where ValueType: AnyI
|
|
|
149
149
|
|
|
150
150
|
/// Sets the initial keyframes. This is often only needed for the first check.
|
|
151
151
|
if
|
|
152
|
-
leadingIndex == nil
|
|
152
|
+
leadingIndex == nil,
|
|
153
153
|
trailingIndex == nil
|
|
154
154
|
{
|
|
155
155
|
if frame < keyframes[0].time {
|
|
@@ -170,7 +170,6 @@ final class KeyframeInterpolator<ValueType>: ValueProvider where ValueType: AnyI
|
|
|
170
170
|
var newLeading = currentTrailing
|
|
171
171
|
var keyframeFound = false
|
|
172
172
|
while !keyframeFound {
|
|
173
|
-
|
|
174
173
|
leadingIndex = newLeading
|
|
175
174
|
trailingIndex = keyframes.validIndex(newLeading + 1)
|
|
176
175
|
|
|
@@ -192,13 +191,11 @@ final class KeyframeInterpolator<ValueType>: ValueProvider where ValueType: AnyI
|
|
|
192
191
|
let currentLeading = leadingIndex,
|
|
193
192
|
frame < keyframes[currentLeading].time
|
|
194
193
|
{
|
|
195
|
-
|
|
196
194
|
/// Time is before the current span. Iterate backwards
|
|
197
195
|
var newTrailing = currentLeading
|
|
198
196
|
|
|
199
197
|
var keyframeFound = false
|
|
200
198
|
while !keyframeFound {
|
|
201
|
-
|
|
202
199
|
leadingIndex = keyframes.validIndex(newTrailing - 1)
|
|
203
200
|
trailingIndex = newTrailing
|
|
204
201
|
|
|
@@ -388,7 +388,6 @@ extension BezierPath: Codable {
|
|
|
388
388
|
try inPointsContainer.encode(element.vertex.inTangentRelative)
|
|
389
389
|
try outPointsContainer.encode(element.vertex.outTangentRelative)
|
|
390
390
|
}
|
|
391
|
-
|
|
392
391
|
}
|
|
393
392
|
}
|
|
394
393
|
|
|
@@ -469,7 +468,7 @@ extension BezierPath {
|
|
|
469
468
|
var previousElement: PathElement?
|
|
470
469
|
for element in elements {
|
|
471
470
|
if let previous = previousElement {
|
|
472
|
-
if previous.vertex.outTangentRelative.isZero
|
|
471
|
+
if previous.vertex.outTangentRelative.isZero, element.vertex.inTangentRelative.isZero {
|
|
473
472
|
cgPath.addLine(to: element.vertex.point)
|
|
474
473
|
} else {
|
|
475
474
|
cgPath.addCurve(to: element.vertex.point, control1: previous.vertex.outTangent, control2: element.vertex.inTangent)
|
|
@@ -78,7 +78,6 @@ struct CurveVertex {
|
|
|
78
78
|
func splitCurve(toVertex: CurveVertex, position: CGFloat) ->
|
|
79
79
|
(start: CurveVertex, trimPoint: CurveVertex, end: CurveVertex)
|
|
80
80
|
{
|
|
81
|
-
|
|
82
81
|
/// If position is less than or equal to 0, trim at start.
|
|
83
82
|
if position <= 0 {
|
|
84
83
|
return (
|
|
@@ -101,7 +100,7 @@ struct CurveVertex {
|
|
|
101
100
|
outTangentRelative: toVertex.outTangentRelative))
|
|
102
101
|
}
|
|
103
102
|
|
|
104
|
-
if outTangentRelative.isZero
|
|
103
|
+
if outTangentRelative.isZero, toVertex.inTangentRelative.isZero {
|
|
105
104
|
/// If both tangents are zero, then span to be trimmed is a straight line.
|
|
106
105
|
let trimPoint = point.interpolate(to: toVertex.point, amount: position)
|
|
107
106
|
return (
|
|
@@ -166,8 +165,7 @@ struct CurveVertex {
|
|
|
166
165
|
/// For curves the curve is iterated over by sample count and the points are measured.
|
|
167
166
|
/// This is ~99% accurate at a sample count of 30
|
|
168
167
|
func distanceTo(_ toVertex: CurveVertex, sampleCount: Int = 25) -> CGFloat {
|
|
169
|
-
|
|
170
|
-
if outTangentRelative.isZero && toVertex.inTangentRelative.isZero {
|
|
168
|
+
if outTangentRelative.isZero, toVertex.inTangentRelative.isZero {
|
|
171
169
|
/// Return a linear distance.
|
|
172
170
|
return point.distanceTo(toVertex.point)
|
|
173
171
|
}
|