lottie-ios 3.4.0 → 3.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/main.yml +10 -7
- package/.swift-version +1 -0
- package/Lottie.xcodeproj/project.pbxproj +5 -5
- package/Lottie.xcworkspace/xcshareddata/swiftpm/Package.resolved +81 -0
- package/Lottie.xcworkspace/xcuserdata/calstephens.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- package/Lottie.xcworkspace/xcuserdata/calstephens.xcuserdatad/xcschemes/xcschememanagement.plist +30 -0
- package/Package.resolved +88 -0
- package/Package.swift +5 -0
- package/README.md +5 -6
- package/Rakefile +13 -17
- package/Sources/Private/CoreAnimation/Animations/CAAnimation+TimingConfiguration.swift +7 -2
- package/Sources/Private/CoreAnimation/Animations/CALayer+addAnimation.swift +191 -65
- package/Sources/Private/CoreAnimation/Animations/GradientAnimations.swift +79 -36
- package/Sources/Private/CoreAnimation/Animations/LayerProperty.swift +19 -19
- package/Sources/Private/CoreAnimation/Extensions/Keyframes+combinedIfPossible.swift +18 -6
- package/Sources/Private/CoreAnimation/Layers/AnimationLayer.swift +6 -0
- package/Sources/Private/CoreAnimation/Layers/GradientRenderLayer.swift +9 -2
- package/Sources/Private/CoreAnimation/Layers/ShapeItemLayer.swift +77 -34
- package/Sources/Private/CoreAnimation/Layers/ShapeLayer.swift +15 -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 +1 -1
- package/Sources/Private/MainThread/LayerContainers/Utility/LayerTransformNode.swift +0 -1
- package/Sources/Private/MainThread/NodeRenderSystem/Extensions/ItemsExtension.swift +0 -2
- package/Sources/Private/MainThread/NodeRenderSystem/NodeProperties/ValueProviders/KeyframeInterpolator.swift +1 -4
- package/Sources/Private/MainThread/NodeRenderSystem/Nodes/ModifierNodes/TrimPathNode.swift +4 -7
- 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/RenderLayers/ShapeContainerLayer.swift +1 -1
- package/Sources/Private/MainThread/NodeRenderSystem/RenderLayers/ShapeRenderLayer.swift +0 -1
- package/Sources/Private/Model/ShapeItems/Group.swift +6 -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/Utility/Primitives/BezierPath.swift +1 -2
- package/Sources/Private/Utility/Primitives/CurveVertex.swift +2 -4
- package/Sources/Public/Animation/AnimationPublic.swift +0 -3
- package/Sources/Public/Animation/AnimationView.swift +26 -6
- 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 +0 -1
- package/Sources/Public/iOS/FilepathImageProvider.swift +0 -1
- package/Sources/Public/macOS/BundleImageProvider.macOS.swift +0 -1
- package/Sources/Public/macOS/FilepathImageProvider.macOS.swift +0 -2
- package/Tests/ParsingTests.swift +2 -1
- package/Tests/PerformanceTests.swift +9 -9
- package/lottie-ios.podspec +1 -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
|
@@ -7,17 +7,29 @@ enum Keyframes {
|
|
|
7
7
|
/// Combines the given `[KeyframeGroup]` of `Keyframe<T>`s
|
|
8
8
|
/// into a single `KeyframeGroup` of `Keyframe<[T]>`s
|
|
9
9
|
/// if all of the `KeyframeGroup`s have the exact same animation timing
|
|
10
|
-
static func combinedIfPossible<T>(_
|
|
10
|
+
static func combinedIfPossible<T>(_ allGroups: [KeyframeGroup<T>]) -> KeyframeGroup<[T]>? {
|
|
11
|
+
// Animations with no timing information (e.g. with just a single keyframe)
|
|
12
|
+
// can be trivially combined with any other set of keyframes, so we don't need
|
|
13
|
+
// to check those.
|
|
14
|
+
let animatingKeyframes = allGroups.filter { $0.keyframes.count > 1 }
|
|
15
|
+
|
|
11
16
|
guard
|
|
12
|
-
!
|
|
13
|
-
|
|
17
|
+
!allGroups.isEmpty,
|
|
18
|
+
animatingKeyframes.allSatisfy({ $0.hasSameTimingParameters(as: animatingKeyframes[0]) })
|
|
14
19
|
else { return nil }
|
|
15
20
|
|
|
16
21
|
var combinedKeyframes = ContiguousArray<Keyframe<[T]>>()
|
|
22
|
+
let baseKeyframes = (animatingKeyframes.first ?? allGroups[0]).keyframes
|
|
17
23
|
|
|
18
|
-
for index in
|
|
19
|
-
let baseKeyframe =
|
|
20
|
-
let combinedValues =
|
|
24
|
+
for index in baseKeyframes.indices {
|
|
25
|
+
let baseKeyframe = baseKeyframes[index]
|
|
26
|
+
let combinedValues = allGroups.map { otherKeyframes -> T in
|
|
27
|
+
if otherKeyframes.keyframes.count == 1 {
|
|
28
|
+
return otherKeyframes.keyframes[0].value
|
|
29
|
+
} else {
|
|
30
|
+
return otherKeyframes.keyframes[index].value
|
|
31
|
+
}
|
|
32
|
+
}
|
|
21
33
|
combinedKeyframes.append(baseKeyframe.withValue(combinedValues))
|
|
22
34
|
}
|
|
23
35
|
|
|
@@ -63,6 +63,12 @@ struct LayerAnimationContext {
|
|
|
63
63
|
animation.progressTime(forFrame: timeRemapping(frame), clamped: false)
|
|
64
64
|
}
|
|
65
65
|
|
|
66
|
+
/// The real-time `TimeInterval` for the given `AnimationFrameTime` within this layer,
|
|
67
|
+
/// accounting for the `timeRemapping` applied to this layer
|
|
68
|
+
func time(for frame: AnimationFrameTime) -> TimeInterval {
|
|
69
|
+
animation.time(forFrame: timeRemapping(frame))
|
|
70
|
+
}
|
|
71
|
+
|
|
66
72
|
/// Chains an additional `timeRemapping` closure onto this layer context
|
|
67
73
|
func withTimeRemapping(
|
|
68
74
|
_ additionalTimeRemapping: @escaping (AnimationFrameTime) -> AnimationFrameTime)
|
|
@@ -70,9 +70,12 @@ final class GradientRenderLayer: CAGradientLayer {
|
|
|
70
70
|
width: gradientPadding + gradientReferenceBounds.width + gradientPadding,
|
|
71
71
|
height: gradientPadding + gradientReferenceBounds.height + gradientPadding)
|
|
72
72
|
|
|
73
|
+
// Align the center of this layer to be at the center point of its parent layer
|
|
74
|
+
let superlayerSize = superlayer?.frame.size ?? gradientReferenceBounds.size
|
|
75
|
+
|
|
73
76
|
transform = CATransform3DMakeTranslation(
|
|
74
|
-
-
|
|
75
|
-
-
|
|
77
|
+
(superlayerSize.width - bounds.width) / 2,
|
|
78
|
+
(superlayerSize.height - bounds.height) / 2,
|
|
76
79
|
0)
|
|
77
80
|
}
|
|
78
81
|
|
|
@@ -83,5 +86,9 @@ final class GradientRenderLayer: CAGradientLayer {
|
|
|
83
86
|
extension GradientRenderLayer: CustomLayoutLayer {
|
|
84
87
|
func layout(superlayerBounds: CGRect) {
|
|
85
88
|
gradientReferenceBounds = superlayerBounds
|
|
89
|
+
|
|
90
|
+
if let gradientMask = mask as? GradientRenderLayer {
|
|
91
|
+
gradientMask.layout(superlayerBounds: superlayerBounds)
|
|
92
|
+
}
|
|
86
93
|
}
|
|
87
94
|
}
|
|
@@ -69,27 +69,24 @@ final class ShapeItemLayer: BaseAnimationLayer {
|
|
|
69
69
|
try setupSolidFillAnimations(shapeLayer: shapeLayer, context: context)
|
|
70
70
|
|
|
71
71
|
case .gradientFill(let gradientLayers):
|
|
72
|
-
try setupGradientFillAnimations(
|
|
73
|
-
gradientLayer: gradientLayers.gradientLayer,
|
|
74
|
-
maskLayer: gradientLayers.maskLayer,
|
|
75
|
-
context: context)
|
|
72
|
+
try setupGradientFillAnimations(layers: gradientLayers, context: context)
|
|
76
73
|
}
|
|
77
74
|
|
|
78
75
|
if let gradientStrokeConfiguration = sublayerConfiguration.gradientStroke {
|
|
79
|
-
try setupGradientStrokeAnimations(
|
|
80
|
-
gradientLayer: gradientStrokeConfiguration.gradientLayer,
|
|
81
|
-
maskLayer: gradientStrokeConfiguration.maskLayer,
|
|
82
|
-
context: context)
|
|
76
|
+
try setupGradientStrokeAnimations(layers: gradientStrokeConfiguration, context: context)
|
|
83
77
|
}
|
|
84
78
|
}
|
|
85
79
|
|
|
86
80
|
// MARK: Private
|
|
87
81
|
|
|
88
82
|
private struct GradientLayers {
|
|
89
|
-
/// The `CALayer` that renders the
|
|
90
|
-
let
|
|
91
|
-
/// The `
|
|
92
|
-
|
|
83
|
+
/// The `CALayer` that renders the RGB components of the gradient
|
|
84
|
+
let gradientColorLayer: GradientRenderLayer
|
|
85
|
+
/// The `CALayer` that renders the alpha components of the gradient,
|
|
86
|
+
/// masking the `gradientColorLayer`
|
|
87
|
+
let gradientAlphaLayer: GradientRenderLayer?
|
|
88
|
+
/// The `CAShapeLayer` that clips the gradient layers to the expected shape
|
|
89
|
+
let shapeMaskLayer: CAShapeLayer
|
|
93
90
|
}
|
|
94
91
|
|
|
95
92
|
/// The configuration of this layer's `fill` sublayers
|
|
@@ -115,15 +112,15 @@ final class ShapeItemLayer: BaseAnimationLayer {
|
|
|
115
112
|
// we're rendering a gradient (a `CAGradientLayer` masked by a `CAShapeLayer`)
|
|
116
113
|
// or a solid shape (a simple `CAShapeLayer`).
|
|
117
114
|
let fillLayerConfiguration: FillLayerConfiguration
|
|
118
|
-
if otherItems.
|
|
119
|
-
fillLayerConfiguration = setupGradientFillLayerHierarchy()
|
|
115
|
+
if let gradientFill = otherItems.first(GradientFill.self) {
|
|
116
|
+
fillLayerConfiguration = setupGradientFillLayerHierarchy(for: gradientFill)
|
|
120
117
|
} else {
|
|
121
118
|
fillLayerConfiguration = setupSolidFillLayerHierarchy()
|
|
122
119
|
}
|
|
123
120
|
|
|
124
121
|
let gradientStrokeConfiguration: GradientLayers?
|
|
125
|
-
if otherItems.
|
|
126
|
-
gradientStrokeConfiguration = setupGradientStrokeLayerHierarchy()
|
|
122
|
+
if let gradientStroke = otherItems.first(GradientStroke.self) {
|
|
123
|
+
gradientStrokeConfiguration = setupGradientStrokeLayerHierarchy(for: gradientStroke)
|
|
127
124
|
} else {
|
|
128
125
|
gradientStrokeConfiguration = nil
|
|
129
126
|
}
|
|
@@ -144,18 +141,35 @@ final class ShapeItemLayer: BaseAnimationLayer {
|
|
|
144
141
|
return .solidFill(shapeLayer)
|
|
145
142
|
}
|
|
146
143
|
|
|
147
|
-
private func setupGradientFillLayerHierarchy(
|
|
144
|
+
private func setupGradientFillLayerHierarchy(
|
|
145
|
+
for gradientFill: GradientFill)
|
|
146
|
+
-> FillLayerConfiguration
|
|
147
|
+
{
|
|
148
148
|
let pathMask = CAShapeLayer()
|
|
149
149
|
pathMask.fillColor = .rgb(0, 0, 0)
|
|
150
150
|
mask = pathMask
|
|
151
151
|
|
|
152
|
-
let
|
|
153
|
-
addSublayer(
|
|
152
|
+
let rgbGradientLayer = GradientRenderLayer()
|
|
153
|
+
addSublayer(rgbGradientLayer)
|
|
154
154
|
|
|
155
|
-
|
|
155
|
+
let alphaGradientLayer: GradientRenderLayer?
|
|
156
|
+
if gradientFill.hasAlphaComponent {
|
|
157
|
+
alphaGradientLayer = GradientRenderLayer()
|
|
158
|
+
rgbGradientLayer.mask = alphaGradientLayer
|
|
159
|
+
} else {
|
|
160
|
+
alphaGradientLayer = nil
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
return .gradientFill(GradientLayers(
|
|
164
|
+
gradientColorLayer: rgbGradientLayer,
|
|
165
|
+
gradientAlphaLayer: alphaGradientLayer,
|
|
166
|
+
shapeMaskLayer: pathMask))
|
|
156
167
|
}
|
|
157
168
|
|
|
158
|
-
private func setupGradientStrokeLayerHierarchy(
|
|
169
|
+
private func setupGradientStrokeLayerHierarchy(
|
|
170
|
+
for gradientStroke: GradientStroke)
|
|
171
|
+
-> GradientLayers
|
|
172
|
+
{
|
|
159
173
|
let container = BaseAnimationLayer()
|
|
160
174
|
|
|
161
175
|
let pathMask = CAShapeLayer()
|
|
@@ -163,11 +177,22 @@ final class ShapeItemLayer: BaseAnimationLayer {
|
|
|
163
177
|
pathMask.strokeColor = .rgb(0, 0, 0)
|
|
164
178
|
container.mask = pathMask
|
|
165
179
|
|
|
166
|
-
let
|
|
167
|
-
container.addSublayer(
|
|
180
|
+
let rgbGradientLayer = GradientRenderLayer()
|
|
181
|
+
container.addSublayer(rgbGradientLayer)
|
|
168
182
|
addSublayer(container)
|
|
169
183
|
|
|
170
|
-
|
|
184
|
+
let alphaGradientLayer: GradientRenderLayer?
|
|
185
|
+
if gradientStroke.hasAlphaComponent {
|
|
186
|
+
alphaGradientLayer = GradientRenderLayer()
|
|
187
|
+
rgbGradientLayer.mask = alphaGradientLayer
|
|
188
|
+
} else {
|
|
189
|
+
alphaGradientLayer = nil
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
return GradientLayers(
|
|
193
|
+
gradientColorLayer: rgbGradientLayer,
|
|
194
|
+
gradientAlphaLayer: alphaGradientLayer,
|
|
195
|
+
shapeMaskLayer: pathMask)
|
|
171
196
|
}
|
|
172
197
|
|
|
173
198
|
private func setupSolidFillAnimations(
|
|
@@ -192,34 +217,41 @@ final class ShapeItemLayer: BaseAnimationLayer {
|
|
|
192
217
|
}
|
|
193
218
|
|
|
194
219
|
private func setupGradientFillAnimations(
|
|
195
|
-
|
|
196
|
-
maskLayer: CAShapeLayer,
|
|
220
|
+
layers: GradientLayers,
|
|
197
221
|
context: LayerAnimationContext)
|
|
198
222
|
throws
|
|
199
223
|
{
|
|
200
|
-
try
|
|
224
|
+
try layers.shapeMaskLayer.addAnimations(
|
|
225
|
+
for: shape.item,
|
|
226
|
+
context: context.for(shape),
|
|
227
|
+
pathMultiplier: 1)
|
|
201
228
|
|
|
202
229
|
if let (gradientFill, context) = otherItems.first(GradientFill.self, context: context) {
|
|
203
|
-
try
|
|
230
|
+
try layers.gradientColorLayer.addGradientAnimations(for: gradientFill, type: .rgb, context: context)
|
|
231
|
+
try layers.gradientAlphaLayer?.addGradientAnimations(for: gradientFill, type: .alpha, context: context)
|
|
204
232
|
}
|
|
205
233
|
}
|
|
206
234
|
|
|
207
235
|
private func setupGradientStrokeAnimations(
|
|
208
|
-
|
|
209
|
-
maskLayer: CAShapeLayer,
|
|
236
|
+
layers: GradientLayers,
|
|
210
237
|
context: LayerAnimationContext)
|
|
211
238
|
throws
|
|
212
239
|
{
|
|
213
240
|
var trimPathMultiplier: PathMultiplier? = nil
|
|
214
241
|
if let (trim, context) = otherItems.first(Trim.self, context: context) {
|
|
215
|
-
trimPathMultiplier = try
|
|
242
|
+
trimPathMultiplier = try layers.shapeMaskLayer.addAnimations(for: trim, context: context)
|
|
216
243
|
}
|
|
217
244
|
|
|
218
|
-
try
|
|
245
|
+
try layers.shapeMaskLayer.addAnimations(
|
|
246
|
+
for: shape.item,
|
|
247
|
+
context: context.for(shape),
|
|
248
|
+
pathMultiplier: trimPathMultiplier ?? 1)
|
|
219
249
|
|
|
220
250
|
if let (gradientStroke, context) = otherItems.first(GradientStroke.self, context: context) {
|
|
221
|
-
try
|
|
222
|
-
try
|
|
251
|
+
try layers.gradientColorLayer.addGradientAnimations(for: gradientStroke, type: .rgb, context: context)
|
|
252
|
+
try layers.gradientAlphaLayer?.addGradientAnimations(for: gradientStroke, type: .alpha, context: context)
|
|
253
|
+
|
|
254
|
+
try layers.shapeMaskLayer.addStrokeAnimations(for: gradientStroke, context: context)
|
|
223
255
|
}
|
|
224
256
|
}
|
|
225
257
|
|
|
@@ -241,6 +273,17 @@ extension Array where Element == ShapeItemLayer.Item {
|
|
|
241
273
|
|
|
242
274
|
return nil
|
|
243
275
|
}
|
|
276
|
+
|
|
277
|
+
/// The first `ShapeItem` in this array of the given type
|
|
278
|
+
func first<ItemType: ShapeItem>(_: ItemType.Type) -> ItemType? {
|
|
279
|
+
for item in self {
|
|
280
|
+
if let match = item.item as? ItemType {
|
|
281
|
+
return match
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
return nil
|
|
286
|
+
}
|
|
244
287
|
}
|
|
245
288
|
|
|
246
289
|
extension LayerAnimationContext {
|
|
@@ -108,6 +108,12 @@ final class GroupLayer: BaseAnimationLayer {
|
|
|
108
108
|
// because combining multiple paths into a single `CGPath` (instead of rendering them in separate layers)
|
|
109
109
|
// allows `CAShapeLayerFillRule.evenOdd` to be applied if the paths overlap. We just can't do this
|
|
110
110
|
// in all cases, due to limitations of Core Animation.
|
|
111
|
+
//
|
|
112
|
+
// As a fall back when this is not possible, we render each shape in its own `CAShapeLayer`,
|
|
113
|
+
// which causes the `fillRule` to be applied incorrectly in cases where the paths overlap.
|
|
114
|
+
// We can't really detect when this happens, so this is a case where `RenderingEngineMode.automatic`
|
|
115
|
+
// can behave incorrectly. In the future we could fix this by precomputing the full combined CGPath for each
|
|
116
|
+
// individual frame in the animation (like we do for some trim animations as of #1612).
|
|
111
117
|
if
|
|
112
118
|
shapeRenderGroup.pathItems.count > 1,
|
|
113
119
|
let combinedShapeKeyframes = Keyframes.combinedIfPossible(
|
|
@@ -150,7 +156,15 @@ extension CALayer {
|
|
|
150
156
|
/// - Each `Group` item becomes its own `GroupLayer` sublayer.
|
|
151
157
|
/// - Other `ShapeItem` are applied to all sublayers
|
|
152
158
|
fileprivate func setupGroups(from items: [ShapeItem], parentGroup: Group?, context: LayerContext) throws {
|
|
153
|
-
|
|
159
|
+
var (groupItems, otherItems) = items.grouped(by: { $0 is Group })
|
|
160
|
+
|
|
161
|
+
// If this shape doesn't have any groups but just has top-level shape items,
|
|
162
|
+
// we can create a placeholder group with those items. (Otherwise the shape items
|
|
163
|
+
// would be silently ignored, since we expect all shape layers to have a top-level group).
|
|
164
|
+
if groupItems.isEmpty, parentGroup == nil {
|
|
165
|
+
groupItems = [Group(items: otherItems, name: "Group")]
|
|
166
|
+
otherItems = []
|
|
167
|
+
}
|
|
154
168
|
|
|
155
169
|
// Groups are listed from front to back,
|
|
156
170
|
// but `CALayer.sublayers` are listed from back to front.
|
|
@@ -109,7 +109,6 @@ private class MaskLayer: CALayer {
|
|
|
109
109
|
actions = [
|
|
110
110
|
"opacity" : NSNull(),
|
|
111
111
|
]
|
|
112
|
-
|
|
113
112
|
}
|
|
114
113
|
|
|
115
114
|
override init(layer: Any) {
|
|
@@ -152,7 +151,6 @@ private class MaskLayer: CALayer {
|
|
|
152
151
|
}
|
|
153
152
|
maskLayer.path = path
|
|
154
153
|
}
|
|
155
|
-
|
|
156
154
|
}
|
|
157
155
|
}
|
|
158
156
|
|
|
@@ -107,12 +107,12 @@ final class PreCompositionLayer: CompositionLayer {
|
|
|
107
107
|
} else {
|
|
108
108
|
localFrame = (frame - startFrame) / timeStretch
|
|
109
109
|
}
|
|
110
|
-
animationLayers.forEach(
|
|
110
|
+
animationLayers.forEach({ $0.displayWithFrame(frame: localFrame, forceUpdates: forceUpdates) })
|
|
111
111
|
}
|
|
112
112
|
|
|
113
113
|
override func updateRenderScale() {
|
|
114
114
|
super.updateRenderScale()
|
|
115
|
-
animationLayers.forEach(
|
|
115
|
+
animationLayers.forEach({ $0.renderScale = renderScale })
|
|
116
116
|
}
|
|
117
117
|
|
|
118
118
|
// MARK: Fileprivate
|
|
@@ -93,7 +93,6 @@ final class MainThreadAnimationLayer: CALayer, RootAnimationLayer {
|
|
|
93
93
|
super.init(layer: layer)
|
|
94
94
|
|
|
95
95
|
currentFrame = typedLayer.currentFrame
|
|
96
|
-
|
|
97
96
|
}
|
|
98
97
|
|
|
99
98
|
required init?(coder _: NSCoder) {
|
|
@@ -195,7 +194,7 @@ final class MainThreadAnimationLayer: CALayer, RootAnimationLayer {
|
|
|
195
194
|
|
|
196
195
|
/// Forces the view to update its drawing.
|
|
197
196
|
func forceDisplayUpdate() {
|
|
198
|
-
animationLayers.forEach(
|
|
197
|
+
animationLayers.forEach({ $0.displayWithFrame(frame: currentFrame, forceUpdates: true) })
|
|
199
198
|
}
|
|
200
199
|
|
|
201
200
|
func logHierarchyKeypaths() {
|
|
@@ -311,7 +311,7 @@ final class CoreTextRenderLayer: CALayer {
|
|
|
311
311
|
x: textAnchor.x.remap(fromLow: 0, fromHigh: drawingRect.size.width, toLow: 0, toHigh: 1),
|
|
312
312
|
y: textAnchor.y.remap(fromLow: 0, fromHigh: drawingRect.size.height, toLow: 0, toHigh: 1))
|
|
313
313
|
|
|
314
|
-
if fillFrameSetter != nil
|
|
314
|
+
if fillFrameSetter != nil, strokeFrameSetter != nil {
|
|
315
315
|
drawingRect.size.width += strokeWidth
|
|
316
316
|
drawingRect.size.height += strokeWidth
|
|
317
317
|
}
|
|
@@ -16,7 +16,6 @@ final class LayerTransformProperties: NodePropertyMap, KeypathSearchable {
|
|
|
16
16
|
// MARK: Lifecycle
|
|
17
17
|
|
|
18
18
|
init(transform: Transform) {
|
|
19
|
-
|
|
20
19
|
anchor = NodeProperty(provider: KeyframeInterpolator(keyframes: transform.anchorPoint.keyframes))
|
|
21
20
|
scale = NodeProperty(provider: KeyframeInterpolator(keyframes: transform.scale.keyframes))
|
|
22
21
|
rotation = NodeProperty(provider: KeyframeInterpolator(keyframes: transform.rotation.keyframes))
|
|
@@ -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
|
|
@@ -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
|
|
|
@@ -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
|
|
@@ -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)
|
|
@@ -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
|