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.
Files changed (353) hide show
  1. package/.github/workflows/main.yml +10 -7
  2. package/.swift-version +1 -0
  3. package/Lottie.xcodeproj/project.pbxproj +5 -5
  4. package/Lottie.xcworkspace/xcshareddata/swiftpm/Package.resolved +81 -0
  5. package/Lottie.xcworkspace/xcuserdata/calstephens.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  6. package/Lottie.xcworkspace/xcuserdata/calstephens.xcuserdatad/xcschemes/xcschememanagement.plist +30 -0
  7. package/Package.resolved +88 -0
  8. package/Package.swift +5 -0
  9. package/README.md +5 -6
  10. package/Rakefile +13 -17
  11. package/Sources/Private/CoreAnimation/Animations/CAAnimation+TimingConfiguration.swift +7 -2
  12. package/Sources/Private/CoreAnimation/Animations/CALayer+addAnimation.swift +191 -65
  13. package/Sources/Private/CoreAnimation/Animations/GradientAnimations.swift +79 -36
  14. package/Sources/Private/CoreAnimation/Animations/LayerProperty.swift +19 -19
  15. package/Sources/Private/CoreAnimation/Extensions/Keyframes+combinedIfPossible.swift +18 -6
  16. package/Sources/Private/CoreAnimation/Layers/AnimationLayer.swift +6 -0
  17. package/Sources/Private/CoreAnimation/Layers/GradientRenderLayer.swift +9 -2
  18. package/Sources/Private/CoreAnimation/Layers/ShapeItemLayer.swift +77 -34
  19. package/Sources/Private/CoreAnimation/Layers/ShapeLayer.swift +15 -1
  20. package/Sources/Private/MainThread/LayerContainers/CompLayers/MaskContainerLayer.swift +0 -2
  21. package/Sources/Private/MainThread/LayerContainers/CompLayers/PreCompositionLayer.swift +2 -2
  22. package/Sources/Private/MainThread/LayerContainers/MainThreadAnimationLayer.swift +1 -2
  23. package/Sources/Private/MainThread/LayerContainers/Utility/CoreTextRenderLayer.swift +1 -1
  24. package/Sources/Private/MainThread/LayerContainers/Utility/LayerTransformNode.swift +0 -1
  25. package/Sources/Private/MainThread/NodeRenderSystem/Extensions/ItemsExtension.swift +0 -2
  26. package/Sources/Private/MainThread/NodeRenderSystem/NodeProperties/ValueProviders/KeyframeInterpolator.swift +1 -4
  27. package/Sources/Private/MainThread/NodeRenderSystem/Nodes/ModifierNodes/TrimPathNode.swift +4 -7
  28. package/Sources/Private/MainThread/NodeRenderSystem/Nodes/OutputNodes/Renderables/GradientStrokeRenderer.swift +1 -2
  29. package/Sources/Private/MainThread/NodeRenderSystem/Nodes/OutputNodes/Renderables/LegacyGradientFillRenderer.swift +1 -1
  30. package/Sources/Private/MainThread/NodeRenderSystem/Nodes/OutputNodes/Renderables/StrokeRenderer.swift +1 -1
  31. package/Sources/Private/MainThread/NodeRenderSystem/Nodes/PathNodes/RectNode.swift +1 -1
  32. package/Sources/Private/MainThread/NodeRenderSystem/Nodes/PathNodes/StarNode.swift +3 -3
  33. package/Sources/Private/MainThread/NodeRenderSystem/RenderLayers/ShapeContainerLayer.swift +1 -1
  34. package/Sources/Private/MainThread/NodeRenderSystem/RenderLayers/ShapeRenderLayer.swift +0 -1
  35. package/Sources/Private/Model/ShapeItems/Group.swift +6 -1
  36. package/Sources/Private/Model/Text/TextAnimator.swift +0 -1
  37. package/Sources/Private/Utility/Debugging/LayerDebugging.swift +1 -2
  38. package/Sources/Private/Utility/Extensions/MathKit.swift +1 -2
  39. package/Sources/Private/Utility/Extensions/StringExtensions.swift +0 -1
  40. package/Sources/Private/Utility/Interpolatable/InterpolatableExtensions.swift +0 -1
  41. package/Sources/Private/Utility/Primitives/BezierPath.swift +1 -2
  42. package/Sources/Private/Utility/Primitives/CurveVertex.swift +2 -4
  43. package/Sources/Public/Animation/AnimationPublic.swift +0 -3
  44. package/Sources/Public/Animation/AnimationView.swift +26 -6
  45. package/Sources/Public/Animation/AnimationViewInitializers.swift +13 -11
  46. package/Sources/Public/DynamicProperties/ValueProviders/GradientValueProvider.swift +0 -2
  47. package/Sources/Public/FontProvider/AnimationFontProvider.swift +1 -1
  48. package/Sources/Public/Logging/LottieLogger.swift +15 -2
  49. package/Sources/Public/TextProvider/AnimationTextProvider.swift +1 -1
  50. package/Sources/Public/iOS/AnimatedButton.swift +10 -4
  51. package/Sources/Public/iOS/AnimatedControl.swift +3 -5
  52. package/Sources/Public/iOS/AnimatedSwitch.swift +9 -6
  53. package/Sources/Public/iOS/BundleImageProvider.swift +0 -1
  54. package/Sources/Public/iOS/FilepathImageProvider.swift +0 -1
  55. package/Sources/Public/macOS/BundleImageProvider.macOS.swift +0 -1
  56. package/Sources/Public/macOS/FilepathImageProvider.macOS.swift +0 -2
  57. package/Tests/ParsingTests.swift +2 -1
  58. package/Tests/PerformanceTests.swift +9 -9
  59. package/lottie-ios.podspec +1 -2
  60. package/package.json +1 -1
  61. package/script/test-carthage/CarthageTest/AppDelegate.swift +6 -7
  62. package/script/test-carthage/CarthageTest/ViewController.swift +1 -1
  63. package/script/test-carthage/CarthageTest-macOS/AppDelegate.swift +7 -0
  64. package/script/test-carthage/CarthageTest-macOS/Assets.xcassets/AccentColor.colorset/Contents.json +11 -0
  65. package/script/test-carthage/CarthageTest-macOS/Assets.xcassets/AppIcon.appiconset/Contents.json +58 -0
  66. package/script/test-carthage/CarthageTest-macOS/Assets.xcassets/Contents.json +6 -0
  67. package/script/test-carthage/CarthageTest-macOS/Base.lproj/Main.storyboard +717 -0
  68. package/script/test-carthage/CarthageTest-macOS/CarthageTest_macOS.entitlements +10 -0
  69. package/script/test-carthage/CarthageTest-macOS/ViewController.swift +15 -0
  70. package/script/test-carthage/CarthageTest.xcodeproj/project.pbxproj +159 -5
  71. package/script/test-carthage/CarthageTest.xcodeproj/project.xcworkspace/xcuserdata/calstephens.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  72. package/script/test-carthage/CarthageTest.xcodeproj/xcuserdata/calstephens.xcuserdatad/xcschemes/xcschememanagement.plist +19 -0
  73. package/Lottie.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +0 -23
  74. package/Mintfile +0 -3
  75. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~-7Vi1RszY1XYnR2CCkEwIpKG8NwwA9zsZEz_WD7Dv6kKh4RC7N7ob8NIRVHGUJKp7eXxlpeI_gzD87Pcs_2u0g== +0 -0
  76. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~-SKV2drO-SFlrlh-wrzECDMkUSr-aF1lV9h-5onOy94zSTsD-oI45s0-KpOK45L-kq3hRY7v9vm-xmh00_eheg== +0 -0
  77. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~-_CU_vuaiFfObSeDFfmp7GuB20ThMSAL-P_RUMowiQLbdu-y0bU9upIm3q8g6XmXUG5hP6J1az0Ma5Hi_rhhRg== +0 -0
  78. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~03aPYP6VHJjZj5DlphGarj0xdw43qu09Onx5SReZoPvg9zh5uL212E-KWfGct9jf6JG0JFV2tdbBi7X_8bH9aw== +0 -0
  79. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~1Z82GPBBPc1VLvn4O7V5glb6lgyXteNlDREUzV_TPymM4ra4UkBMklzV90lEqoYRCDuRVzaQHaDYbmYp3-8CFw== +0 -0
  80. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~1mFDCboXpUu9pSHAiVGr1O_QgqEEtvJp_LUhickxLZo0Z5pj3fvadn1l2MzEOd4bFsVBZifUvcyPa7dzlMWF-A== +0 -0
  81. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~2_L9PUjv2JDKu1n8bDLb4XLB-yex6ZVjDDMwfuKAr7teDw-SKgLgkW6H-m_gjWChIVdB4vW6yvHP7XJxvXtRNA== +0 -0
  82. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~4VqMqsI5lOfxRppnud6-VDWcNsU8J7VgFCJfW2dXPwOcAkvU-I8Um5yp9n0Zv6nr3VmcxYggaVMDFfR0U_vjKw== +0 -1
  83. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~4krT4ZMzDOu34msFUq0Xod142kw4pAeSWX4JSxlsjOI0Wanu3343qeespgFi61MTWq1DdH9XXspVKqGlGm_fyw== +0 -0
  84. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~5_aJsdP-e3dRTAUnH-y1U2plaCuUi1vyHriaZuNK0xFe8wGl9Qft6uLCX2Qt6CRBKJQluEe9o0uRWw1eb42FHQ== +0 -0
  85. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~8b0bSqV7eND54zvHvu1v2Htpm7yn-BOEFw5d3mITJrXWNykJ5BTR9WbrD80JEctNcT-rDqO2xfrQk1tFWeY6Sw== +0 -0
  86. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~9u8KAGpgtSm-mQ12Py8RZUbYbDlBhM3w1I2MQO53K2CSn6IePp7g65DBcdXTYMfG1bgoJ-6x30fjnGe-2UYsDQ== +0 -0
  87. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~Bw7uMs4wqB9ahfEqGii2FkQ9pvZmG6HGe2hmbAT2wyM5hpn8Xh5dELysMcEz6hEsqmn6HdRdLOLZhC_fNaXzgA== +0 -0
  88. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~BwUq2xXQYuE8ya6HT6lfNsdtEjz5AKGf8GvLY6VBxQyIY1vgj_Gov-3NeM69OS66BQRDK0PG9H4Oyg0R48E4vg== +0 -0
  89. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~EkDVUR6dcnzxV_lYjkrJ5QGMVTCvb_upAoBF6DBu61sQkGvZN3fSRTsJ1XfJIZO-JUzdNoVA3D_CcvokL0gnQg== +0 -0
  90. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~FUkcLSJ8RAuPenM4HFG1R-sN5-cDBGcTxgR2jaVCna7xV0ZTyBHriB1Nn59mariNlJDiCoBtMUQEmauGxWtfBA== +0 -0
  91. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~FqsuZe4RVLOOVUYLTL-GTIohZ8TdSfxx7m2KJtLYFPGOdE4XorTX7Oc7kXbhghPRppXT3jW-slI37M34YNEvLQ== +0 -0
  92. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~G4F_NtyTj3i46fmKm0NorHAeq8tYWWYf6uv5yC1DwzdpWVoYbOPufmFNvdEbxZt4AMdV0gKx3HI46EAXNOQVFg== +0 -0
  93. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~GxetzGUNDgaBBXcTmLK6p9JBDX3I3QPshshbui1IaEWvJbQko-E36tCKwaJYHbleAWz9FqkAM_Tqx3YOmSVkVg== +0 -0
  94. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~H1Wjd5kKWDW4t3SDodxiHV72V8WT0xwPubw5cJTNLkPRLgaILFPh-dpy8EOUNgy1KzrDujFsm9EcTsbuqtMPLA== +0 -0
  95. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~JpI5MH4zCgebUHFpXVn4zjtsGtMNnO7BQZWfNARAB5UWa9gqz6YXHR3uLCJ_AvJ3lh53BUVkavsx9TY2FMmxbA== +0 -0
  96. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~JujNYkJtcux0Ni4QnR64zu4Wz_zYjyKvYaYZm5ypxTLPSzF3_jNE_NO4sdbDamF8wEqWoky1uf4ZE0JT3L607A== +0 -0
  97. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~KJSEA6DKnb2_FRPSqKZGh41eo-C8x448J9kEBrH012bUrZfOSDvrgmIrU0Vz7Ri3gaS9aKKmSaVMvXsHSlTJVA== +0 -0
  98. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~MStOwu3jBlJtcRnxrseVOuhI4kCj--ggFPG7sqrq5w1hjrI3bVyD-bm1Jwyx0noY3wT1rHDEvaGWnV2qsGjGwg== +0 -0
  99. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~McsJ8kFVf3IjhgXIRdw8Xx-EXgbV071bmlj2BBnk52xrWl3sEeiIyxwUsF7mIWvMRWfcFfu4VGHYyqfk2BeHXw== +0 -0
  100. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~NHt9fVe4kDdbxnglKcEwXaRK-WsYEOaD23Kbl8SJPRMYHr_Z6SJd_HmG3BROHHR_M6TgSmucONpDJdTj5tjuFw== +0 -0
  101. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~Nfo2iwCPcfAcOBIVyoUAK0-PIfr5qYxIKZt-uaSaTBdrTNxAuJ1ItmeDPZ3VdJJmxD_c22No7x482bdd3_yYtw== +0 -0
  102. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~S2Qlu11xBhEd5aGSzWsnw1TR8u8PiOF93GO0j5bfNoAFCVzxKOwhRFoIXba2EpQnLQqFdIKyhWN3l70A4GPHmg== +0 -0
  103. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~W7a7M37RO9jgck2zeR0471Pm7e8K0Kqj5tXEouDjvqKZXSrWxMaWD28oqkKKYAiU4608R4S9mM11KyphljdMSw== +0 -0
  104. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~XUo1oyPCrlL7CA74wG-OzQ06VOWJYWvHGFHU7keZN1SKaIXjHX5qi_kBzjG_rBCi89-S8GVmCy7S3PHSjG8SbQ== +0 -0
  105. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~Xh0VmDvFNMELHu08-vrs54pegVyUwwDRxx_nXkwyD0NjnYozyqcGAKAr_QWHmw6F8XyuWg51M9KGpJJIFzzGuw== +0 -0
  106. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~Xve-wMBp_lxVUgD9qH5GwieGP9cAWtm0xULZvdGjBRUMvaevmpCB5gnbMBuIXAO6a1c9v6WUq0jNVX7ut5HvOw== +0 -0
  107. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~ZU1XkZFgnEE22CXEF-pOlcj5f10x-KM1Vw9d4IOLu-NiTZcz7koYPixhdrB1PJr8J-h9NpJmfqEastfxamA1jQ== +0 -0
  108. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~_YkNYEHTsbbtFILJpzH3HenH0t4ShI25dIMdve541CF5bl-jPF3X3F7tq-t5dvP0TEkATsOJdLQdBp1xv4Q-ag== +0 -0
  109. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~boy6mpn2jkwm60jjgQ0TG25UqRdN46LzmgTVCrpy6nBOgkLCGkGHcbceiwjU1itS_vj3-iQX0ZnrWOQrPyfHNA== +0 -0
  110. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~bwzpVZ9hAqGDHhXs2FRA82dfGfLmc7-m0uQhZDDfHHO7hQ17M_Np341BZX4WDLhYYS4cdUgaDodlNpdfpG3nXw== +0 -0
  111. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~cBxe-9PpAGFdAsYkmdN3lJVqEliLcRYlyoAov0aPZfJGwUr_cOm3XpjO7nmf_2eLf8UAx-rycjnJzw07xLrNCA== +0 -1
  112. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~dirWk6W4Pav1oyciuflfJlRu0iuxbYOmrpQapOJ0mV9C1SQ-jvDRv_7h753Cy18-SwULARUdWsyUy3yNNvxF7w== +0 -0
  113. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~ebwZVjSEHroc9jtIm4jd_h_YAqEBcOkAZ4HPNJT8pLCldjRcTq-obQLakxXOhfuoOBlYBoZLuO-Y0lskeZRYKw== +0 -0
  114. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~gfcRcmRIr0h09d0jiZsA7nUeQv2XtapxuYEXZy1Z9um0tTJQvz-O5ef5f7zhLenLvjnDtDtlY_aY4Hvpce6e1Q== +0 -0
  115. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~hgOgiVCyv2R0W-f0qKw5xYPeUwj8_ccCM9vKH_7vAQcCO9t8BwR1APGRBv20AONmp-PYMXmtgsBlQkNBRBpdQA== +0 -0
  116. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~hrhCl-YRAAr8ByNB_LCgEBsVNHMp92gTIUknetpUHMjcXl4Hpn_uY-h6C45oga0ZALnfGCo6iKTmiPLa4Qvnpg== +0 -0
  117. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~n2yoR7JsyL4DSUwmjnpE4Iq9Qi_eeZrmpPU8cdehDFKfESK7nwxXxfrSMQbk0BQ2lgGPadoRcd1-qr1xVz97jA== +0 -0
  118. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~nMCcZm8WvPogyO_nuJ926Q3Q2dqVMN2LdjEL1Kq2wJ_RG-rH-e_6v41l1xZbCsQTa3XykQdEiXNc0HtAvT6IRA== +0 -0
  119. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~oc3C7xkUt-OWDL6rrsxs-seS4Fu1bqBWAAXCHalgShaGg9MUrOiRbHT2DcAnhyQFKx6x5FRbvjmYoQWrQiXJZA== +0 -0
  120. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~p-ihj7SEgkDXpMu9hvKE_wiX9cvtwyXrdIn964BfedXHKGpC6o7mMPxEyC0kRPVi_EZs_MRV5bAPEpl5h5we0g== +0 -0
  121. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~qlhO_D9oE8uSKH-mZqyRF9pp4Zv1Tv0dIYcqrH4hb1VWlIxcdxmg2j0M8496cQeFXC5bn_JMXdBlD-d6cnFF8w== +0 -0
  122. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~tjpiyIxJR_boTdUNrtFDuKIZoY84fI4lA1oMJbq9e2ZmYKIK5FeRN2O8cV_yMOYJGr4lbv03kTmT70mCjUc2_Q== +0 -0
  123. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~wULeoj18eEKJWAKx1uFQVwS48cUGFcYPRJQj1Ro5XNJsWCwppGSCdIPhwifD6Z2f_j3zfI2SmC2Gg81sBXXW7g== +0 -0
  124. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~zrEihMys4NVV5rx6FmuzEGO2TjloI3OiC7yzIhvqYoRo43ibb2F-Km6Jf4NX-ac62pOLBYZRcjQTvYMpn75_oA== +0 -0
  125. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~-7Vi1RszY1XYnR2CCkEwIpKG8NwwA9zsZEz_WD7Dv6kKh4RC7N7ob8NIRVHGUJKp7eXxlpeI_gzD87Pcs_2u0g== +0 -0
  126. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~-SKV2drO-SFlrlh-wrzECDMkUSr-aF1lV9h-5onOy94zSTsD-oI45s0-KpOK45L-kq3hRY7v9vm-xmh00_eheg== +0 -0
  127. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~-_CU_vuaiFfObSeDFfmp7GuB20ThMSAL-P_RUMowiQLbdu-y0bU9upIm3q8g6XmXUG5hP6J1az0Ma5Hi_rhhRg== +0 -0
  128. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~03aPYP6VHJjZj5DlphGarj0xdw43qu09Onx5SReZoPvg9zh5uL212E-KWfGct9jf6JG0JFV2tdbBi7X_8bH9aw== +0 -0
  129. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~1Z82GPBBPc1VLvn4O7V5glb6lgyXteNlDREUzV_TPymM4ra4UkBMklzV90lEqoYRCDuRVzaQHaDYbmYp3-8CFw== +0 -0
  130. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~1mFDCboXpUu9pSHAiVGr1O_QgqEEtvJp_LUhickxLZo0Z5pj3fvadn1l2MzEOd4bFsVBZifUvcyPa7dzlMWF-A== +0 -0
  131. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~2_L9PUjv2JDKu1n8bDLb4XLB-yex6ZVjDDMwfuKAr7teDw-SKgLgkW6H-m_gjWChIVdB4vW6yvHP7XJxvXtRNA== +0 -0
  132. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~4VqMqsI5lOfxRppnud6-VDWcNsU8J7VgFCJfW2dXPwOcAkvU-I8Um5yp9n0Zv6nr3VmcxYggaVMDFfR0U_vjKw== +0 -0
  133. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~4krT4ZMzDOu34msFUq0Xod142kw4pAeSWX4JSxlsjOI0Wanu3343qeespgFi61MTWq1DdH9XXspVKqGlGm_fyw== +0 -0
  134. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~5_aJsdP-e3dRTAUnH-y1U2plaCuUi1vyHriaZuNK0xFe8wGl9Qft6uLCX2Qt6CRBKJQluEe9o0uRWw1eb42FHQ== +0 -0
  135. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~8b0bSqV7eND54zvHvu1v2Htpm7yn-BOEFw5d3mITJrXWNykJ5BTR9WbrD80JEctNcT-rDqO2xfrQk1tFWeY6Sw== +0 -0
  136. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~9u8KAGpgtSm-mQ12Py8RZUbYbDlBhM3w1I2MQO53K2CSn6IePp7g65DBcdXTYMfG1bgoJ-6x30fjnGe-2UYsDQ== +0 -0
  137. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~Bw7uMs4wqB9ahfEqGii2FkQ9pvZmG6HGe2hmbAT2wyM5hpn8Xh5dELysMcEz6hEsqmn6HdRdLOLZhC_fNaXzgA== +0 -0
  138. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~BwUq2xXQYuE8ya6HT6lfNsdtEjz5AKGf8GvLY6VBxQyIY1vgj_Gov-3NeM69OS66BQRDK0PG9H4Oyg0R48E4vg== +0 -0
  139. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~EkDVUR6dcnzxV_lYjkrJ5QGMVTCvb_upAoBF6DBu61sQkGvZN3fSRTsJ1XfJIZO-JUzdNoVA3D_CcvokL0gnQg== +0 -0
  140. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~FUkcLSJ8RAuPenM4HFG1R-sN5-cDBGcTxgR2jaVCna7xV0ZTyBHriB1Nn59mariNlJDiCoBtMUQEmauGxWtfBA== +0 -0
  141. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~FqsuZe4RVLOOVUYLTL-GTIohZ8TdSfxx7m2KJtLYFPGOdE4XorTX7Oc7kXbhghPRppXT3jW-slI37M34YNEvLQ== +0 -0
  142. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~G4F_NtyTj3i46fmKm0NorHAeq8tYWWYf6uv5yC1DwzdpWVoYbOPufmFNvdEbxZt4AMdV0gKx3HI46EAXNOQVFg== +0 -0
  143. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~GxetzGUNDgaBBXcTmLK6p9JBDX3I3QPshshbui1IaEWvJbQko-E36tCKwaJYHbleAWz9FqkAM_Tqx3YOmSVkVg== +0 -0
  144. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~H1Wjd5kKWDW4t3SDodxiHV72V8WT0xwPubw5cJTNLkPRLgaILFPh-dpy8EOUNgy1KzrDujFsm9EcTsbuqtMPLA== +0 -0
  145. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~JpI5MH4zCgebUHFpXVn4zjtsGtMNnO7BQZWfNARAB5UWa9gqz6YXHR3uLCJ_AvJ3lh53BUVkavsx9TY2FMmxbA== +0 -0
  146. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~JujNYkJtcux0Ni4QnR64zu4Wz_zYjyKvYaYZm5ypxTLPSzF3_jNE_NO4sdbDamF8wEqWoky1uf4ZE0JT3L607A== +0 -0
  147. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~KJSEA6DKnb2_FRPSqKZGh41eo-C8x448J9kEBrH012bUrZfOSDvrgmIrU0Vz7Ri3gaS9aKKmSaVMvXsHSlTJVA== +0 -0
  148. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~MStOwu3jBlJtcRnxrseVOuhI4kCj--ggFPG7sqrq5w1hjrI3bVyD-bm1Jwyx0noY3wT1rHDEvaGWnV2qsGjGwg== +0 -0
  149. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~McsJ8kFVf3IjhgXIRdw8Xx-EXgbV071bmlj2BBnk52xrWl3sEeiIyxwUsF7mIWvMRWfcFfu4VGHYyqfk2BeHXw== +0 -0
  150. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~NHt9fVe4kDdbxnglKcEwXaRK-WsYEOaD23Kbl8SJPRMYHr_Z6SJd_HmG3BROHHR_M6TgSmucONpDJdTj5tjuFw== +0 -0
  151. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~Nfo2iwCPcfAcOBIVyoUAK0-PIfr5qYxIKZt-uaSaTBdrTNxAuJ1ItmeDPZ3VdJJmxD_c22No7x482bdd3_yYtw== +0 -0
  152. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~S2Qlu11xBhEd5aGSzWsnw1TR8u8PiOF93GO0j5bfNoAFCVzxKOwhRFoIXba2EpQnLQqFdIKyhWN3l70A4GPHmg== +0 -0
  153. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~W7a7M37RO9jgck2zeR0471Pm7e8K0Kqj5tXEouDjvqKZXSrWxMaWD28oqkKKYAiU4608R4S9mM11KyphljdMSw== +0 -0
  154. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~XUo1oyPCrlL7CA74wG-OzQ06VOWJYWvHGFHU7keZN1SKaIXjHX5qi_kBzjG_rBCi89-S8GVmCy7S3PHSjG8SbQ== +0 -0
  155. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~Xh0VmDvFNMELHu08-vrs54pegVyUwwDRxx_nXkwyD0NjnYozyqcGAKAr_QWHmw6F8XyuWg51M9KGpJJIFzzGuw== +0 -0
  156. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~Xve-wMBp_lxVUgD9qH5GwieGP9cAWtm0xULZvdGjBRUMvaevmpCB5gnbMBuIXAO6a1c9v6WUq0jNVX7ut5HvOw== +0 -0
  157. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~ZU1XkZFgnEE22CXEF-pOlcj5f10x-KM1Vw9d4IOLu-NiTZcz7koYPixhdrB1PJr8J-h9NpJmfqEastfxamA1jQ== +0 -0
  158. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~_YkNYEHTsbbtFILJpzH3HenH0t4ShI25dIMdve541CF5bl-jPF3X3F7tq-t5dvP0TEkATsOJdLQdBp1xv4Q-ag== +0 -0
  159. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~boy6mpn2jkwm60jjgQ0TG25UqRdN46LzmgTVCrpy6nBOgkLCGkGHcbceiwjU1itS_vj3-iQX0ZnrWOQrPyfHNA== +0 -0
  160. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~bwzpVZ9hAqGDHhXs2FRA82dfGfLmc7-m0uQhZDDfHHO7hQ17M_Np341BZX4WDLhYYS4cdUgaDodlNpdfpG3nXw== +0 -0
  161. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~cBxe-9PpAGFdAsYkmdN3lJVqEliLcRYlyoAov0aPZfJGwUr_cOm3XpjO7nmf_2eLf8UAx-rycjnJzw07xLrNCA== +0 -0
  162. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~dirWk6W4Pav1oyciuflfJlRu0iuxbYOmrpQapOJ0mV9C1SQ-jvDRv_7h753Cy18-SwULARUdWsyUy3yNNvxF7w== +0 -0
  163. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~ebwZVjSEHroc9jtIm4jd_h_YAqEBcOkAZ4HPNJT8pLCldjRcTq-obQLakxXOhfuoOBlYBoZLuO-Y0lskeZRYKw== +0 -0
  164. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~gfcRcmRIr0h09d0jiZsA7nUeQv2XtapxuYEXZy1Z9um0tTJQvz-O5ef5f7zhLenLvjnDtDtlY_aY4Hvpce6e1Q== +0 -0
  165. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~hgOgiVCyv2R0W-f0qKw5xYPeUwj8_ccCM9vKH_7vAQcCO9t8BwR1APGRBv20AONmp-PYMXmtgsBlQkNBRBpdQA== +0 -0
  166. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~hrhCl-YRAAr8ByNB_LCgEBsVNHMp92gTIUknetpUHMjcXl4Hpn_uY-h6C45oga0ZALnfGCo6iKTmiPLa4Qvnpg== +0 -0
  167. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~n2yoR7JsyL4DSUwmjnpE4Iq9Qi_eeZrmpPU8cdehDFKfESK7nwxXxfrSMQbk0BQ2lgGPadoRcd1-qr1xVz97jA== +0 -0
  168. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~nMCcZm8WvPogyO_nuJ926Q3Q2dqVMN2LdjEL1Kq2wJ_RG-rH-e_6v41l1xZbCsQTa3XykQdEiXNc0HtAvT6IRA== +0 -0
  169. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~oc3C7xkUt-OWDL6rrsxs-seS4Fu1bqBWAAXCHalgShaGg9MUrOiRbHT2DcAnhyQFKx6x5FRbvjmYoQWrQiXJZA== +0 -0
  170. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~p-ihj7SEgkDXpMu9hvKE_wiX9cvtwyXrdIn964BfedXHKGpC6o7mMPxEyC0kRPVi_EZs_MRV5bAPEpl5h5we0g== +0 -0
  171. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~qlhO_D9oE8uSKH-mZqyRF9pp4Zv1Tv0dIYcqrH4hb1VWlIxcdxmg2j0M8496cQeFXC5bn_JMXdBlD-d6cnFF8w== +0 -0
  172. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~tjpiyIxJR_boTdUNrtFDuKIZoY84fI4lA1oMJbq9e2ZmYKIK5FeRN2O8cV_yMOYJGr4lbv03kTmT70mCjUc2_Q== +0 -0
  173. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~wULeoj18eEKJWAKx1uFQVwS48cUGFcYPRJQj1Ro5XNJsWCwppGSCdIPhwifD6Z2f_j3zfI2SmC2Gg81sBXXW7g== +0 -0
  174. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~zrEihMys4NVV5rx6FmuzEGO2TjloI3OiC7yzIhvqYoRo43ibb2F-Km6Jf4NX-ac62pOLBYZRcjQTvYMpn75_oA== +0 -0
  175. package/Tests/Artifacts/LottieTests.xcresult/Info.plist +0 -29
  176. package/Tests/Samples/9squares_AlBoardman.json +0 -1
  177. package/Tests/Samples/Boat_Loader.json +0 -1
  178. package/Tests/Samples/HamburgerArrow.json +0 -1
  179. package/Tests/Samples/IconTransitions.json +0 -1
  180. package/Tests/Samples/Images/dog.png +0 -0
  181. package/Tests/Samples/Issues/issue_1403.json +0 -1
  182. package/Tests/Samples/Issues/issue_1407.json +0 -1
  183. package/Tests/Samples/Issues/issue_1488.json +0 -1
  184. package/Tests/Samples/Issues/issue_1505.json +0 -1
  185. package/Tests/Samples/Issues/issue_1628.json +0 -1
  186. package/Tests/Samples/Issues/pr_1536.json +0 -1
  187. package/Tests/Samples/Issues/pr_1563.json +0 -8439
  188. package/Tests/Samples/Issues/pr_1592.json +0 -5527
  189. package/Tests/Samples/Issues/pr_1599.json +0 -738
  190. package/Tests/Samples/Issues/pr_1604_1.json +0 -1
  191. package/Tests/Samples/Issues/pr_1604_2.json +0 -1
  192. package/Tests/Samples/LottieFiles/LICENSE.md +0 -14
  193. package/Tests/Samples/LottieFiles/bounce_strokes.json +0 -1
  194. package/Tests/Samples/LottieFiles/cactus.json +0 -1
  195. package/Tests/Samples/LottieFiles/dog_car_ride.json +0 -1
  196. package/Tests/Samples/LottieFiles/draft_icon.json +0 -1
  197. package/Tests/Samples/LottieFiles/gradient_1.json +0 -1
  198. package/Tests/Samples/LottieFiles/gradient_2.json +0 -1
  199. package/Tests/Samples/LottieFiles/gradient_pill.json +0 -1
  200. package/Tests/Samples/LottieFiles/gradient_shapes.json +0 -1
  201. package/Tests/Samples/LottieFiles/gradient_square.json +0 -1
  202. package/Tests/Samples/LottieFiles/growth.json +0 -1
  203. package/Tests/Samples/LottieFiles/infinity_loader.json +0 -1
  204. package/Tests/Samples/LottieFiles/loading_dots_1.json +0 -1
  205. package/Tests/Samples/LottieFiles/loading_dots_2.json +0 -1
  206. package/Tests/Samples/LottieFiles/loading_dots_3.json +0 -1
  207. package/Tests/Samples/LottieFiles/loading_gradient_strokes.json +0 -1
  208. package/Tests/Samples/LottieFiles/settings_slider.json +0 -1
  209. package/Tests/Samples/LottieFiles/shop.json +0 -1
  210. package/Tests/Samples/LottieFiles/step_loader.json +0 -1
  211. package/Tests/Samples/LottieLogo1.json +0 -1
  212. package/Tests/Samples/LottieLogo1_masked.json +0 -1
  213. package/Tests/Samples/LottieLogo2.json +0 -1
  214. package/Tests/Samples/MotionCorpse_Jrcanest.json +0 -1
  215. package/Tests/Samples/Nonanimating/BasicLayers.json +0 -1
  216. package/Tests/Samples/Nonanimating/DisableNodesTest.json +0 -1
  217. package/Tests/Samples/Nonanimating/FirstText.json +0 -1
  218. package/Tests/Samples/Nonanimating/GeometryTransformTest.json +0 -1
  219. package/Tests/Samples/Nonanimating/Text_AnimatedProperties.json +0 -1
  220. package/Tests/Samples/Nonanimating/Text_Glyph.json +0 -1
  221. package/Tests/Samples/Nonanimating/Text_NoAnimation.json +0 -1
  222. package/Tests/Samples/Nonanimating/Text_NoGlyph.json +0 -1
  223. package/Tests/Samples/Nonanimating/Zoom.json +0 -1
  224. package/Tests/Samples/Nonanimating/_dog.json +0 -1
  225. package/Tests/Samples/Nonanimating/base64Test.json +0 -1
  226. package/Tests/Samples/Nonanimating/blend_mode_test.json +0 -1
  227. package/Tests/Samples/Nonanimating/keypathTest.json +0 -1
  228. package/Tests/Samples/Nonanimating/verifyLineHeight.json +0 -1
  229. package/Tests/Samples/PinJump.json +0 -1
  230. package/Tests/Samples/Private/BrokenLottieFiles/growth_man.json +0 -874
  231. package/Tests/Samples/Private/BrokenLottieFiles/rocket.json +0 -1
  232. package/Tests/Samples/Private/China_EmptyState_Itinerary.json +0 -1
  233. package/Tests/Samples/Private/LoaderHourglass.json +0 -12070
  234. package/Tests/Samples/Private/README.md +0 -7
  235. package/Tests/Samples/Private/Urgency/alarm_animated.json +0 -1
  236. package/Tests/Samples/Private/Urgency/diamond_animated.json +0 -1
  237. package/Tests/Samples/Private/Urgency/eye_animated.json +0 -1
  238. package/Tests/Samples/Private/Urgency/light_bulb_animated.json +0 -1
  239. package/Tests/Samples/Private/Urgency/light_bulb_static.json +0 -1
  240. package/Tests/Samples/Private/Urgency/piggy_bank_static.json +0 -1
  241. package/Tests/Samples/Private/Urgency/price_tag_legacy.json +0 -1
  242. package/Tests/Samples/Private/Urgency/rausch_alarm.json +0 -1
  243. package/Tests/Samples/Private/Urgency/rausch_alert.json +0 -1
  244. package/Tests/Samples/Private/Urgency/rausch_clock.json +0 -1
  245. package/Tests/Samples/Private/Urgency/rausch_diamond.json +0 -1
  246. package/Tests/Samples/Private/Urgency/rausch_money.json +0 -1
  247. package/Tests/Samples/Private/Urgency/rausch_piggy_bank.json +0 -1
  248. package/Tests/Samples/Private/Urgency/rausch_tag.json +0 -1
  249. package/Tests/Samples/Private/Urgency/red_envelope_animated.json +0 -1
  250. package/Tests/Samples/Private/Urgency/tag_animated.json +0 -1
  251. package/Tests/Samples/Private/Urgency/trophy_animated.json +0 -1
  252. package/Tests/Samples/Private/Urgency/wings_key_animated.json +0 -1
  253. package/Tests/Samples/Private/_flexible.json +0 -1
  254. package/Tests/Samples/Private/aircover.json +0 -1
  255. package/Tests/Samples/Private/belo_spin_rausch.json +0 -1
  256. package/Tests/Samples/Private/celebration.json +0 -2821
  257. package/Tests/Samples/Private/checkbox.json +0 -1
  258. package/Tests/Samples/Private/checkbox_small.json +0 -1
  259. package/Tests/Samples/Private/getting_your_trip_ready.json +0 -3540
  260. package/Tests/Samples/Private/gradient_afternoon.json +0 -1
  261. package/Tests/Samples/Private/gradient_brand.json +0 -1
  262. package/Tests/Samples/Private/gradient_evening.json +0 -1
  263. package/Tests/Samples/Private/gradient_morning.json +0 -1
  264. package/Tests/Samples/Private/issue_1467.json +0 -1
  265. package/Tests/Samples/Private/loading_dots.json +0 -1
  266. package/Tests/Samples/Private/loading_dots_small.json +0 -1
  267. package/Tests/Samples/Private/payment_loader.json +0 -1
  268. package/Tests/Samples/Private/radio_button.json +0 -1
  269. package/Tests/Samples/Private/selfie_intro.json +0 -1
  270. package/Tests/Samples/Private/stepper_add.json +0 -1
  271. package/Tests/Samples/Private/stepper_subtract.json +0 -1
  272. package/Tests/Samples/Private/switch.json +0 -1
  273. package/Tests/Samples/Private/thumb.json +0 -1
  274. package/Tests/Samples/Private/toggle_no.json +0 -1
  275. package/Tests/Samples/Private/toggle_yes.json +0 -1
  276. package/Tests/Samples/Private/user_error_black_and_white.json +0 -1
  277. package/Tests/Samples/Private/user_error_cut_off.json +0 -1
  278. package/Tests/Samples/Switch.json +0 -1
  279. package/Tests/Samples/Switch_States.json +0 -1
  280. package/Tests/Samples/TwitterHeart.json +0 -1
  281. package/Tests/Samples/TwitterHeartButton.json +0 -1
  282. package/Tests/Samples/TypeFace/A.json +0 -1
  283. package/Tests/Samples/TypeFace/Apostrophe.json +0 -1
  284. package/Tests/Samples/TypeFace/B.json +0 -1
  285. package/Tests/Samples/TypeFace/BlinkingCursor.json +0 -1
  286. package/Tests/Samples/TypeFace/C.json +0 -1
  287. package/Tests/Samples/TypeFace/Colon.json +0 -1
  288. package/Tests/Samples/TypeFace/Comma.json +0 -1
  289. package/Tests/Samples/TypeFace/D.json +0 -1
  290. package/Tests/Samples/TypeFace/E.json +0 -1
  291. package/Tests/Samples/TypeFace/F.json +0 -1
  292. package/Tests/Samples/TypeFace/G.json +0 -1
  293. package/Tests/Samples/TypeFace/H.json +0 -1
  294. package/Tests/Samples/TypeFace/I.json +0 -1
  295. package/Tests/Samples/TypeFace/J.json +0 -1
  296. package/Tests/Samples/TypeFace/K.json +0 -1
  297. package/Tests/Samples/TypeFace/L.json +0 -1
  298. package/Tests/Samples/TypeFace/M.json +0 -1
  299. package/Tests/Samples/TypeFace/N.json +0 -1
  300. package/Tests/Samples/TypeFace/O.json +0 -1
  301. package/Tests/Samples/TypeFace/P.json +0 -1
  302. package/Tests/Samples/TypeFace/Q.json +0 -1
  303. package/Tests/Samples/TypeFace/R.json +0 -1
  304. package/Tests/Samples/TypeFace/S.json +0 -1
  305. package/Tests/Samples/TypeFace/T.json +0 -1
  306. package/Tests/Samples/TypeFace/U.json +0 -1
  307. package/Tests/Samples/TypeFace/V.json +0 -1
  308. package/Tests/Samples/TypeFace/W.json +0 -1
  309. package/Tests/Samples/TypeFace/X.json +0 -1
  310. package/Tests/Samples/TypeFace/Y.json +0 -1
  311. package/Tests/Samples/TypeFace/Z.json +0 -1
  312. package/Tests/Samples/Watermelon.json +0 -1
  313. package/Tests/Samples/setValueTest.json +0 -1
  314. package/Tests/Samples/timeremap.json +0 -1
  315. package/Tests/Samples/vcTransition1.json +0 -1
  316. package/Tests/Samples/vcTransition2.json +0 -1
  317. package/script/lint/airbnb.swiftformat +0 -68
  318. package/script/lint/swiftlint.yml +0 -38
  319. package/script/test-carthage/Carthage/Build/.lottie-ios.version +0 -19
  320. package/script/test-carthage/Carthage/Build/Lottie.xcframework/Info.plist +0 -46
  321. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/BCSymbolMaps/BF971162-BE99-3507-B5B3-11947DC6B176.bcsymbolmap +0 -14778
  322. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/Lottie.framework/Headers/Lottie-Swift.h +0 -673
  323. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/Lottie.framework/Info.plist +0 -0
  324. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/Lottie.framework/Lottie +0 -0
  325. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/Lottie.framework/Modules/Lottie.swiftmodule/arm64-apple-ios.swiftdoc +0 -0
  326. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/Lottie.framework/Modules/Lottie.swiftmodule/arm64-apple-ios.swiftmodule +0 -0
  327. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/Lottie.framework/Modules/Lottie.swiftmodule/arm64.swiftdoc +0 -0
  328. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/Lottie.framework/Modules/Lottie.swiftmodule/arm64.swiftmodule +0 -0
  329. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/Lottie.framework/Modules/module.modulemap +0 -4
  330. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/dSYMs/Lottie.framework.dSYM/Contents/Info.plist +0 -20
  331. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/dSYMs/Lottie.framework.dSYM/Contents/Resources/DWARF/Lottie +0 -0
  332. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Headers/Lottie-Swift.h +0 -1352
  333. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Info.plist +0 -0
  334. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Lottie +0 -0
  335. 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
  336. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/Lottie.swiftmodule/Project/arm64.swiftsourceinfo +0 -0
  337. 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
  338. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/Lottie.swiftmodule/Project/x86_64.swiftsourceinfo +0 -0
  339. 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
  340. 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
  341. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/Lottie.swiftmodule/arm64.swiftdoc +0 -0
  342. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/Lottie.swiftmodule/arm64.swiftmodule +0 -0
  343. 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
  344. 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
  345. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/Lottie.swiftmodule/x86_64.swiftdoc +0 -0
  346. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/Lottie.swiftmodule/x86_64.swiftmodule +0 -0
  347. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/module.modulemap +0 -4
  348. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/_CodeSignature/CodeResources +0 -256
  349. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/dSYMs/Lottie.framework.dSYM/Contents/Info.plist +0 -20
  350. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/dSYMs/Lottie.framework.dSYM/Contents/Resources/DWARF/Lottie +0 -0
  351. package/script/test-carthage/Carthage/Checkouts/lottie-ios/Lottie.xcodeproj/project.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  352. package/script/test-carthage/Carthage/Checkouts/lottie-ios/Lottie.xcodeproj/xcuserdata/cal.xcuserdatad/xcschemes/xcschememanagement.plist +0 -37
  353. 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
- add(defaultAnimation, timedWith: context)
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
- -> CAPropertyAnimation?
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
- let keyframeValue = try keyframeValueMapping(keyframes[0].value)
56
-
57
- // If the keyframe value is the same as the layer's default value for this property,
58
- // then we can just ignore this set of keyframes.
59
- if keyframeValue == property.defaultValue {
60
- return nil
61
- }
56
+ return singleKeyframeAnimation(
57
+ for: property,
58
+ keyframeValue: try keyframeValueMapping(keyframes[0].value),
59
+ writeDirectlyToPropertyIfPossible: true)
60
+ }
62
61
 
63
- // If the property on the CALayer being animated hasn't been modified from the default yet,
64
- // then we can apply the keyframe value directly to the layer using KVC instead
65
- // of creating a `CAAnimation`.
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
- // Otherwise, we still need to create a `CAAnimation`, but we can
75
- // create a simple `CABasicAnimation` that is still less expensive
76
- // than computing a `CAKeyframeAnimation`.
77
- let animation = CABasicAnimation(keyPath: property.caLayerKeypath)
78
- animation.fromValue = keyframeValue
79
- animation.toValue = keyframeValue
80
- return animation
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 CAKeyframeAnimation for these instead of
110
- // letting `defaultAnimation(...)` try to apply the value using KVC.
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 `CAKeyframeAnimation` for the given keyframes
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: ContiguousArray<Keyframe<KeyframeValue>>,
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 = try self.calculationMode(for: keyframes, context: context)
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: ContiguousArray<Keyframe<KeyframeValue>>,
177
- context: LayerAnimationContext)
178
- throws
279
+ for keyframes: [Keyframe<KeyframeValue>])
179
280
  -> CAAnimationCalculationMode
180
281
  {
181
- // Animations using `isHold` should use `CAAnimationCalculationMode.discrete`
182
- //
183
- // - Since we currently only create a single `CAKeyframeAnimation`,
184
- // we can currently only correctly support animations where
185
- // `isHold` is either always `true` or always `false`
186
- // (this requirement doesn't apply to the first/last keyframes).
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: ContiguousArray<Keyframe<KeyframeValue>>)
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: ContiguousArray<Keyframe<KeyframeValue>>,
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
- func addGradientAnimations(for gradient: GradientShapeItem, context: LayerAnimationContext) throws {
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
- try gradient.colorConfiguration(from: colorComponents, context: context).map { $0.color }
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
- try gradient.colorConfiguration(from: colorComponents, context: context).map { $0.location }
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
- context: LayerAnimationContext) throws
125
- -> [(color: CGColor, location: CGFloat)]
168
+ type: GradientContentType)
169
+ -> GradientColorConfiguration
126
170
  {
127
- precondition(
128
- colorComponents.count >= numberOfColors * 4,
129
- "Each color must have RGB components and a location component")
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
- var cgColors = [(color: CGColor, location: CGFloat)]()
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
- // Each group of four `Double` values represents a single `CGColor`,
134
- // and its relative location within the gradient.
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
- let colorLocation = CGFloat(colorComponents[colorStartIndex])
184
+ let colorLocation = CGFloat(colorComponents[colorStartIndex])
139
185
 
140
- // Alpha values aren't stored contiguously with the RGB color components,
141
- // but are instead optionally listed at the end of the array
142
- var alpha = 1.0
143
- let alphaIndex = (numberOfColors * 4) + (colorIndex * 2)
144
- if alphaIndex < colorComponents.count {
145
- let alphaLocation = CGFloat(colorComponents[alphaIndex])
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
- let color = CGColor.rgba(
157
- CGFloat(colorComponents[colorStartIndex + 1]),
158
- CGFloat(colorComponents[colorStartIndex + 2]),
159
- CGFloat(colorComponents[colorStartIndex + 3]),
160
- CGFloat(alpha))
194
+ return colors
161
195
 
162
- cgColors.append((color, colorLocation))
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
- return cgColors
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