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
|
@@ -28,7 +28,8 @@ extension CALayer {
|
|
|
28
28
|
value: keyframeValueMapping,
|
|
29
29
|
context: context)
|
|
30
30
|
{
|
|
31
|
-
|
|
31
|
+
let timedAnimation = defaultAnimation.timed(with: context, for: self)
|
|
32
|
+
add(timedAnimation, forKey: property.caLayerKeypath)
|
|
32
33
|
}
|
|
33
34
|
}
|
|
34
35
|
|
|
@@ -44,7 +45,7 @@ extension CALayer {
|
|
|
44
45
|
value keyframeValueMapping: (KeyframeValue) throws -> ValueRepresentation,
|
|
45
46
|
context: LayerAnimationContext)
|
|
46
47
|
throws
|
|
47
|
-
->
|
|
48
|
+
-> CAAnimation?
|
|
48
49
|
{
|
|
49
50
|
guard !keyframes.isEmpty else { return nil }
|
|
50
51
|
|
|
@@ -52,39 +53,31 @@ extension CALayer {
|
|
|
52
53
|
// by applying that value directly to the layer instead of creating
|
|
53
54
|
// a relatively expensive `CAKeyframeAnimation`.
|
|
54
55
|
if keyframes.count == 1 {
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
return nil
|
|
61
|
-
}
|
|
56
|
+
return singleKeyframeAnimation(
|
|
57
|
+
for: property,
|
|
58
|
+
keyframeValue: try keyframeValueMapping(keyframes[0].value),
|
|
59
|
+
writeDirectlyToPropertyIfPossible: true)
|
|
60
|
+
}
|
|
62
61
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
if
|
|
67
|
-
let defaultValue = property.defaultValue,
|
|
68
|
-
defaultValue == value(forKey: property.caLayerKeypath) as? ValueRepresentation
|
|
69
|
-
{
|
|
70
|
-
setValue(keyframeValue, forKeyPath: property.caLayerKeypath)
|
|
71
|
-
return nil
|
|
72
|
-
}
|
|
62
|
+
// Split the keyframes into segments with the same `CAAnimationCalculationMode` value
|
|
63
|
+
// - Each of these segments will become their own `CAKeyframeAnimation`
|
|
64
|
+
let animationSegments = keyframes.segmentsSplitByCalculationMode()
|
|
73
65
|
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
66
|
+
// If we only have a single segment, we can just create a single `CAKeyframeAnimation`
|
|
67
|
+
// instead of wrapping it in a `CAAnimationGroup` -- this reduces allocation overhead a bit.
|
|
68
|
+
if animationSegments.count == 1 {
|
|
69
|
+
return try keyframeAnimation(
|
|
70
|
+
for: property,
|
|
71
|
+
keyframes: animationSegments[0],
|
|
72
|
+
value: keyframeValueMapping,
|
|
73
|
+
context: context)
|
|
74
|
+
} else {
|
|
75
|
+
return try animationGroup(
|
|
76
|
+
for: property,
|
|
77
|
+
animationSegments: animationSegments,
|
|
78
|
+
value: keyframeValueMapping,
|
|
79
|
+
context: context)
|
|
81
80
|
}
|
|
82
|
-
|
|
83
|
-
return try keyframeAnimation(
|
|
84
|
-
for: property,
|
|
85
|
-
keyframes: keyframes,
|
|
86
|
-
value: keyframeValueMapping,
|
|
87
|
-
context: context)
|
|
88
81
|
}
|
|
89
82
|
|
|
90
83
|
/// A `CAAnimation` that applies the custom value from the `AnyValueProvider`
|
|
@@ -106,32 +99,142 @@ extension CALayer {
|
|
|
106
99
|
else { return nil }
|
|
107
100
|
|
|
108
101
|
// Since custom animations are overriding an existing animation,
|
|
109
|
-
// we always have to create a
|
|
110
|
-
//
|
|
102
|
+
// we always have to create a CAAnimation and can't write directly
|
|
103
|
+
// to the layer property
|
|
104
|
+
if
|
|
105
|
+
customKeyframes.keyframes.count == 1,
|
|
106
|
+
let singleKeyframeAnimation = singleKeyframeAnimation(
|
|
107
|
+
for: property,
|
|
108
|
+
keyframeValue: customKeyframes.keyframes[0].value,
|
|
109
|
+
writeDirectlyToPropertyIfPossible: false)
|
|
110
|
+
{
|
|
111
|
+
return singleKeyframeAnimation
|
|
112
|
+
}
|
|
113
|
+
|
|
111
114
|
return try keyframeAnimation(
|
|
112
115
|
for: property,
|
|
113
|
-
keyframes: customKeyframes.keyframes,
|
|
116
|
+
keyframes: Array(customKeyframes.keyframes),
|
|
114
117
|
value: { $0 },
|
|
115
118
|
context: context)
|
|
116
119
|
}
|
|
117
120
|
|
|
118
|
-
/// Creates a
|
|
121
|
+
/// Creates an animation that applies a single keyframe to this layer property
|
|
122
|
+
/// - In many cases this animation can be omitted entirely, and the underlying
|
|
123
|
+
/// property can be set directly. In that case, no animation will be created.
|
|
124
|
+
private func singleKeyframeAnimation<ValueRepresentation>(
|
|
125
|
+
for property: LayerProperty<ValueRepresentation>,
|
|
126
|
+
keyframeValue: ValueRepresentation,
|
|
127
|
+
writeDirectlyToPropertyIfPossible: Bool)
|
|
128
|
+
-> CABasicAnimation?
|
|
129
|
+
{
|
|
130
|
+
if writeDirectlyToPropertyIfPossible {
|
|
131
|
+
// If the keyframe value is the same as the layer's default value for this property,
|
|
132
|
+
// then we can just ignore this set of keyframes.
|
|
133
|
+
if keyframeValue == property.defaultValue {
|
|
134
|
+
return nil
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// If the property on the CALayer being animated hasn't been modified from the default yet,
|
|
138
|
+
// then we can apply the keyframe value directly to the layer using KVC instead
|
|
139
|
+
// of creating a `CAAnimation`.
|
|
140
|
+
if
|
|
141
|
+
let defaultValue = property.defaultValue,
|
|
142
|
+
defaultValue == value(forKey: property.caLayerKeypath) as? ValueRepresentation
|
|
143
|
+
{
|
|
144
|
+
setValue(keyframeValue, forKeyPath: property.caLayerKeypath)
|
|
145
|
+
return nil
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
// Otherwise, we still need to create a `CAAnimation`, but we can
|
|
150
|
+
// create a simple `CABasicAnimation` that is still less expensive
|
|
151
|
+
// than computing a `CAKeyframeAnimation`.
|
|
152
|
+
let animation = CABasicAnimation(keyPath: property.caLayerKeypath)
|
|
153
|
+
animation.fromValue = keyframeValue
|
|
154
|
+
animation.toValue = keyframeValue
|
|
155
|
+
return animation
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/// Creates a `CAAnimationGroup` that wraps a `CAKeyframeAnimation` for each
|
|
159
|
+
/// of the given `animationSegments`
|
|
160
|
+
private func animationGroup<KeyframeValue, ValueRepresentation>(
|
|
161
|
+
for property: LayerProperty<ValueRepresentation>,
|
|
162
|
+
animationSegments: [[Keyframe<KeyframeValue>]],
|
|
163
|
+
value keyframeValueMapping: (KeyframeValue) throws -> ValueRepresentation,
|
|
164
|
+
context: LayerAnimationContext)
|
|
165
|
+
throws
|
|
166
|
+
-> CAAnimationGroup
|
|
167
|
+
{
|
|
168
|
+
// Build the `CAKeyframeAnimation` for each segment of keyframes
|
|
169
|
+
// with the same `CAAnimationCalculationMode`.
|
|
170
|
+
// - Here we have a non-zero number of animation segments,
|
|
171
|
+
// all of which have a non-zero number of keyframes.
|
|
172
|
+
let segmentAnimations: [CAKeyframeAnimation] = try animationSegments.indices.map { index in
|
|
173
|
+
let animationSegment = animationSegments[index]
|
|
174
|
+
var segmentStartTime = context.time(for: animationSegment.first!.time)
|
|
175
|
+
var segmentEndTime = context.time(for: animationSegment.last!.time)
|
|
176
|
+
|
|
177
|
+
// Every portion of the animation timeline has to be covered by a `CAKeyframeAnimation`,
|
|
178
|
+
// so if this is the first or last segment then the start/end time should be exactly
|
|
179
|
+
// the start/end time of the animation itself.
|
|
180
|
+
let isFirstSegment = (index == animationSegments.indices.first!)
|
|
181
|
+
let isLastSegment = (index == animationSegments.indices.last!)
|
|
182
|
+
|
|
183
|
+
if isFirstSegment {
|
|
184
|
+
segmentStartTime = context.time(for: context.animation.startFrame)
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
if isLastSegment {
|
|
188
|
+
segmentEndTime = context.time(for: context.animation.endFrame)
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
let segmentDuration = segmentEndTime - segmentStartTime
|
|
192
|
+
|
|
193
|
+
// We're building `CAKeyframeAnimation`s, so the `keyTimes` are expressed
|
|
194
|
+
// relative to 0 (`segmentStartTime`) and 1 (`segmentEndTime`). This is different
|
|
195
|
+
// from the default behavior of the `keyframeAnimation` method, where times
|
|
196
|
+
// are expressed relative to the entire animation duration.
|
|
197
|
+
let customKeyTimes = animationSegment.map { keyframeModel -> NSNumber in
|
|
198
|
+
let keyframeTime = context.time(for: keyframeModel.time)
|
|
199
|
+
let segmentProgressTime = ((keyframeTime - segmentStartTime) / segmentDuration)
|
|
200
|
+
return segmentProgressTime as NSNumber
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
let animation = try keyframeAnimation(
|
|
204
|
+
for: property,
|
|
205
|
+
keyframes: animationSegment,
|
|
206
|
+
value: keyframeValueMapping,
|
|
207
|
+
customKeyTimes: customKeyTimes,
|
|
208
|
+
context: context)
|
|
209
|
+
|
|
210
|
+
animation.duration = segmentDuration
|
|
211
|
+
animation.beginTime = segmentStartTime
|
|
212
|
+
return animation
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
let fullAnimation = CAAnimationGroup()
|
|
216
|
+
fullAnimation.animations = segmentAnimations
|
|
217
|
+
return fullAnimation
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
/// Creates and validates a `CAKeyframeAnimation` for the given keyframes
|
|
119
221
|
private func keyframeAnimation<KeyframeValue, ValueRepresentation>(
|
|
120
222
|
for property: LayerProperty<ValueRepresentation>,
|
|
121
|
-
keyframes:
|
|
223
|
+
keyframes: [Keyframe<KeyframeValue>],
|
|
122
224
|
value keyframeValueMapping: (KeyframeValue) throws -> ValueRepresentation,
|
|
225
|
+
customKeyTimes: [NSNumber]? = nil,
|
|
123
226
|
context: LayerAnimationContext)
|
|
124
227
|
throws
|
|
125
228
|
-> CAKeyframeAnimation
|
|
126
229
|
{
|
|
127
230
|
// Convert the list of `Keyframe<T>` into
|
|
128
231
|
// the representation used by `CAKeyframeAnimation`
|
|
129
|
-
var keyTimes = keyframes.map { keyframeModel -> NSNumber in
|
|
232
|
+
var keyTimes = customKeyTimes ?? keyframes.map { keyframeModel -> NSNumber in
|
|
130
233
|
NSNumber(value: Float(context.progressTime(for: keyframeModel.time)))
|
|
131
234
|
}
|
|
132
235
|
|
|
133
236
|
var timingFunctions = self.timingFunctions(for: keyframes)
|
|
134
|
-
let calculationMode =
|
|
237
|
+
let calculationMode = self.calculationMode(for: keyframes)
|
|
135
238
|
|
|
136
239
|
let animation = CAKeyframeAnimation(keyPath: property.caLayerKeypath)
|
|
137
240
|
|
|
@@ -173,37 +276,22 @@ extension CALayer {
|
|
|
173
276
|
/// The `CAAnimationCalculationMode` that should be used for a `CAKeyframeAnimation`
|
|
174
277
|
/// animating the given keyframes
|
|
175
278
|
private func calculationMode<KeyframeValue>(
|
|
176
|
-
for keyframes:
|
|
177
|
-
context: LayerAnimationContext)
|
|
178
|
-
throws
|
|
279
|
+
for keyframes: [Keyframe<KeyframeValue>])
|
|
179
280
|
-> CAAnimationCalculationMode
|
|
180
281
|
{
|
|
181
|
-
//
|
|
182
|
-
//
|
|
183
|
-
//
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
// - We should be able to support this in the future by creating multiple
|
|
189
|
-
// `CAKeyframeAnimation`s with different `calculationMode`s and
|
|
190
|
-
// playing them sequentially.
|
|
191
|
-
//
|
|
192
|
-
let intermediateKeyframes = keyframes.dropFirst().dropLast()
|
|
193
|
-
if intermediateKeyframes.contains(where: \.isHold) {
|
|
194
|
-
if intermediateKeyframes.allSatisfy(\.isHold) {
|
|
195
|
-
return .discrete
|
|
196
|
-
} else {
|
|
197
|
-
try context.logCompatibilityIssue("Mixed `isHold` / `!isHold` keyframes are currently unsupported")
|
|
198
|
-
}
|
|
282
|
+
// At this point we expect all of the animations to have been split in
|
|
283
|
+
// to segments based on the `CAAnimationCalculationMode`, so we can just
|
|
284
|
+
// check the first keyframe.
|
|
285
|
+
if keyframes[0].isHold {
|
|
286
|
+
return .discrete
|
|
287
|
+
} else {
|
|
288
|
+
return .linear
|
|
199
289
|
}
|
|
200
|
-
|
|
201
|
-
return .linear
|
|
202
290
|
}
|
|
203
291
|
|
|
204
292
|
/// `timingFunctions` to apply to a `CAKeyframeAnimation` animating the given keyframes
|
|
205
293
|
private func timingFunctions<KeyframeValue>(
|
|
206
|
-
for keyframes:
|
|
294
|
+
for keyframes: [Keyframe<KeyframeValue>])
|
|
207
295
|
-> [CAMediaTimingFunction]
|
|
208
296
|
{
|
|
209
297
|
// Compute the timing function between each keyframe and the subsequent keyframe
|
|
@@ -231,9 +319,10 @@ extension CALayer {
|
|
|
231
319
|
/// Creates a `CGPath` for the given `position` keyframes,
|
|
232
320
|
/// which accounts for `spatialInTangent`s and `spatialOutTangents`
|
|
233
321
|
private func path<KeyframeValue>(
|
|
234
|
-
keyframes positionKeyframes:
|
|
322
|
+
keyframes positionKeyframes: [Keyframe<KeyframeValue>],
|
|
235
323
|
value keyframeValueMapping: (KeyframeValue) throws -> CGPoint) rethrows
|
|
236
|
-
-> CGPath
|
|
324
|
+
-> CGPath
|
|
325
|
+
{
|
|
237
326
|
let path = CGMutablePath()
|
|
238
327
|
|
|
239
328
|
for (index, keyframe) in positionKeyframes.enumerated() {
|
|
@@ -320,3 +409,40 @@ extension CALayer {
|
|
|
320
409
|
}
|
|
321
410
|
|
|
322
411
|
}
|
|
412
|
+
|
|
413
|
+
extension RandomAccessCollection {
|
|
414
|
+
/// Splits this array of `Keyframe`s into segments with the same `CAAnimationCalculationMode`
|
|
415
|
+
/// - Keyframes with `isHold=true` become `discrete`, and keyframes with `isHold=false`
|
|
416
|
+
/// become linear. Each `CAKeyframeAnimation` can only be one or the other, so each
|
|
417
|
+
/// `calculationModeSegment` becomes its own `CAKeyframeAnimation`.
|
|
418
|
+
func segmentsSplitByCalculationMode<KeyframeValue>() -> [[Element]]
|
|
419
|
+
where Element == Keyframe<KeyframeValue>, Index == Int
|
|
420
|
+
{
|
|
421
|
+
var segments: [[Element]] = []
|
|
422
|
+
var currentSegment: [Element] = []
|
|
423
|
+
|
|
424
|
+
for keyframe in self {
|
|
425
|
+
guard let mostRecentKeyframe = currentSegment.last else {
|
|
426
|
+
currentSegment.append(keyframe)
|
|
427
|
+
continue
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
// When `isHold` changes between any two given keyframes, we have to create a new segment
|
|
431
|
+
if keyframe.isHold != mostRecentKeyframe.isHold {
|
|
432
|
+
// Add this keyframe to both the existing segment that is ending,
|
|
433
|
+
// so we know how long that segment is, and the new segment,
|
|
434
|
+
// so we know when that segment starts.
|
|
435
|
+
currentSegment.append(keyframe)
|
|
436
|
+
segments.append(currentSegment)
|
|
437
|
+
currentSegment = [keyframe]
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
else {
|
|
441
|
+
currentSegment.append(keyframe)
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
segments.append(currentSegment)
|
|
446
|
+
return segments
|
|
447
|
+
}
|
|
448
|
+
}
|
|
@@ -29,7 +29,13 @@ extension GradientRenderLayer {
|
|
|
29
29
|
// MARK: Internal
|
|
30
30
|
|
|
31
31
|
/// Adds gradient-related animations to this layer, from the given `GradientFill`
|
|
32
|
-
|
|
32
|
+
/// - The RGB components and alpha components can have different color stops / locations,
|
|
33
|
+
/// so have to be rendered in separate `CAGradientLayer`s.
|
|
34
|
+
func addGradientAnimations(
|
|
35
|
+
for gradient: GradientShapeItem,
|
|
36
|
+
type: GradientContentType,
|
|
37
|
+
context: LayerAnimationContext) throws
|
|
38
|
+
{
|
|
33
39
|
// We have to set `colors` to a non-nil value with some valid number of colors
|
|
34
40
|
// for the color animation below to have any effect
|
|
35
41
|
colors = .init(
|
|
@@ -40,7 +46,7 @@ extension GradientRenderLayer {
|
|
|
40
46
|
for: .colors,
|
|
41
47
|
keyframes: gradient.colors.keyframes,
|
|
42
48
|
value: { colorComponents in
|
|
43
|
-
|
|
49
|
+
gradient.colorConfiguration(from: colorComponents, type: type).map { $0.color }
|
|
44
50
|
},
|
|
45
51
|
context: context)
|
|
46
52
|
|
|
@@ -48,7 +54,7 @@ extension GradientRenderLayer {
|
|
|
48
54
|
for: .locations,
|
|
49
55
|
keyframes: gradient.colors.keyframes,
|
|
50
56
|
value: { colorComponents in
|
|
51
|
-
|
|
57
|
+
gradient.colorConfiguration(from: colorComponents, type: type).map { $0.location }
|
|
52
58
|
},
|
|
53
59
|
context: context)
|
|
54
60
|
|
|
@@ -113,55 +119,92 @@ extension GradientRenderLayer {
|
|
|
113
119
|
}
|
|
114
120
|
}
|
|
115
121
|
|
|
122
|
+
// MARK: - GradientContentType
|
|
123
|
+
|
|
124
|
+
/// Each type of gradient that can be constructed from a `GradientShapeItem`
|
|
125
|
+
enum GradientContentType {
|
|
126
|
+
case rgb
|
|
127
|
+
case alpha
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/// `colors` and `locations` configuration for a `CAGradientLayer`
|
|
131
|
+
typealias GradientColorConfiguration = [(color: CGColor, location: CGFloat)]
|
|
132
|
+
|
|
116
133
|
extension GradientShapeItem {
|
|
134
|
+
|
|
135
|
+
// MARK: Internal
|
|
136
|
+
|
|
137
|
+
/// Whether or not this `GradientShapeItem` includes an alpha component
|
|
138
|
+
/// that has to be rendered as a separate `CAGradientLayer` from the
|
|
139
|
+
/// layer that renders the rgb color components
|
|
140
|
+
var hasAlphaComponent: Bool {
|
|
141
|
+
for colorComponentsKeyframe in colors.keyframes {
|
|
142
|
+
let colorComponents = colorComponentsKeyframe.value
|
|
143
|
+
let alphaConfiguration = colorConfiguration(from: colorComponents, type: .alpha)
|
|
144
|
+
|
|
145
|
+
let notFullyOpaque = alphaConfiguration.contains(where: { color, _ in
|
|
146
|
+
color.alpha < 0.999
|
|
147
|
+
})
|
|
148
|
+
|
|
149
|
+
if notFullyOpaque {
|
|
150
|
+
return true
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
return false
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// MARK: Fileprivate
|
|
158
|
+
|
|
117
159
|
/// Converts the compact `[Double]` color components representation
|
|
118
160
|
/// into an array of `CGColor`s and the location of those colors within the gradient.
|
|
119
161
|
/// - The color components array is a repeating list of `[location, red, green, blue]` values
|
|
120
162
|
/// for each color in the gradient, followed by an optional repeating list of
|
|
121
163
|
/// `[location, alpha]` values that control the colors' alpha values.
|
|
164
|
+
/// - The RGB and alpha values can have different color stops / locations,
|
|
165
|
+
/// so each has to be rendered in a separate `CAGradientLayer`.
|
|
122
166
|
fileprivate func colorConfiguration(
|
|
123
167
|
from colorComponents: [Double],
|
|
124
|
-
|
|
125
|
-
->
|
|
168
|
+
type: GradientContentType)
|
|
169
|
+
-> GradientColorConfiguration
|
|
126
170
|
{
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
171
|
+
switch type {
|
|
172
|
+
case .rgb:
|
|
173
|
+
precondition(
|
|
174
|
+
colorComponents.count >= numberOfColors * 4,
|
|
175
|
+
"Each color must have RGB components and a location component")
|
|
130
176
|
|
|
131
|
-
|
|
177
|
+
// Each group of four `Double` values represents a single `CGColor`,
|
|
178
|
+
// and its relative location within the gradient.
|
|
179
|
+
var colors = GradientColorConfiguration()
|
|
132
180
|
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
for colorIndex in 0..<numberOfColors {
|
|
136
|
-
let colorStartIndex = colorIndex * 4
|
|
181
|
+
for colorIndex in 0..<numberOfColors {
|
|
182
|
+
let colorStartIndex = colorIndex * 4
|
|
137
183
|
|
|
138
|
-
|
|
184
|
+
let colorLocation = CGFloat(colorComponents[colorStartIndex])
|
|
139
185
|
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
if alphaLocation == colorLocation {
|
|
147
|
-
alpha = colorComponents[alphaIndex + 1]
|
|
148
|
-
} else {
|
|
149
|
-
try context.logCompatibilityIssue("""
|
|
150
|
-
The Core Animation rendering engine currently expects gradient colors and alpha values
|
|
151
|
-
to be in the same order, with the same color stops / locations.
|
|
152
|
-
""")
|
|
153
|
-
}
|
|
186
|
+
let color = CGColor.rgb(
|
|
187
|
+
CGFloat(colorComponents[colorStartIndex + 1]),
|
|
188
|
+
CGFloat(colorComponents[colorStartIndex + 2]),
|
|
189
|
+
CGFloat(colorComponents[colorStartIndex + 3]))
|
|
190
|
+
|
|
191
|
+
colors.append((color: color, location: colorLocation))
|
|
154
192
|
}
|
|
155
193
|
|
|
156
|
-
|
|
157
|
-
CGFloat(colorComponents[colorStartIndex + 1]),
|
|
158
|
-
CGFloat(colorComponents[colorStartIndex + 2]),
|
|
159
|
-
CGFloat(colorComponents[colorStartIndex + 3]),
|
|
160
|
-
CGFloat(alpha))
|
|
194
|
+
return colors
|
|
161
195
|
|
|
162
|
-
|
|
163
|
-
|
|
196
|
+
case .alpha:
|
|
197
|
+
// After the rgb color components, there can be arbitrary number of repeating
|
|
198
|
+
// `[alphaLocation, alphaValue]` pairs that define a separate alpha gradient.
|
|
199
|
+
var alphaValues = GradientColorConfiguration()
|
|
200
|
+
|
|
201
|
+
for alphaIndex in stride(from: numberOfColors * 4, to: colorComponents.endIndex, by: 2) {
|
|
202
|
+
let alphaLocation = CGFloat(colorComponents[alphaIndex])
|
|
203
|
+
let alphaValue = CGFloat(colorComponents[alphaIndex + 1])
|
|
204
|
+
alphaValues.append((color: .rgba(0, 0, 0, alphaValue), location: alphaLocation))
|
|
205
|
+
}
|
|
164
206
|
|
|
165
|
-
|
|
207
|
+
return alphaValues
|
|
208
|
+
}
|
|
166
209
|
}
|
|
167
210
|
}
|
|
@@ -58,56 +58,56 @@ extension LayerProperty {
|
|
|
58
58
|
.init(
|
|
59
59
|
caLayerKeypath: "transform.translation",
|
|
60
60
|
defaultValue: CGPoint(x: 0, y: 0),
|
|
61
|
-
customizableProperty: nil /* currently unsupported */)
|
|
61
|
+
customizableProperty: nil /* currently unsupported */ )
|
|
62
62
|
}
|
|
63
63
|
|
|
64
64
|
static var positionX: LayerProperty<CGFloat> {
|
|
65
65
|
.init(
|
|
66
66
|
caLayerKeypath: "transform.translation.x",
|
|
67
67
|
defaultValue: 0,
|
|
68
|
-
customizableProperty: nil /* currently unsupported */)
|
|
68
|
+
customizableProperty: nil /* currently unsupported */ )
|
|
69
69
|
}
|
|
70
70
|
|
|
71
71
|
static var positionY: LayerProperty<CGFloat> {
|
|
72
72
|
.init(
|
|
73
73
|
caLayerKeypath: "transform.translation.y",
|
|
74
74
|
defaultValue: 0,
|
|
75
|
-
customizableProperty: nil /* currently unsupported */)
|
|
75
|
+
customizableProperty: nil /* currently unsupported */ )
|
|
76
76
|
}
|
|
77
77
|
|
|
78
78
|
static var scale: LayerProperty<CGFloat> {
|
|
79
79
|
.init(
|
|
80
80
|
caLayerKeypath: "transform.scale",
|
|
81
81
|
defaultValue: 1,
|
|
82
|
-
customizableProperty: nil /* currently unsupported */)
|
|
82
|
+
customizableProperty: nil /* currently unsupported */ )
|
|
83
83
|
}
|
|
84
84
|
|
|
85
85
|
static var scaleX: LayerProperty<CGFloat> {
|
|
86
86
|
.init(
|
|
87
87
|
caLayerKeypath: "transform.scale.x",
|
|
88
88
|
defaultValue: 1,
|
|
89
|
-
customizableProperty: nil /* currently unsupported */)
|
|
89
|
+
customizableProperty: nil /* currently unsupported */ )
|
|
90
90
|
}
|
|
91
91
|
|
|
92
92
|
static var scaleY: LayerProperty<CGFloat> {
|
|
93
93
|
.init(
|
|
94
94
|
caLayerKeypath: "transform.scale.y",
|
|
95
95
|
defaultValue: 1,
|
|
96
|
-
customizableProperty: nil /* currently unsupported */)
|
|
96
|
+
customizableProperty: nil /* currently unsupported */ )
|
|
97
97
|
}
|
|
98
98
|
|
|
99
99
|
static var rotation: LayerProperty<CGFloat> {
|
|
100
100
|
.init(
|
|
101
101
|
caLayerKeypath: "transform.rotation",
|
|
102
102
|
defaultValue: 0,
|
|
103
|
-
customizableProperty: nil /* currently unsupported */)
|
|
103
|
+
customizableProperty: nil /* currently unsupported */ )
|
|
104
104
|
}
|
|
105
105
|
|
|
106
106
|
static var rotationY: LayerProperty<CGFloat> {
|
|
107
107
|
.init(
|
|
108
108
|
caLayerKeypath: "transform.rotation.y",
|
|
109
109
|
defaultValue: 0,
|
|
110
|
-
customizableProperty: nil /* currently unsupported */)
|
|
110
|
+
customizableProperty: nil /* currently unsupported */ )
|
|
111
111
|
}
|
|
112
112
|
|
|
113
113
|
static var anchorPoint: LayerProperty<CGPoint> {
|
|
@@ -116,14 +116,14 @@ extension LayerProperty {
|
|
|
116
116
|
// This is intentionally not `GGPoint(x: 0.5, y: 0.5)` (the actual default)
|
|
117
117
|
// to opt `anchorPoint` out of the KVC `setValue` flow, which causes issues.
|
|
118
118
|
defaultValue: nil,
|
|
119
|
-
customizableProperty: nil /* currently unsupported */)
|
|
119
|
+
customizableProperty: nil /* currently unsupported */ )
|
|
120
120
|
}
|
|
121
121
|
|
|
122
122
|
static var opacity: LayerProperty<CGFloat> {
|
|
123
123
|
.init(
|
|
124
124
|
caLayerKeypath: #keyPath(CALayer.opacity),
|
|
125
125
|
defaultValue: 1,
|
|
126
|
-
customizableProperty: nil /* currently unsupported */)
|
|
126
|
+
customizableProperty: nil /* currently unsupported */ )
|
|
127
127
|
}
|
|
128
128
|
}
|
|
129
129
|
|
|
@@ -134,7 +134,7 @@ extension LayerProperty {
|
|
|
134
134
|
.init(
|
|
135
135
|
caLayerKeypath: #keyPath(CAShapeLayer.path),
|
|
136
136
|
defaultValue: nil,
|
|
137
|
-
customizableProperty: nil /* currently unsupported */)
|
|
137
|
+
customizableProperty: nil /* currently unsupported */ )
|
|
138
138
|
}
|
|
139
139
|
|
|
140
140
|
static var fillColor: LayerProperty<CGColor> {
|
|
@@ -148,14 +148,14 @@ extension LayerProperty {
|
|
|
148
148
|
.init(
|
|
149
149
|
caLayerKeypath: #keyPath(CAShapeLayer.lineWidth),
|
|
150
150
|
defaultValue: 1,
|
|
151
|
-
customizableProperty: nil /* currently unsupported */)
|
|
151
|
+
customizableProperty: nil /* currently unsupported */ )
|
|
152
152
|
}
|
|
153
153
|
|
|
154
154
|
static var lineDashPhase: LayerProperty<CGFloat> {
|
|
155
155
|
.init(
|
|
156
156
|
caLayerKeypath: #keyPath(CAShapeLayer.lineDashPhase),
|
|
157
157
|
defaultValue: 0,
|
|
158
|
-
customizableProperty: nil /* currently unsupported */)
|
|
158
|
+
customizableProperty: nil /* currently unsupported */ )
|
|
159
159
|
}
|
|
160
160
|
|
|
161
161
|
static var strokeColor: LayerProperty<CGColor> {
|
|
@@ -169,14 +169,14 @@ extension LayerProperty {
|
|
|
169
169
|
.init(
|
|
170
170
|
caLayerKeypath: #keyPath(CAShapeLayer.strokeStart),
|
|
171
171
|
defaultValue: 0,
|
|
172
|
-
customizableProperty: nil /* currently unsupported */)
|
|
172
|
+
customizableProperty: nil /* currently unsupported */ )
|
|
173
173
|
}
|
|
174
174
|
|
|
175
175
|
static var strokeEnd: LayerProperty<CGFloat> {
|
|
176
176
|
.init(
|
|
177
177
|
caLayerKeypath: #keyPath(CAShapeLayer.strokeEnd),
|
|
178
178
|
defaultValue: 1,
|
|
179
|
-
customizableProperty: nil /* currently unsupported */)
|
|
179
|
+
customizableProperty: nil /* currently unsupported */ )
|
|
180
180
|
}
|
|
181
181
|
}
|
|
182
182
|
|
|
@@ -187,28 +187,28 @@ extension LayerProperty {
|
|
|
187
187
|
.init(
|
|
188
188
|
caLayerKeypath: #keyPath(CAGradientLayer.colors),
|
|
189
189
|
defaultValue: nil,
|
|
190
|
-
customizableProperty: nil /* currently unsupported */)
|
|
190
|
+
customizableProperty: nil /* currently unsupported */ )
|
|
191
191
|
}
|
|
192
192
|
|
|
193
193
|
static var locations: LayerProperty<[CGFloat]> {
|
|
194
194
|
.init(
|
|
195
195
|
caLayerKeypath: #keyPath(CAGradientLayer.locations),
|
|
196
196
|
defaultValue: nil,
|
|
197
|
-
customizableProperty: nil /* currently unsupported */)
|
|
197
|
+
customizableProperty: nil /* currently unsupported */ )
|
|
198
198
|
}
|
|
199
199
|
|
|
200
200
|
static var startPoint: LayerProperty<CGPoint> {
|
|
201
201
|
.init(
|
|
202
202
|
caLayerKeypath: #keyPath(CAGradientLayer.startPoint),
|
|
203
203
|
defaultValue: nil,
|
|
204
|
-
customizableProperty: nil /* currently unsupported */)
|
|
204
|
+
customizableProperty: nil /* currently unsupported */ )
|
|
205
205
|
}
|
|
206
206
|
|
|
207
207
|
static var endPoint: LayerProperty<CGPoint> {
|
|
208
208
|
.init(
|
|
209
209
|
caLayerKeypath: #keyPath(CAGradientLayer.endPoint),
|
|
210
210
|
defaultValue: nil,
|
|
211
|
-
customizableProperty: nil /* currently unsupported */)
|
|
211
|
+
customizableProperty: nil /* currently unsupported */ )
|
|
212
212
|
}
|
|
213
213
|
}
|
|
214
214
|
|