lottie-ios 3.4.0 → 3.4.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (394) hide show
  1. package/.github/workflows/main.yml +10 -7
  2. package/.github/workflows/stale_issues.yml +17 -0
  3. package/.swiftpm/xcode/package.xcworkspace/xcuserdata/calstephens.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  4. package/Lottie.xcodeproj/project.pbxproj +33 -21
  5. package/Lottie.xcodeproj/xcshareddata/xcschemes/Lottie (macOS).xcscheme +2 -2
  6. package/Lottie.xcworkspace/xcuserdata/calstephens.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  7. package/Lottie.xcworkspace/xcuserdata/calstephens.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +5 -6
  8. package/Lottie.xcworkspace/xcuserdata/calstephens.xcuserdatad/xcdebugger/Expressions.xcexplist +114 -1
  9. package/Lottie.xcworkspace/xcuserdata/calstephens.xcuserdatad/xcschemes/xcschememanagement.plist +30 -0
  10. package/Package.swift +1 -1
  11. package/README.md +5 -6
  12. package/Rakefile +52 -17
  13. package/Sources/Private/CoreAnimation/Animations/CAAnimation+TimingConfiguration.swift +7 -2
  14. package/Sources/Private/CoreAnimation/Animations/CALayer+addAnimation.swift +192 -67
  15. package/Sources/Private/CoreAnimation/Animations/CombinedShapeAnimation.swift +28 -0
  16. package/Sources/Private/CoreAnimation/Animations/EllipseAnimation.swift +31 -4
  17. package/Sources/Private/CoreAnimation/Animations/GradientAnimations.swift +98 -43
  18. package/Sources/Private/CoreAnimation/Animations/LayerProperty.swift +19 -19
  19. package/Sources/Private/CoreAnimation/Animations/RectangleAnimation.swift +34 -7
  20. package/Sources/Private/CoreAnimation/Animations/ShapeAnimation.swift +25 -14
  21. package/Sources/Private/CoreAnimation/Animations/StarAnimation.swift +61 -32
  22. package/Sources/Private/CoreAnimation/Animations/StrokeAnimation.swift +6 -2
  23. package/Sources/Private/CoreAnimation/CoreAnimationLayer.swift +29 -11
  24. package/Sources/Private/CoreAnimation/Extensions/KeyframeGroup+exactlyOneKeyframe.swift +2 -2
  25. package/Sources/Private/CoreAnimation/Extensions/Keyframes+combinedIfPossible.swift +116 -23
  26. package/Sources/Private/CoreAnimation/Layers/AnimationLayer.swift +9 -0
  27. package/Sources/Private/CoreAnimation/Layers/BaseCompositionLayer.swift +2 -1
  28. package/Sources/Private/CoreAnimation/Layers/CALayer+setupLayerHierarchy.swift +48 -12
  29. package/Sources/Private/CoreAnimation/Layers/GradientRenderLayer.swift +10 -3
  30. package/Sources/Private/CoreAnimation/Layers/LayerModel+makeAnimationLayer.swift +5 -0
  31. package/Sources/Private/CoreAnimation/Layers/MaskCompositionLayer.swift +1 -1
  32. package/Sources/Private/CoreAnimation/Layers/PreCompLayer.swift +2 -2
  33. package/Sources/Private/CoreAnimation/Layers/RepeaterLayer.swift +85 -0
  34. package/Sources/Private/CoreAnimation/Layers/ShapeItemLayer.swift +94 -38
  35. package/Sources/Private/CoreAnimation/Layers/ShapeLayer.swift +131 -46
  36. package/Sources/Private/CoreAnimation/Layers/TextLayer.swift +16 -2
  37. package/Sources/Private/MainThread/LayerContainers/CompLayers/CompositionLayer.swift +1 -1
  38. package/Sources/Private/MainThread/LayerContainers/CompLayers/MaskContainerLayer.swift +0 -2
  39. package/Sources/Private/MainThread/LayerContainers/CompLayers/PreCompositionLayer.swift +2 -2
  40. package/Sources/Private/MainThread/LayerContainers/MainThreadAnimationLayer.swift +1 -2
  41. package/Sources/Private/MainThread/LayerContainers/Utility/CoreTextRenderLayer.swift +30 -1
  42. package/Sources/Private/MainThread/LayerContainers/Utility/InvertedMatteLayer.swift +1 -0
  43. package/Sources/Private/MainThread/LayerContainers/Utility/LayerTransformNode.swift +0 -1
  44. package/Sources/Private/MainThread/NodeRenderSystem/Extensions/ItemsExtension.swift +5 -2
  45. package/Sources/Private/MainThread/NodeRenderSystem/Nodes/ModifierNodes/TrimPathNode.swift +4 -7
  46. package/Sources/Private/MainThread/NodeRenderSystem/Nodes/OutputNodes/Renderables/GradientFillRenderer.swift +5 -0
  47. package/Sources/Private/MainThread/NodeRenderSystem/Nodes/OutputNodes/Renderables/GradientStrokeRenderer.swift +1 -2
  48. package/Sources/Private/MainThread/NodeRenderSystem/Nodes/OutputNodes/Renderables/LegacyGradientFillRenderer.swift +1 -1
  49. package/Sources/Private/MainThread/NodeRenderSystem/Nodes/OutputNodes/Renderables/StrokeRenderer.swift +1 -1
  50. package/Sources/Private/MainThread/NodeRenderSystem/Nodes/PathNodes/RectNode.swift +1 -1
  51. package/Sources/Private/MainThread/NodeRenderSystem/Nodes/PathNodes/StarNode.swift +3 -3
  52. package/Sources/Private/MainThread/NodeRenderSystem/Nodes/RenderNodes/GradientFillNode.swift +3 -0
  53. package/Sources/Private/MainThread/NodeRenderSystem/Nodes/RenderNodes/GradientStrokeNode.swift +1 -1
  54. package/Sources/Private/MainThread/NodeRenderSystem/Nodes/RenderNodes/StrokeNode.swift +28 -1
  55. package/Sources/Private/MainThread/NodeRenderSystem/RenderLayers/ShapeContainerLayer.swift +1 -1
  56. package/Sources/Private/MainThread/NodeRenderSystem/RenderLayers/ShapeRenderLayer.swift +0 -1
  57. package/Sources/Private/Model/Animation.swift +4 -4
  58. package/Sources/Private/Model/Keyframes/KeyframeGroup.swift +25 -0
  59. package/Sources/Private/Model/ShapeItems/Ellipse.swift +0 -1
  60. package/Sources/Private/Model/ShapeItems/Fill.swift +1 -1
  61. package/Sources/Private/Model/ShapeItems/GradientFill.swift +14 -1
  62. package/Sources/Private/Model/ShapeItems/GradientStroke.swift +0 -1
  63. package/Sources/Private/Model/ShapeItems/Group.swift +6 -1
  64. package/Sources/Private/Model/ShapeItems/Merge.swift +0 -1
  65. package/Sources/Private/Model/ShapeItems/Rectangle.swift +0 -1
  66. package/Sources/Private/Model/ShapeItems/Repeater.swift +0 -1
  67. package/Sources/Private/Model/ShapeItems/ShapeTransform.swift +0 -1
  68. package/Sources/Private/Model/ShapeItems/Star.swift +0 -1
  69. package/Sources/Private/Model/ShapeItems/Stroke.swift +0 -1
  70. package/Sources/Private/Model/ShapeItems/Trim.swift +0 -1
  71. package/Sources/Private/Model/Text/TextAnimator.swift +0 -1
  72. package/Sources/Private/Utility/Debugging/LayerDebugging.swift +1 -2
  73. package/Sources/Private/Utility/Extensions/MathKit.swift +1 -2
  74. package/Sources/Private/Utility/Extensions/StringExtensions.swift +0 -1
  75. package/Sources/Private/Utility/Interpolatable/InterpolatableExtensions.swift +0 -1
  76. package/Sources/Private/{MainThread/NodeRenderSystem/NodeProperties/ValueProviders → Utility/Interpolatable}/KeyframeInterpolator.swift +1 -4
  77. package/Sources/Private/Utility/Primitives/BezierPath.swift +1 -2
  78. package/Sources/Private/Utility/Primitives/CurveVertex.swift +2 -4
  79. package/Sources/Public/Animation/AnimationPublic.swift +2 -4
  80. package/Sources/Public/Animation/AnimationView.swift +29 -7
  81. package/Sources/Public/Animation/AnimationViewInitializers.swift +13 -11
  82. package/Sources/Public/DynamicProperties/ValueProviders/GradientValueProvider.swift +0 -2
  83. package/Sources/Public/FontProvider/AnimationFontProvider.swift +1 -1
  84. package/Sources/Public/Logging/LottieLogger.swift +15 -2
  85. package/Sources/Public/TextProvider/AnimationTextProvider.swift +1 -1
  86. package/Sources/Public/iOS/AnimatedButton.swift +10 -4
  87. package/Sources/Public/iOS/AnimatedControl.swift +3 -5
  88. package/Sources/Public/iOS/AnimatedSwitch.swift +9 -6
  89. package/Sources/Public/iOS/BundleImageProvider.swift +2 -3
  90. package/Sources/Public/iOS/FilepathImageProvider.swift +1 -2
  91. package/Sources/Public/macOS/BundleImageProvider.macOS.swift +1 -2
  92. package/Sources/Public/macOS/FilepathImageProvider.macOS.swift +1 -3
  93. package/Tests/AnimationKeypathTests.swift +10 -1
  94. package/Tests/AutomaticEngineTests.swift +1 -0
  95. package/Tests/ParsingTests.swift +2 -1
  96. package/Tests/PerformanceTests.swift +28 -29
  97. package/Tests/SnapshotConfiguration.swift +19 -0
  98. package/Tests/SnapshotTests.swift +4 -0
  99. package/Tests/Utils/HardcodedTextProvider.swift +27 -0
  100. package/lottie-ios.podspec +2 -2
  101. package/package.json +1 -1
  102. package/script/test-carthage/CarthageTest/AppDelegate.swift +6 -7
  103. package/script/test-carthage/CarthageTest/ViewController.swift +1 -1
  104. package/script/test-carthage/CarthageTest-macOS/AppDelegate.swift +7 -0
  105. package/script/test-carthage/CarthageTest-macOS/Assets.xcassets/AccentColor.colorset/Contents.json +11 -0
  106. package/script/test-carthage/CarthageTest-macOS/Assets.xcassets/AppIcon.appiconset/Contents.json +58 -0
  107. package/script/test-carthage/CarthageTest-macOS/Assets.xcassets/Contents.json +6 -0
  108. package/script/test-carthage/CarthageTest-macOS/Base.lproj/Main.storyboard +717 -0
  109. package/script/test-carthage/CarthageTest-macOS/CarthageTest_macOS.entitlements +10 -0
  110. package/script/test-carthage/CarthageTest-macOS/ViewController.swift +15 -0
  111. package/script/test-carthage/CarthageTest.xcodeproj/project.pbxproj +159 -5
  112. package/script/test-carthage/CarthageTest.xcodeproj/project.xcworkspace/xcuserdata/calstephens.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  113. package/script/test-carthage/CarthageTest.xcodeproj/xcuserdata/calstephens.xcuserdatad/xcschemes/xcschememanagement.plist +19 -0
  114. package/Lottie.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +0 -23
  115. package/Mintfile +0 -3
  116. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~-7Vi1RszY1XYnR2CCkEwIpKG8NwwA9zsZEz_WD7Dv6kKh4RC7N7ob8NIRVHGUJKp7eXxlpeI_gzD87Pcs_2u0g== +0 -0
  117. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~-SKV2drO-SFlrlh-wrzECDMkUSr-aF1lV9h-5onOy94zSTsD-oI45s0-KpOK45L-kq3hRY7v9vm-xmh00_eheg== +0 -0
  118. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~-_CU_vuaiFfObSeDFfmp7GuB20ThMSAL-P_RUMowiQLbdu-y0bU9upIm3q8g6XmXUG5hP6J1az0Ma5Hi_rhhRg== +0 -0
  119. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~03aPYP6VHJjZj5DlphGarj0xdw43qu09Onx5SReZoPvg9zh5uL212E-KWfGct9jf6JG0JFV2tdbBi7X_8bH9aw== +0 -0
  120. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~1Z82GPBBPc1VLvn4O7V5glb6lgyXteNlDREUzV_TPymM4ra4UkBMklzV90lEqoYRCDuRVzaQHaDYbmYp3-8CFw== +0 -0
  121. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~1mFDCboXpUu9pSHAiVGr1O_QgqEEtvJp_LUhickxLZo0Z5pj3fvadn1l2MzEOd4bFsVBZifUvcyPa7dzlMWF-A== +0 -0
  122. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~2_L9PUjv2JDKu1n8bDLb4XLB-yex6ZVjDDMwfuKAr7teDw-SKgLgkW6H-m_gjWChIVdB4vW6yvHP7XJxvXtRNA== +0 -0
  123. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~4VqMqsI5lOfxRppnud6-VDWcNsU8J7VgFCJfW2dXPwOcAkvU-I8Um5yp9n0Zv6nr3VmcxYggaVMDFfR0U_vjKw== +0 -1
  124. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~4krT4ZMzDOu34msFUq0Xod142kw4pAeSWX4JSxlsjOI0Wanu3343qeespgFi61MTWq1DdH9XXspVKqGlGm_fyw== +0 -0
  125. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~5_aJsdP-e3dRTAUnH-y1U2plaCuUi1vyHriaZuNK0xFe8wGl9Qft6uLCX2Qt6CRBKJQluEe9o0uRWw1eb42FHQ== +0 -0
  126. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~8b0bSqV7eND54zvHvu1v2Htpm7yn-BOEFw5d3mITJrXWNykJ5BTR9WbrD80JEctNcT-rDqO2xfrQk1tFWeY6Sw== +0 -0
  127. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~9u8KAGpgtSm-mQ12Py8RZUbYbDlBhM3w1I2MQO53K2CSn6IePp7g65DBcdXTYMfG1bgoJ-6x30fjnGe-2UYsDQ== +0 -0
  128. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~Bw7uMs4wqB9ahfEqGii2FkQ9pvZmG6HGe2hmbAT2wyM5hpn8Xh5dELysMcEz6hEsqmn6HdRdLOLZhC_fNaXzgA== +0 -0
  129. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~BwUq2xXQYuE8ya6HT6lfNsdtEjz5AKGf8GvLY6VBxQyIY1vgj_Gov-3NeM69OS66BQRDK0PG9H4Oyg0R48E4vg== +0 -0
  130. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~EkDVUR6dcnzxV_lYjkrJ5QGMVTCvb_upAoBF6DBu61sQkGvZN3fSRTsJ1XfJIZO-JUzdNoVA3D_CcvokL0gnQg== +0 -0
  131. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~FUkcLSJ8RAuPenM4HFG1R-sN5-cDBGcTxgR2jaVCna7xV0ZTyBHriB1Nn59mariNlJDiCoBtMUQEmauGxWtfBA== +0 -0
  132. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~FqsuZe4RVLOOVUYLTL-GTIohZ8TdSfxx7m2KJtLYFPGOdE4XorTX7Oc7kXbhghPRppXT3jW-slI37M34YNEvLQ== +0 -0
  133. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~G4F_NtyTj3i46fmKm0NorHAeq8tYWWYf6uv5yC1DwzdpWVoYbOPufmFNvdEbxZt4AMdV0gKx3HI46EAXNOQVFg== +0 -0
  134. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~GxetzGUNDgaBBXcTmLK6p9JBDX3I3QPshshbui1IaEWvJbQko-E36tCKwaJYHbleAWz9FqkAM_Tqx3YOmSVkVg== +0 -0
  135. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~H1Wjd5kKWDW4t3SDodxiHV72V8WT0xwPubw5cJTNLkPRLgaILFPh-dpy8EOUNgy1KzrDujFsm9EcTsbuqtMPLA== +0 -0
  136. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~JpI5MH4zCgebUHFpXVn4zjtsGtMNnO7BQZWfNARAB5UWa9gqz6YXHR3uLCJ_AvJ3lh53BUVkavsx9TY2FMmxbA== +0 -0
  137. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~JujNYkJtcux0Ni4QnR64zu4Wz_zYjyKvYaYZm5ypxTLPSzF3_jNE_NO4sdbDamF8wEqWoky1uf4ZE0JT3L607A== +0 -0
  138. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~KJSEA6DKnb2_FRPSqKZGh41eo-C8x448J9kEBrH012bUrZfOSDvrgmIrU0Vz7Ri3gaS9aKKmSaVMvXsHSlTJVA== +0 -0
  139. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~MStOwu3jBlJtcRnxrseVOuhI4kCj--ggFPG7sqrq5w1hjrI3bVyD-bm1Jwyx0noY3wT1rHDEvaGWnV2qsGjGwg== +0 -0
  140. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~McsJ8kFVf3IjhgXIRdw8Xx-EXgbV071bmlj2BBnk52xrWl3sEeiIyxwUsF7mIWvMRWfcFfu4VGHYyqfk2BeHXw== +0 -0
  141. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~NHt9fVe4kDdbxnglKcEwXaRK-WsYEOaD23Kbl8SJPRMYHr_Z6SJd_HmG3BROHHR_M6TgSmucONpDJdTj5tjuFw== +0 -0
  142. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~Nfo2iwCPcfAcOBIVyoUAK0-PIfr5qYxIKZt-uaSaTBdrTNxAuJ1ItmeDPZ3VdJJmxD_c22No7x482bdd3_yYtw== +0 -0
  143. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~S2Qlu11xBhEd5aGSzWsnw1TR8u8PiOF93GO0j5bfNoAFCVzxKOwhRFoIXba2EpQnLQqFdIKyhWN3l70A4GPHmg== +0 -0
  144. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~W7a7M37RO9jgck2zeR0471Pm7e8K0Kqj5tXEouDjvqKZXSrWxMaWD28oqkKKYAiU4608R4S9mM11KyphljdMSw== +0 -0
  145. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~XUo1oyPCrlL7CA74wG-OzQ06VOWJYWvHGFHU7keZN1SKaIXjHX5qi_kBzjG_rBCi89-S8GVmCy7S3PHSjG8SbQ== +0 -0
  146. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~Xh0VmDvFNMELHu08-vrs54pegVyUwwDRxx_nXkwyD0NjnYozyqcGAKAr_QWHmw6F8XyuWg51M9KGpJJIFzzGuw== +0 -0
  147. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~Xve-wMBp_lxVUgD9qH5GwieGP9cAWtm0xULZvdGjBRUMvaevmpCB5gnbMBuIXAO6a1c9v6WUq0jNVX7ut5HvOw== +0 -0
  148. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~ZU1XkZFgnEE22CXEF-pOlcj5f10x-KM1Vw9d4IOLu-NiTZcz7koYPixhdrB1PJr8J-h9NpJmfqEastfxamA1jQ== +0 -0
  149. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~_YkNYEHTsbbtFILJpzH3HenH0t4ShI25dIMdve541CF5bl-jPF3X3F7tq-t5dvP0TEkATsOJdLQdBp1xv4Q-ag== +0 -0
  150. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~boy6mpn2jkwm60jjgQ0TG25UqRdN46LzmgTVCrpy6nBOgkLCGkGHcbceiwjU1itS_vj3-iQX0ZnrWOQrPyfHNA== +0 -0
  151. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~bwzpVZ9hAqGDHhXs2FRA82dfGfLmc7-m0uQhZDDfHHO7hQ17M_Np341BZX4WDLhYYS4cdUgaDodlNpdfpG3nXw== +0 -0
  152. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~cBxe-9PpAGFdAsYkmdN3lJVqEliLcRYlyoAov0aPZfJGwUr_cOm3XpjO7nmf_2eLf8UAx-rycjnJzw07xLrNCA== +0 -1
  153. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~dirWk6W4Pav1oyciuflfJlRu0iuxbYOmrpQapOJ0mV9C1SQ-jvDRv_7h753Cy18-SwULARUdWsyUy3yNNvxF7w== +0 -0
  154. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~ebwZVjSEHroc9jtIm4jd_h_YAqEBcOkAZ4HPNJT8pLCldjRcTq-obQLakxXOhfuoOBlYBoZLuO-Y0lskeZRYKw== +0 -0
  155. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~gfcRcmRIr0h09d0jiZsA7nUeQv2XtapxuYEXZy1Z9um0tTJQvz-O5ef5f7zhLenLvjnDtDtlY_aY4Hvpce6e1Q== +0 -0
  156. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~hgOgiVCyv2R0W-f0qKw5xYPeUwj8_ccCM9vKH_7vAQcCO9t8BwR1APGRBv20AONmp-PYMXmtgsBlQkNBRBpdQA== +0 -0
  157. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~hrhCl-YRAAr8ByNB_LCgEBsVNHMp92gTIUknetpUHMjcXl4Hpn_uY-h6C45oga0ZALnfGCo6iKTmiPLa4Qvnpg== +0 -0
  158. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~n2yoR7JsyL4DSUwmjnpE4Iq9Qi_eeZrmpPU8cdehDFKfESK7nwxXxfrSMQbk0BQ2lgGPadoRcd1-qr1xVz97jA== +0 -0
  159. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~nMCcZm8WvPogyO_nuJ926Q3Q2dqVMN2LdjEL1Kq2wJ_RG-rH-e_6v41l1xZbCsQTa3XykQdEiXNc0HtAvT6IRA== +0 -0
  160. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~oc3C7xkUt-OWDL6rrsxs-seS4Fu1bqBWAAXCHalgShaGg9MUrOiRbHT2DcAnhyQFKx6x5FRbvjmYoQWrQiXJZA== +0 -0
  161. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~p-ihj7SEgkDXpMu9hvKE_wiX9cvtwyXrdIn964BfedXHKGpC6o7mMPxEyC0kRPVi_EZs_MRV5bAPEpl5h5we0g== +0 -0
  162. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~qlhO_D9oE8uSKH-mZqyRF9pp4Zv1Tv0dIYcqrH4hb1VWlIxcdxmg2j0M8496cQeFXC5bn_JMXdBlD-d6cnFF8w== +0 -0
  163. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~tjpiyIxJR_boTdUNrtFDuKIZoY84fI4lA1oMJbq9e2ZmYKIK5FeRN2O8cV_yMOYJGr4lbv03kTmT70mCjUc2_Q== +0 -0
  164. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~wULeoj18eEKJWAKx1uFQVwS48cUGFcYPRJQj1Ro5XNJsWCwppGSCdIPhwifD6Z2f_j3zfI2SmC2Gg81sBXXW7g== +0 -0
  165. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~zrEihMys4NVV5rx6FmuzEGO2TjloI3OiC7yzIhvqYoRo43ibb2F-Km6Jf4NX-ac62pOLBYZRcjQTvYMpn75_oA== +0 -0
  166. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~-7Vi1RszY1XYnR2CCkEwIpKG8NwwA9zsZEz_WD7Dv6kKh4RC7N7ob8NIRVHGUJKp7eXxlpeI_gzD87Pcs_2u0g== +0 -0
  167. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~-SKV2drO-SFlrlh-wrzECDMkUSr-aF1lV9h-5onOy94zSTsD-oI45s0-KpOK45L-kq3hRY7v9vm-xmh00_eheg== +0 -0
  168. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~-_CU_vuaiFfObSeDFfmp7GuB20ThMSAL-P_RUMowiQLbdu-y0bU9upIm3q8g6XmXUG5hP6J1az0Ma5Hi_rhhRg== +0 -0
  169. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~03aPYP6VHJjZj5DlphGarj0xdw43qu09Onx5SReZoPvg9zh5uL212E-KWfGct9jf6JG0JFV2tdbBi7X_8bH9aw== +0 -0
  170. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~1Z82GPBBPc1VLvn4O7V5glb6lgyXteNlDREUzV_TPymM4ra4UkBMklzV90lEqoYRCDuRVzaQHaDYbmYp3-8CFw== +0 -0
  171. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~1mFDCboXpUu9pSHAiVGr1O_QgqEEtvJp_LUhickxLZo0Z5pj3fvadn1l2MzEOd4bFsVBZifUvcyPa7dzlMWF-A== +0 -0
  172. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~2_L9PUjv2JDKu1n8bDLb4XLB-yex6ZVjDDMwfuKAr7teDw-SKgLgkW6H-m_gjWChIVdB4vW6yvHP7XJxvXtRNA== +0 -0
  173. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~4VqMqsI5lOfxRppnud6-VDWcNsU8J7VgFCJfW2dXPwOcAkvU-I8Um5yp9n0Zv6nr3VmcxYggaVMDFfR0U_vjKw== +0 -0
  174. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~4krT4ZMzDOu34msFUq0Xod142kw4pAeSWX4JSxlsjOI0Wanu3343qeespgFi61MTWq1DdH9XXspVKqGlGm_fyw== +0 -0
  175. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~5_aJsdP-e3dRTAUnH-y1U2plaCuUi1vyHriaZuNK0xFe8wGl9Qft6uLCX2Qt6CRBKJQluEe9o0uRWw1eb42FHQ== +0 -0
  176. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~8b0bSqV7eND54zvHvu1v2Htpm7yn-BOEFw5d3mITJrXWNykJ5BTR9WbrD80JEctNcT-rDqO2xfrQk1tFWeY6Sw== +0 -0
  177. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~9u8KAGpgtSm-mQ12Py8RZUbYbDlBhM3w1I2MQO53K2CSn6IePp7g65DBcdXTYMfG1bgoJ-6x30fjnGe-2UYsDQ== +0 -0
  178. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~Bw7uMs4wqB9ahfEqGii2FkQ9pvZmG6HGe2hmbAT2wyM5hpn8Xh5dELysMcEz6hEsqmn6HdRdLOLZhC_fNaXzgA== +0 -0
  179. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~BwUq2xXQYuE8ya6HT6lfNsdtEjz5AKGf8GvLY6VBxQyIY1vgj_Gov-3NeM69OS66BQRDK0PG9H4Oyg0R48E4vg== +0 -0
  180. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~EkDVUR6dcnzxV_lYjkrJ5QGMVTCvb_upAoBF6DBu61sQkGvZN3fSRTsJ1XfJIZO-JUzdNoVA3D_CcvokL0gnQg== +0 -0
  181. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~FUkcLSJ8RAuPenM4HFG1R-sN5-cDBGcTxgR2jaVCna7xV0ZTyBHriB1Nn59mariNlJDiCoBtMUQEmauGxWtfBA== +0 -0
  182. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~FqsuZe4RVLOOVUYLTL-GTIohZ8TdSfxx7m2KJtLYFPGOdE4XorTX7Oc7kXbhghPRppXT3jW-slI37M34YNEvLQ== +0 -0
  183. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~G4F_NtyTj3i46fmKm0NorHAeq8tYWWYf6uv5yC1DwzdpWVoYbOPufmFNvdEbxZt4AMdV0gKx3HI46EAXNOQVFg== +0 -0
  184. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~GxetzGUNDgaBBXcTmLK6p9JBDX3I3QPshshbui1IaEWvJbQko-E36tCKwaJYHbleAWz9FqkAM_Tqx3YOmSVkVg== +0 -0
  185. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~H1Wjd5kKWDW4t3SDodxiHV72V8WT0xwPubw5cJTNLkPRLgaILFPh-dpy8EOUNgy1KzrDujFsm9EcTsbuqtMPLA== +0 -0
  186. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~JpI5MH4zCgebUHFpXVn4zjtsGtMNnO7BQZWfNARAB5UWa9gqz6YXHR3uLCJ_AvJ3lh53BUVkavsx9TY2FMmxbA== +0 -0
  187. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~JujNYkJtcux0Ni4QnR64zu4Wz_zYjyKvYaYZm5ypxTLPSzF3_jNE_NO4sdbDamF8wEqWoky1uf4ZE0JT3L607A== +0 -0
  188. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~KJSEA6DKnb2_FRPSqKZGh41eo-C8x448J9kEBrH012bUrZfOSDvrgmIrU0Vz7Ri3gaS9aKKmSaVMvXsHSlTJVA== +0 -0
  189. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~MStOwu3jBlJtcRnxrseVOuhI4kCj--ggFPG7sqrq5w1hjrI3bVyD-bm1Jwyx0noY3wT1rHDEvaGWnV2qsGjGwg== +0 -0
  190. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~McsJ8kFVf3IjhgXIRdw8Xx-EXgbV071bmlj2BBnk52xrWl3sEeiIyxwUsF7mIWvMRWfcFfu4VGHYyqfk2BeHXw== +0 -0
  191. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~NHt9fVe4kDdbxnglKcEwXaRK-WsYEOaD23Kbl8SJPRMYHr_Z6SJd_HmG3BROHHR_M6TgSmucONpDJdTj5tjuFw== +0 -0
  192. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~Nfo2iwCPcfAcOBIVyoUAK0-PIfr5qYxIKZt-uaSaTBdrTNxAuJ1ItmeDPZ3VdJJmxD_c22No7x482bdd3_yYtw== +0 -0
  193. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~S2Qlu11xBhEd5aGSzWsnw1TR8u8PiOF93GO0j5bfNoAFCVzxKOwhRFoIXba2EpQnLQqFdIKyhWN3l70A4GPHmg== +0 -0
  194. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~W7a7M37RO9jgck2zeR0471Pm7e8K0Kqj5tXEouDjvqKZXSrWxMaWD28oqkKKYAiU4608R4S9mM11KyphljdMSw== +0 -0
  195. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~XUo1oyPCrlL7CA74wG-OzQ06VOWJYWvHGFHU7keZN1SKaIXjHX5qi_kBzjG_rBCi89-S8GVmCy7S3PHSjG8SbQ== +0 -0
  196. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~Xh0VmDvFNMELHu08-vrs54pegVyUwwDRxx_nXkwyD0NjnYozyqcGAKAr_QWHmw6F8XyuWg51M9KGpJJIFzzGuw== +0 -0
  197. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~Xve-wMBp_lxVUgD9qH5GwieGP9cAWtm0xULZvdGjBRUMvaevmpCB5gnbMBuIXAO6a1c9v6WUq0jNVX7ut5HvOw== +0 -0
  198. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~ZU1XkZFgnEE22CXEF-pOlcj5f10x-KM1Vw9d4IOLu-NiTZcz7koYPixhdrB1PJr8J-h9NpJmfqEastfxamA1jQ== +0 -0
  199. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~_YkNYEHTsbbtFILJpzH3HenH0t4ShI25dIMdve541CF5bl-jPF3X3F7tq-t5dvP0TEkATsOJdLQdBp1xv4Q-ag== +0 -0
  200. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~boy6mpn2jkwm60jjgQ0TG25UqRdN46LzmgTVCrpy6nBOgkLCGkGHcbceiwjU1itS_vj3-iQX0ZnrWOQrPyfHNA== +0 -0
  201. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~bwzpVZ9hAqGDHhXs2FRA82dfGfLmc7-m0uQhZDDfHHO7hQ17M_Np341BZX4WDLhYYS4cdUgaDodlNpdfpG3nXw== +0 -0
  202. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~cBxe-9PpAGFdAsYkmdN3lJVqEliLcRYlyoAov0aPZfJGwUr_cOm3XpjO7nmf_2eLf8UAx-rycjnJzw07xLrNCA== +0 -0
  203. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~dirWk6W4Pav1oyciuflfJlRu0iuxbYOmrpQapOJ0mV9C1SQ-jvDRv_7h753Cy18-SwULARUdWsyUy3yNNvxF7w== +0 -0
  204. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~ebwZVjSEHroc9jtIm4jd_h_YAqEBcOkAZ4HPNJT8pLCldjRcTq-obQLakxXOhfuoOBlYBoZLuO-Y0lskeZRYKw== +0 -0
  205. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~gfcRcmRIr0h09d0jiZsA7nUeQv2XtapxuYEXZy1Z9um0tTJQvz-O5ef5f7zhLenLvjnDtDtlY_aY4Hvpce6e1Q== +0 -0
  206. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~hgOgiVCyv2R0W-f0qKw5xYPeUwj8_ccCM9vKH_7vAQcCO9t8BwR1APGRBv20AONmp-PYMXmtgsBlQkNBRBpdQA== +0 -0
  207. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~hrhCl-YRAAr8ByNB_LCgEBsVNHMp92gTIUknetpUHMjcXl4Hpn_uY-h6C45oga0ZALnfGCo6iKTmiPLa4Qvnpg== +0 -0
  208. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~n2yoR7JsyL4DSUwmjnpE4Iq9Qi_eeZrmpPU8cdehDFKfESK7nwxXxfrSMQbk0BQ2lgGPadoRcd1-qr1xVz97jA== +0 -0
  209. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~nMCcZm8WvPogyO_nuJ926Q3Q2dqVMN2LdjEL1Kq2wJ_RG-rH-e_6v41l1xZbCsQTa3XykQdEiXNc0HtAvT6IRA== +0 -0
  210. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~oc3C7xkUt-OWDL6rrsxs-seS4Fu1bqBWAAXCHalgShaGg9MUrOiRbHT2DcAnhyQFKx6x5FRbvjmYoQWrQiXJZA== +0 -0
  211. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~p-ihj7SEgkDXpMu9hvKE_wiX9cvtwyXrdIn964BfedXHKGpC6o7mMPxEyC0kRPVi_EZs_MRV5bAPEpl5h5we0g== +0 -0
  212. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~qlhO_D9oE8uSKH-mZqyRF9pp4Zv1Tv0dIYcqrH4hb1VWlIxcdxmg2j0M8496cQeFXC5bn_JMXdBlD-d6cnFF8w== +0 -0
  213. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~tjpiyIxJR_boTdUNrtFDuKIZoY84fI4lA1oMJbq9e2ZmYKIK5FeRN2O8cV_yMOYJGr4lbv03kTmT70mCjUc2_Q== +0 -0
  214. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~wULeoj18eEKJWAKx1uFQVwS48cUGFcYPRJQj1Ro5XNJsWCwppGSCdIPhwifD6Z2f_j3zfI2SmC2Gg81sBXXW7g== +0 -0
  215. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~zrEihMys4NVV5rx6FmuzEGO2TjloI3OiC7yzIhvqYoRo43ibb2F-Km6Jf4NX-ac62pOLBYZRcjQTvYMpn75_oA== +0 -0
  216. package/Tests/Artifacts/LottieTests.xcresult/Info.plist +0 -29
  217. package/Tests/Samples/9squares_AlBoardman.json +0 -1
  218. package/Tests/Samples/Boat_Loader.json +0 -1
  219. package/Tests/Samples/HamburgerArrow.json +0 -1
  220. package/Tests/Samples/IconTransitions.json +0 -1
  221. package/Tests/Samples/Images/dog.png +0 -0
  222. package/Tests/Samples/Issues/issue_1403.json +0 -1
  223. package/Tests/Samples/Issues/issue_1407.json +0 -1
  224. package/Tests/Samples/Issues/issue_1488.json +0 -1
  225. package/Tests/Samples/Issues/issue_1505.json +0 -1
  226. package/Tests/Samples/Issues/issue_1628.json +0 -1
  227. package/Tests/Samples/Issues/pr_1536.json +0 -1
  228. package/Tests/Samples/Issues/pr_1563.json +0 -8439
  229. package/Tests/Samples/Issues/pr_1592.json +0 -5527
  230. package/Tests/Samples/Issues/pr_1599.json +0 -738
  231. package/Tests/Samples/Issues/pr_1604_1.json +0 -1
  232. package/Tests/Samples/Issues/pr_1604_2.json +0 -1
  233. package/Tests/Samples/LottieFiles/LICENSE.md +0 -14
  234. package/Tests/Samples/LottieFiles/bounce_strokes.json +0 -1
  235. package/Tests/Samples/LottieFiles/cactus.json +0 -1
  236. package/Tests/Samples/LottieFiles/dog_car_ride.json +0 -1
  237. package/Tests/Samples/LottieFiles/draft_icon.json +0 -1
  238. package/Tests/Samples/LottieFiles/gradient_1.json +0 -1
  239. package/Tests/Samples/LottieFiles/gradient_2.json +0 -1
  240. package/Tests/Samples/LottieFiles/gradient_pill.json +0 -1
  241. package/Tests/Samples/LottieFiles/gradient_shapes.json +0 -1
  242. package/Tests/Samples/LottieFiles/gradient_square.json +0 -1
  243. package/Tests/Samples/LottieFiles/growth.json +0 -1
  244. package/Tests/Samples/LottieFiles/infinity_loader.json +0 -1
  245. package/Tests/Samples/LottieFiles/loading_dots_1.json +0 -1
  246. package/Tests/Samples/LottieFiles/loading_dots_2.json +0 -1
  247. package/Tests/Samples/LottieFiles/loading_dots_3.json +0 -1
  248. package/Tests/Samples/LottieFiles/loading_gradient_strokes.json +0 -1
  249. package/Tests/Samples/LottieFiles/settings_slider.json +0 -1
  250. package/Tests/Samples/LottieFiles/shop.json +0 -1
  251. package/Tests/Samples/LottieFiles/step_loader.json +0 -1
  252. package/Tests/Samples/LottieLogo1.json +0 -1
  253. package/Tests/Samples/LottieLogo1_masked.json +0 -1
  254. package/Tests/Samples/LottieLogo2.json +0 -1
  255. package/Tests/Samples/MotionCorpse_Jrcanest.json +0 -1
  256. package/Tests/Samples/Nonanimating/BasicLayers.json +0 -1
  257. package/Tests/Samples/Nonanimating/DisableNodesTest.json +0 -1
  258. package/Tests/Samples/Nonanimating/FirstText.json +0 -1
  259. package/Tests/Samples/Nonanimating/GeometryTransformTest.json +0 -1
  260. package/Tests/Samples/Nonanimating/Text_AnimatedProperties.json +0 -1
  261. package/Tests/Samples/Nonanimating/Text_Glyph.json +0 -1
  262. package/Tests/Samples/Nonanimating/Text_NoAnimation.json +0 -1
  263. package/Tests/Samples/Nonanimating/Text_NoGlyph.json +0 -1
  264. package/Tests/Samples/Nonanimating/Zoom.json +0 -1
  265. package/Tests/Samples/Nonanimating/_dog.json +0 -1
  266. package/Tests/Samples/Nonanimating/base64Test.json +0 -1
  267. package/Tests/Samples/Nonanimating/blend_mode_test.json +0 -1
  268. package/Tests/Samples/Nonanimating/keypathTest.json +0 -1
  269. package/Tests/Samples/Nonanimating/verifyLineHeight.json +0 -1
  270. package/Tests/Samples/PinJump.json +0 -1
  271. package/Tests/Samples/Private/BrokenLottieFiles/growth_man.json +0 -874
  272. package/Tests/Samples/Private/BrokenLottieFiles/rocket.json +0 -1
  273. package/Tests/Samples/Private/China_EmptyState_Itinerary.json +0 -1
  274. package/Tests/Samples/Private/LoaderHourglass.json +0 -12070
  275. package/Tests/Samples/Private/README.md +0 -7
  276. package/Tests/Samples/Private/Urgency/alarm_animated.json +0 -1
  277. package/Tests/Samples/Private/Urgency/diamond_animated.json +0 -1
  278. package/Tests/Samples/Private/Urgency/eye_animated.json +0 -1
  279. package/Tests/Samples/Private/Urgency/light_bulb_animated.json +0 -1
  280. package/Tests/Samples/Private/Urgency/light_bulb_static.json +0 -1
  281. package/Tests/Samples/Private/Urgency/piggy_bank_static.json +0 -1
  282. package/Tests/Samples/Private/Urgency/price_tag_legacy.json +0 -1
  283. package/Tests/Samples/Private/Urgency/rausch_alarm.json +0 -1
  284. package/Tests/Samples/Private/Urgency/rausch_alert.json +0 -1
  285. package/Tests/Samples/Private/Urgency/rausch_clock.json +0 -1
  286. package/Tests/Samples/Private/Urgency/rausch_diamond.json +0 -1
  287. package/Tests/Samples/Private/Urgency/rausch_money.json +0 -1
  288. package/Tests/Samples/Private/Urgency/rausch_piggy_bank.json +0 -1
  289. package/Tests/Samples/Private/Urgency/rausch_tag.json +0 -1
  290. package/Tests/Samples/Private/Urgency/red_envelope_animated.json +0 -1
  291. package/Tests/Samples/Private/Urgency/tag_animated.json +0 -1
  292. package/Tests/Samples/Private/Urgency/trophy_animated.json +0 -1
  293. package/Tests/Samples/Private/Urgency/wings_key_animated.json +0 -1
  294. package/Tests/Samples/Private/_flexible.json +0 -1
  295. package/Tests/Samples/Private/aircover.json +0 -1
  296. package/Tests/Samples/Private/belo_spin_rausch.json +0 -1
  297. package/Tests/Samples/Private/celebration.json +0 -2821
  298. package/Tests/Samples/Private/checkbox.json +0 -1
  299. package/Tests/Samples/Private/checkbox_small.json +0 -1
  300. package/Tests/Samples/Private/getting_your_trip_ready.json +0 -3540
  301. package/Tests/Samples/Private/gradient_afternoon.json +0 -1
  302. package/Tests/Samples/Private/gradient_brand.json +0 -1
  303. package/Tests/Samples/Private/gradient_evening.json +0 -1
  304. package/Tests/Samples/Private/gradient_morning.json +0 -1
  305. package/Tests/Samples/Private/issue_1467.json +0 -1
  306. package/Tests/Samples/Private/loading_dots.json +0 -1
  307. package/Tests/Samples/Private/loading_dots_small.json +0 -1
  308. package/Tests/Samples/Private/payment_loader.json +0 -1
  309. package/Tests/Samples/Private/radio_button.json +0 -1
  310. package/Tests/Samples/Private/selfie_intro.json +0 -1
  311. package/Tests/Samples/Private/stepper_add.json +0 -1
  312. package/Tests/Samples/Private/stepper_subtract.json +0 -1
  313. package/Tests/Samples/Private/switch.json +0 -1
  314. package/Tests/Samples/Private/thumb.json +0 -1
  315. package/Tests/Samples/Private/toggle_no.json +0 -1
  316. package/Tests/Samples/Private/toggle_yes.json +0 -1
  317. package/Tests/Samples/Private/user_error_black_and_white.json +0 -1
  318. package/Tests/Samples/Private/user_error_cut_off.json +0 -1
  319. package/Tests/Samples/Switch.json +0 -1
  320. package/Tests/Samples/Switch_States.json +0 -1
  321. package/Tests/Samples/TwitterHeart.json +0 -1
  322. package/Tests/Samples/TwitterHeartButton.json +0 -1
  323. package/Tests/Samples/TypeFace/A.json +0 -1
  324. package/Tests/Samples/TypeFace/Apostrophe.json +0 -1
  325. package/Tests/Samples/TypeFace/B.json +0 -1
  326. package/Tests/Samples/TypeFace/BlinkingCursor.json +0 -1
  327. package/Tests/Samples/TypeFace/C.json +0 -1
  328. package/Tests/Samples/TypeFace/Colon.json +0 -1
  329. package/Tests/Samples/TypeFace/Comma.json +0 -1
  330. package/Tests/Samples/TypeFace/D.json +0 -1
  331. package/Tests/Samples/TypeFace/E.json +0 -1
  332. package/Tests/Samples/TypeFace/F.json +0 -1
  333. package/Tests/Samples/TypeFace/G.json +0 -1
  334. package/Tests/Samples/TypeFace/H.json +0 -1
  335. package/Tests/Samples/TypeFace/I.json +0 -1
  336. package/Tests/Samples/TypeFace/J.json +0 -1
  337. package/Tests/Samples/TypeFace/K.json +0 -1
  338. package/Tests/Samples/TypeFace/L.json +0 -1
  339. package/Tests/Samples/TypeFace/M.json +0 -1
  340. package/Tests/Samples/TypeFace/N.json +0 -1
  341. package/Tests/Samples/TypeFace/O.json +0 -1
  342. package/Tests/Samples/TypeFace/P.json +0 -1
  343. package/Tests/Samples/TypeFace/Q.json +0 -1
  344. package/Tests/Samples/TypeFace/R.json +0 -1
  345. package/Tests/Samples/TypeFace/S.json +0 -1
  346. package/Tests/Samples/TypeFace/T.json +0 -1
  347. package/Tests/Samples/TypeFace/U.json +0 -1
  348. package/Tests/Samples/TypeFace/V.json +0 -1
  349. package/Tests/Samples/TypeFace/W.json +0 -1
  350. package/Tests/Samples/TypeFace/X.json +0 -1
  351. package/Tests/Samples/TypeFace/Y.json +0 -1
  352. package/Tests/Samples/TypeFace/Z.json +0 -1
  353. package/Tests/Samples/Watermelon.json +0 -1
  354. package/Tests/Samples/setValueTest.json +0 -1
  355. package/Tests/Samples/timeremap.json +0 -1
  356. package/Tests/Samples/vcTransition1.json +0 -1
  357. package/Tests/Samples/vcTransition2.json +0 -1
  358. package/script/lint/airbnb.swiftformat +0 -68
  359. package/script/lint/swiftlint.yml +0 -38
  360. package/script/test-carthage/Carthage/Build/.lottie-ios.version +0 -19
  361. package/script/test-carthage/Carthage/Build/Lottie.xcframework/Info.plist +0 -46
  362. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/BCSymbolMaps/BF971162-BE99-3507-B5B3-11947DC6B176.bcsymbolmap +0 -14778
  363. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/Lottie.framework/Headers/Lottie-Swift.h +0 -673
  364. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/Lottie.framework/Info.plist +0 -0
  365. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/Lottie.framework/Lottie +0 -0
  366. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/Lottie.framework/Modules/Lottie.swiftmodule/arm64-apple-ios.swiftdoc +0 -0
  367. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/Lottie.framework/Modules/Lottie.swiftmodule/arm64-apple-ios.swiftmodule +0 -0
  368. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/Lottie.framework/Modules/Lottie.swiftmodule/arm64.swiftdoc +0 -0
  369. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/Lottie.framework/Modules/Lottie.swiftmodule/arm64.swiftmodule +0 -0
  370. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/Lottie.framework/Modules/module.modulemap +0 -4
  371. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/dSYMs/Lottie.framework.dSYM/Contents/Info.plist +0 -20
  372. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/dSYMs/Lottie.framework.dSYM/Contents/Resources/DWARF/Lottie +0 -0
  373. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Headers/Lottie-Swift.h +0 -1352
  374. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Info.plist +0 -0
  375. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Lottie +0 -0
  376. 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
  377. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/Lottie.swiftmodule/Project/arm64.swiftsourceinfo +0 -0
  378. 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
  379. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/Lottie.swiftmodule/Project/x86_64.swiftsourceinfo +0 -0
  380. 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
  381. 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
  382. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/Lottie.swiftmodule/arm64.swiftdoc +0 -0
  383. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/Lottie.swiftmodule/arm64.swiftmodule +0 -0
  384. 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
  385. 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
  386. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/Lottie.swiftmodule/x86_64.swiftdoc +0 -0
  387. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/Lottie.swiftmodule/x86_64.swiftmodule +0 -0
  388. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/module.modulemap +0 -4
  389. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/_CodeSignature/CodeResources +0 -256
  390. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/dSYMs/Lottie.framework.dSYM/Contents/Info.plist +0 -20
  391. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/dSYMs/Lottie.framework.dSYM/Contents/Resources/DWARF/Lottie +0 -0
  392. package/script/test-carthage/Carthage/Checkouts/lottie-ios/Lottie.xcodeproj/project.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  393. package/script/test-carthage/Carthage/Checkouts/lottie-ios/Lottie.xcodeproj/xcuserdata/cal.xcuserdatad/xcschemes/xcschememanagement.plist +0 -37
  394. package/script/test-carthage/Carthage/Checkouts/lottie-ios/Lottie.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
@@ -19,7 +19,6 @@ final class NodeTree {
19
19
 
20
20
  extension Array where Element == ShapeItem {
21
21
  func initializeNodeTree() -> NodeTree {
22
-
23
22
  let nodeTree = NodeTree()
24
23
 
25
24
  for item in self {
@@ -73,7 +72,6 @@ extension Array where Element == ShapeItem {
73
72
  nodeTree.transform = xform
74
73
  continue
75
74
  } else if let group = item as? Group {
76
-
77
75
  let tree = group.items.initializeNodeTree()
78
76
  let node = GroupNode(name: group.name, parentNode: nodeTree.rootNode, tree: tree)
79
77
  nodeTree.rootNode = node
@@ -81,6 +79,11 @@ extension Array where Element == ShapeItem {
81
79
  /// Now add all child paths to current tree
82
80
  nodeTree.paths.append(contentsOf: tree.paths)
83
81
  nodeTree.renderContainers.append(node.container)
82
+ } else if item is Repeater {
83
+ LottieLogger.shared.assertionFailure("""
84
+ The Main Thread rendering engine doesn't currently support repeaters.
85
+ To play an animation with repeaters, you can use the Core Animation rendering engine instead.
86
+ """)
84
87
  }
85
88
 
86
89
  if let pathNode = nodeTree.rootNode as? PathNode {
@@ -142,7 +142,6 @@ final class TrimPathNode: AnimatorNode {
142
142
 
143
143
  /// Now loop through all path containers
144
144
  for pathContainer in upstreamPaths {
145
-
146
145
  let pathEnd = pathStart + pathContainer.totalLength
147
146
 
148
147
  if
@@ -214,11 +213,10 @@ final class TrimPathNode: AnimatorNode {
214
213
  let subpaths = pathContainer.removePaths(updateFrame: frame)
215
214
  var subpathStart: CGFloat = 0
216
215
  for path in subpaths {
217
-
218
216
  let subpathEnd = subpathStart + path.length
219
217
 
220
218
  if
221
- !startCutLength.isInRange(subpathStart, subpathEnd) &&
219
+ !startCutLength.isInRange(subpathStart, subpathEnd),
222
220
  !endCutLength.isInRange(subpathStart, subpathEnd)
223
221
  {
224
222
  // The whole path is included. Add
@@ -226,7 +224,7 @@ final class TrimPathNode: AnimatorNode {
226
224
  pathContainer.appendPath(path, updateFrame: frame)
227
225
 
228
226
  } else if
229
- startCutLength.isInRange(subpathStart, subpathEnd) &&
227
+ startCutLength.isInRange(subpathStart, subpathEnd),
230
228
  !endCutLength.isInRange(subpathStart, subpathEnd)
231
229
  {
232
230
  /// The start of the path needs to be trimmed
@@ -235,7 +233,7 @@ final class TrimPathNode: AnimatorNode {
235
233
  let newPath = path.trim(fromPosition: cutLength / path.length, toPosition: 1, offset: 0, trimSimultaneously: false)
236
234
  pathContainer.appendPath(newPath, updateFrame: frame)
237
235
  } else if
238
- !startCutLength.isInRange(subpathStart, subpathEnd) &&
236
+ !startCutLength.isInRange(subpathStart, subpathEnd),
239
237
  endCutLength.isInRange(subpathStart, subpathEnd)
240
238
  {
241
239
  // S|=======E----------------------|
@@ -244,7 +242,7 @@ final class TrimPathNode: AnimatorNode {
244
242
  pathContainer.appendPath(newPath, updateFrame: frame)
245
243
  break
246
244
  } else if
247
- startCutLength.isInRange(subpathStart, subpathEnd) &&
245
+ startCutLength.isInRange(subpathStart, subpathEnd),
248
246
  endCutLength.isInRange(subpathStart, subpathEnd)
249
247
  {
250
248
  // |-------S============E---------|
@@ -272,7 +270,6 @@ final class TrimPathNode: AnimatorNode {
272
270
 
273
271
  pathStart = pathEnd
274
272
  }
275
-
276
273
  }
277
274
 
278
275
  // MARK: Fileprivate
@@ -198,6 +198,11 @@ final class GradientFillRenderer: PassThroughOutputNode, Renderable {
198
198
  }
199
199
  }
200
200
 
201
+ var fillRule: CAShapeLayerFillRule {
202
+ get { maskLayer.fillRule }
203
+ set { maskLayer.fillRule = newValue }
204
+ }
205
+
201
206
  func render(_: CGContext) {
202
207
  // do nothing
203
208
  }
@@ -42,7 +42,7 @@ final class GradientStrokeRenderer: PassThroughOutputNode, Renderable {
42
42
  }
43
43
 
44
44
  func render(_ inContext: CGContext) {
45
- guard inContext.path != nil && inContext.path!.isEmpty == false else {
45
+ guard inContext.path != nil, inContext.path!.isEmpty == false else {
46
46
  return
47
47
  }
48
48
 
@@ -56,7 +56,6 @@ final class GradientStrokeRenderer: PassThroughOutputNode, Renderable {
56
56
 
57
57
  /// Now draw the gradient.
58
58
  gradientRender.render(inContext)
59
-
60
59
  }
61
60
 
62
61
  func renderBoundsFor(_ boundingBox: CGRect) -> CGRect {
@@ -58,7 +58,7 @@ final class LegacyGradientFillRenderer: PassThroughOutputNode, Renderable {
58
58
  }
59
59
 
60
60
  func render(_ inContext: CGContext) {
61
- guard inContext.path != nil && inContext.path!.isEmpty == false else {
61
+ guard inContext.path != nil, inContext.path!.isEmpty == false else {
62
62
  return
63
63
  }
64
64
  hasUpdate = false
@@ -140,7 +140,7 @@ final class StrokeRenderer: PassThroughOutputNode, Renderable {
140
140
  }
141
141
 
142
142
  func render(_ inContext: CGContext) {
143
- guard inContext.path != nil && inContext.path!.isEmpty == false else {
143
+ guard inContext.path != nil, inContext.path!.isEmpty == false else {
144
144
  return
145
145
  }
146
146
  guard let color = color else { return }
@@ -171,7 +171,7 @@ extension BezierPath {
171
171
  CurveVertex(
172
172
  CGPoint(x: 0, y: radius), // In tangent
173
173
  CGPoint(x: 0, y: radius), // Point
174
- CGPoint(x: -controlPoint, y: radius))// Out tangent
174
+ CGPoint(x: -controlPoint, y: radius)) // Out tangent
175
175
  .translated(CGPoint(x: radius, y: -radius))
176
176
  .translated(CGPoint(x: -size.width, y: size.height))
177
177
  .translated(position),
@@ -158,17 +158,17 @@ extension BezierPath {
158
158
  for i in 0..<numPoints {
159
159
  var radius = longSegment ? outerRadius : innerRadius
160
160
  var dTheta = halfAnglePerPoint
161
- if partialPointRadius != 0 && i == numPoints - 2 {
161
+ if partialPointRadius != 0, i == numPoints - 2 {
162
162
  dTheta = anglePerPoint * partialPointAmount / 2
163
163
  }
164
- if partialPointRadius != 0 && i == numPoints - 1 {
164
+ if partialPointRadius != 0, i == numPoints - 1 {
165
165
  radius = partialPointRadius
166
166
  }
167
167
  previousPoint = point
168
168
  point.x = (radius * cos(currentAngle))
169
169
  point.y = (radius * sin(currentAngle))
170
170
 
171
- if innerRoundedness == 0 && outerRoundedness == 0 {
171
+ if innerRoundedness == 0, outerRoundedness == 0 {
172
172
  vertices.append(CurveVertex(point: point + position, inTangentRelative: .zero, outTangentRelative: .zero))
173
173
  } else {
174
174
  let cp1Theta = (atan2(previousPoint.y, previousPoint.x) - CGFloat.pi / 2)
@@ -22,6 +22,7 @@ final class GradientFillProperties: NodePropertyMap, KeypathSearchable {
22
22
  colors = NodeProperty(provider: KeyframeInterpolator(keyframes: gradientfill.colors.keyframes))
23
23
  gradientType = gradientfill.gradientType
24
24
  numberOfColors = gradientfill.numberOfColors
25
+ fillRule = gradientfill.fillRule
25
26
  keypathProperties = [
26
27
  "Opacity" : opacity,
27
28
  "Start Point" : startPoint,
@@ -42,6 +43,7 @@ final class GradientFillProperties: NodePropertyMap, KeypathSearchable {
42
43
 
43
44
  let gradientType: GradientType
44
45
  let numberOfColors: Int
46
+ let fillRule: FillRule
45
47
 
46
48
  let keypathProperties: [String: AnyNodeProperty]
47
49
  let properties: [AnyNodeProperty]
@@ -98,5 +100,6 @@ final class GradientFillNode: AnimatorNode, RenderNode {
98
100
  fillRender.colors = fillProperties.colors.value.map { CGFloat($0) }
99
101
  fillRender.type = fillProperties.gradientType
100
102
  fillRender.numberOfColors = fillProperties.numberOfColors
103
+ fillRender.fillRule = fillProperties.fillRule.caFillRule
101
104
  }
102
105
  }
@@ -140,7 +140,7 @@ final class GradientStrokeNode: AnimatorNode, RenderNode {
140
140
 
141
141
  /// Get dash lengths
142
142
  let dashLengths = strokeProperties.dashPattern.value.map { $0.cgFloatValue }
143
- if dashLengths.count > 0 {
143
+ if dashLengths.count > 0, dashLengths.isSupportedLayerDashPattern {
144
144
  strokeRender.strokeRender.dashPhase = strokeProperties.dashPhase.value.cgFloatValue
145
145
  strokeRender.strokeRender.dashLengths = dashLengths
146
146
  } else {
@@ -118,7 +118,7 @@ final class StrokeNode: AnimatorNode, RenderNode {
118
118
 
119
119
  /// Get dash lengths
120
120
  let dashLengths = strokeProperties.dashPattern.value.map { $0.cgFloatValue }
121
- if dashLengths.count > 0 {
121
+ if dashLengths.count > 0, dashLengths.isSupportedLayerDashPattern {
122
122
  strokeRender.dashPhase = strokeProperties.dashPhase.value.cgFloatValue
123
123
  strokeRender.dashLengths = dashLengths
124
124
  } else {
@@ -148,6 +148,33 @@ extension Array where Element == DashElement {
148
148
  dashPatterns.append(dash.value.keyframes)
149
149
  }
150
150
  }
151
+
152
+ dashPatterns = ContiguousArray(dashPatterns.map { pattern in
153
+ ContiguousArray(pattern.map { keyframe -> Keyframe<Vector1D> in
154
+ // The recommended way to create a stroke of round dots, in theory,
155
+ // is to use a value of 0 followed by the stroke width, but for
156
+ // some reason Core Animation incorrectly (?) renders these as pills
157
+ // instead of circles. As a workaround, for parity with Lottie on other
158
+ // platforms, we can change `0`s to `0.01`: https://stackoverflow.com/a/38036486
159
+ if keyframe.value.cgFloatValue == 0 {
160
+ return keyframe.withValue(Vector1D(0.01))
161
+ } else {
162
+ return keyframe
163
+ }
164
+ })
165
+ })
166
+
151
167
  return (dashPatterns, dashPhase)
152
168
  }
153
169
  }
170
+
171
+ extension Array where Element == CGFloat {
172
+ // If all of the items in the dash pattern are zeros, then we shouldn't attempt to render it.
173
+ // This causes Core Animation to have extremely poor performance for some reason, even though
174
+ // it doesn't affect the appearance of the animation.
175
+ // - We check for `== 0.01` instead of `== 0` because `dashPattern.shapeLayerConfiguration`
176
+ // converts all `0` values to `0.01` to work around a different Core Animation rendering issue.
177
+ var isSupportedLayerDashPattern: Bool {
178
+ !allSatisfy { $0 == 0.01 }
179
+ }
180
+ }
@@ -69,7 +69,7 @@ class ShapeContainerLayer: CALayer {
69
69
 
70
70
  func updateRenderScale() {
71
71
  contentsScale = renderScale
72
- renderLayers.forEach( { $0.renderScale = renderScale } )
72
+ renderLayers.forEach({ $0.renderScale = renderScale })
73
73
  }
74
74
 
75
75
  }
@@ -69,7 +69,6 @@ final class ShapeRenderLayer: ShapeContainerLayer {
69
69
  }
70
70
 
71
71
  override func rebuildContents(forFrame _: CGFloat) {
72
-
73
72
  if renderer.shouldRenderInContext {
74
73
  if let newPath = renderer.outputPath {
75
74
  bounds = renderer.renderBoundsFor(newPath.boundingBox)
@@ -31,8 +31,8 @@ public final class Animation: Codable, DictionaryInitializable {
31
31
  startFrame = try container.decode(AnimationFrameTime.self, forKey: .startFrame)
32
32
  endFrame = try container.decode(AnimationFrameTime.self, forKey: .endFrame)
33
33
  framerate = try container.decode(Double.self, forKey: .framerate)
34
- width = try container.decode(Int.self, forKey: .width)
35
- height = try container.decode(Int.self, forKey: .height)
34
+ width = try container.decode(Double.self, forKey: .width)
35
+ height = try container.decode(Double.self, forKey: .height)
36
36
  layers = try container.decode([LayerModel].self, ofFamily: LayerType.self, forKey: .layers)
37
37
  glyphs = try container.decodeIfPresent([Glyph].self, forKey: .glyphs)
38
38
  fonts = try container.decodeIfPresent(FontList.self, forKey: .fonts)
@@ -137,10 +137,10 @@ public final class Animation: Codable, DictionaryInitializable {
137
137
  let type: CoordinateSpace
138
138
 
139
139
  /// The height of the composition in points.
140
- let width: Int
140
+ let width: Double
141
141
 
142
142
  /// The width of the composition in points.
143
- let height: Int
143
+ let height: Double
144
144
 
145
145
  /// The list of animation layers
146
146
  let layers: [LayerModel]
@@ -195,3 +195,28 @@ extension Keyframe {
195
195
  spatialOutTangent: spatialOutTangent)
196
196
  }
197
197
  }
198
+
199
+ extension KeyframeGroup {
200
+ /// Maps the values of each individual keyframe in this group
201
+ func map<NewValue>(_ transformation: (T) throws -> NewValue) rethrows -> KeyframeGroup<NewValue> {
202
+ KeyframeGroup<NewValue>(keyframes: ContiguousArray(try keyframes.map { keyframe in
203
+ keyframe.withValue(try transformation(keyframe.value))
204
+ }))
205
+ }
206
+ }
207
+
208
+ // MARK: - AnyKeyframeGroup
209
+
210
+ /// A type-erased wrapper for `KeyframeGroup`s
211
+ protocol AnyKeyframeGroup {
212
+ var untyped: KeyframeGroup<Any> { get }
213
+ }
214
+
215
+ // MARK: - KeyframeGroup + AnyKeyframeGroup
216
+
217
+ extension KeyframeGroup: AnyKeyframeGroup {
218
+ /// An untyped copy of these keyframes
219
+ var untyped: KeyframeGroup<Any> {
220
+ map { $0 as Any }
221
+ }
222
+ }
@@ -17,7 +17,6 @@ enum PathDirection: Int, Codable {
17
17
 
18
18
  // MARK: - Ellipse
19
19
 
20
- /// An item that define an ellipse shape
21
20
  final class Ellipse: ShapeItem {
22
21
 
23
22
  // MARK: Lifecycle
@@ -17,7 +17,6 @@ enum FillRule: Int, Codable {
17
17
 
18
18
  // MARK: - Fill
19
19
 
20
- /// An item that defines a fill render
21
20
  final class Fill: ShapeItem {
22
21
 
23
22
  // MARK: Lifecycle
@@ -54,6 +53,7 @@ final class Fill: ShapeItem {
54
53
  /// The color keyframes for the fill
55
54
  let color: KeyframeGroup<Color>
56
55
 
56
+ /// The fill rule to use when filling a path
57
57
  let fillRule: FillRule
58
58
 
59
59
  override func encode(to encoder: Encoder) throws {
@@ -17,7 +17,6 @@ enum GradientType: Int, Codable {
17
17
 
18
18
  // MARK: - GradientFill
19
19
 
20
- /// An item that define a gradient fill
21
20
  final class GradientFill: ShapeItem {
22
21
 
23
22
  // MARK: Lifecycle
@@ -30,6 +29,7 @@ final class GradientFill: ShapeItem {
30
29
  gradientType = try container.decode(GradientType.self, forKey: .gradientType)
31
30
  highlightLength = try container.decodeIfPresent(KeyframeGroup<Vector1D>.self, forKey: .highlightLength)
32
31
  highlightAngle = try container.decodeIfPresent(KeyframeGroup<Vector1D>.self, forKey: .highlightAngle)
32
+ fillRule = try container.decodeIfPresent(FillRule.self, forKey: .fillRule) ?? .nonZeroWinding
33
33
  let colorsContainer = try container.nestedContainer(keyedBy: GradientDataKeys.self, forKey: .colors)
34
34
  colors = try colorsContainer.decode(KeyframeGroup<[Double]>.self, forKey: .colors)
35
35
  numberOfColors = try colorsContainer.decode(Int.self, forKey: .numberOfColors)
@@ -62,6 +62,14 @@ final class GradientFill: ShapeItem {
62
62
  let nestedColorsDictionary: [String: Any] = try colorsDictionary.value(for: GradientDataKeys.colors)
63
63
  colors = try KeyframeGroup<[Double]>(dictionary: nestedColorsDictionary)
64
64
  numberOfColors = try colorsDictionary.value(for: GradientDataKeys.numberOfColors)
65
+ if
66
+ let fillRuleRawValue = dictionary[CodingKeys.fillRule.rawValue] as? Int,
67
+ let fillRule = FillRule(rawValue: fillRuleRawValue)
68
+ {
69
+ self.fillRule = fillRule
70
+ } else {
71
+ fillRule = .nonZeroWinding
72
+ }
65
73
  try super.init(dictionary: dictionary)
66
74
  }
67
75
 
@@ -91,6 +99,9 @@ final class GradientFill: ShapeItem {
91
99
  /// The Colors of the gradient.
92
100
  let colors: KeyframeGroup<[Double]>
93
101
 
102
+ /// The fill rule to use when filling a path
103
+ let fillRule: FillRule
104
+
94
105
  override func encode(to encoder: Encoder) throws {
95
106
  try super.encode(to: encoder)
96
107
  var container = encoder.container(keyedBy: CodingKeys.self)
@@ -100,6 +111,7 @@ final class GradientFill: ShapeItem {
100
111
  try container.encode(gradientType, forKey: .gradientType)
101
112
  try container.encodeIfPresent(highlightLength, forKey: .highlightLength)
102
113
  try container.encodeIfPresent(highlightAngle, forKey: .highlightAngle)
114
+ try container.encodeIfPresent(fillRule, forKey: .fillRule)
103
115
  var colorsContainer = container.nestedContainer(keyedBy: GradientDataKeys.self, forKey: .colors)
104
116
  try colorsContainer.encode(numberOfColors, forKey: .numberOfColors)
105
117
  try colorsContainer.encode(colors, forKey: .colors)
@@ -115,6 +127,7 @@ final class GradientFill: ShapeItem {
115
127
  case highlightLength = "h"
116
128
  case highlightAngle = "a"
117
129
  case colors = "g"
130
+ case fillRule = "r"
118
131
  }
119
132
 
120
133
  private enum GradientDataKeys: String, CodingKey {
@@ -27,7 +27,6 @@ enum LineJoin: Int, Codable {
27
27
 
28
28
  // MARK: - GradientStroke
29
29
 
30
- /// An item that define an ellipse shape
31
30
  final class GradientStroke: ShapeItem {
32
31
 
33
32
  // MARK: Lifecycle
@@ -7,7 +7,7 @@
7
7
 
8
8
  import Foundation
9
9
 
10
- /// An item that define an ellipse shape
10
+ /// An item that define a a group of shape items
11
11
  final class Group: ShapeItem {
12
12
 
13
13
  // MARK: Lifecycle
@@ -24,6 +24,11 @@ final class Group: ShapeItem {
24
24
  try super.init(dictionary: dictionary)
25
25
  }
26
26
 
27
+ init(items: [ShapeItem], name: String) {
28
+ self.items = items
29
+ super.init(name: name, type: .group, hidden: false)
30
+ }
31
+
27
32
  // MARK: Internal
28
33
 
29
34
  /// A list of shape items.
@@ -20,7 +20,6 @@ enum MergeMode: Int, Codable {
20
20
 
21
21
  // MARK: - Merge
22
22
 
23
- /// An item that define an ellipse shape
24
23
  final class Merge: ShapeItem {
25
24
 
26
25
  // MARK: Lifecycle
@@ -7,7 +7,6 @@
7
7
 
8
8
  import Foundation
9
9
 
10
- /// An item that define an ellipse shape
11
10
  final class Rectangle: ShapeItem {
12
11
 
13
12
  // MARK: Lifecycle
@@ -7,7 +7,6 @@
7
7
 
8
8
  import Foundation
9
9
 
10
- /// An item that define an ellipse shape
11
10
  final class Repeater: ShapeItem {
12
11
 
13
12
  // MARK: Lifecycle
@@ -7,7 +7,6 @@
7
7
 
8
8
  import Foundation
9
9
 
10
- /// An item that define an ellipse shape
11
10
  final class ShapeTransform: ShapeItem {
12
11
 
13
12
  // MARK: Lifecycle
@@ -17,7 +17,6 @@ enum StarType: Int, Codable {
17
17
 
18
18
  // MARK: - Star
19
19
 
20
- /// An item that define an ellipse shape
21
20
  final class Star: ShapeItem {
22
21
 
23
22
  // MARK: Lifecycle
@@ -7,7 +7,6 @@
7
7
 
8
8
  import Foundation
9
9
 
10
- /// An item that define an ellipse shape
11
10
  final class Stroke: ShapeItem {
12
11
 
13
12
  // MARK: Lifecycle
@@ -16,7 +16,6 @@ enum TrimType: Int, Codable {
16
16
 
17
17
  // MARK: - Trim
18
18
 
19
- /// An item that define an ellipse shape
20
19
  final class Trim: ShapeItem {
21
20
 
22
21
  // MARK: Lifecycle
@@ -26,7 +26,6 @@ final class TextAnimator: Codable, DictionaryInitializable {
26
26
  skewAxis = try animatorContainer.decodeIfPresent(KeyframeGroup<Vector1D>.self, forKey: .skewAxis)
27
27
  rotation = try animatorContainer.decodeIfPresent(KeyframeGroup<Vector1D>.self, forKey: .rotation)
28
28
  opacity = try animatorContainer.decodeIfPresent(KeyframeGroup<Vector1D>.self, forKey: .opacity)
29
-
30
29
  }
31
30
 
32
31
  init(dictionary: [String: Any]) throws {
@@ -53,7 +53,7 @@ extension CALayer {
53
53
  string = string + " "
54
54
  }
55
55
  string = string + "|_" + String(describing: self)
56
- print(string)
56
+ LottieLogger.shared.info(string)
57
57
  if let sublayers = sublayers {
58
58
  for sublayer in sublayers {
59
59
  sublayer.logLayerTree(withIndent: withIndent + 1)
@@ -75,7 +75,6 @@ extension CALayer {
75
75
 
76
76
  @nonobjc
77
77
  func setDebuggingState(visible: Bool) {
78
-
79
78
  var sublayers = self.sublayers
80
79
  if let cust = self as? CustomLayerDebugging {
81
80
  sublayers = cust.layerForDebugging().sublayers
@@ -344,7 +344,6 @@ extension CGPoint {
344
344
  var closestPoint = 0
345
345
 
346
346
  while previousAmount < 1 {
347
-
348
347
  previousAmount = previousAmount + step
349
348
 
350
349
  if previousAmount < amount {
@@ -429,7 +428,7 @@ extension CGPoint {
429
428
  func colinear(_ a: CGPoint, _ b: CGPoint) -> Bool {
430
429
  let area = x * (a.y - b.y) + a.x * (b.y - y) + b.x * (y - a.y);
431
430
  let accuracy: CGFloat = 0.05
432
- if area < accuracy && area > -accuracy {
431
+ if area < accuracy, area > -accuracy {
433
432
  return true
434
433
  }
435
434
  return false
@@ -16,7 +16,6 @@ extension String {
16
16
  }
17
17
 
18
18
  func hexColorComponents() -> (red: CGFloat, green: CGFloat, blue: CGFloat) {
19
-
20
19
  var cString: String = trimmingCharacters(in: .whitespacesAndNewlines).uppercased()
21
20
 
22
21
  if cString.hasPrefix("#") {
@@ -14,7 +14,6 @@ extension Color {
14
14
 
15
15
  /// Initialize a new color with Hue Saturation and Value
16
16
  init(h: Double, s: Double, v: Double, a: Double) {
17
-
18
17
  let i = floor(h * 6)
19
18
  let f = h * 6 - i
20
19
  let p = v * (1 - s);
@@ -149,7 +149,7 @@ final class KeyframeInterpolator<ValueType>: ValueProvider where ValueType: AnyI
149
149
 
150
150
  /// Sets the initial keyframes. This is often only needed for the first check.
151
151
  if
152
- leadingIndex == nil &&
152
+ leadingIndex == nil,
153
153
  trailingIndex == nil
154
154
  {
155
155
  if frame < keyframes[0].time {
@@ -170,7 +170,6 @@ final class KeyframeInterpolator<ValueType>: ValueProvider where ValueType: AnyI
170
170
  var newLeading = currentTrailing
171
171
  var keyframeFound = false
172
172
  while !keyframeFound {
173
-
174
173
  leadingIndex = newLeading
175
174
  trailingIndex = keyframes.validIndex(newLeading + 1)
176
175
 
@@ -192,13 +191,11 @@ final class KeyframeInterpolator<ValueType>: ValueProvider where ValueType: AnyI
192
191
  let currentLeading = leadingIndex,
193
192
  frame < keyframes[currentLeading].time
194
193
  {
195
-
196
194
  /// Time is before the current span. Iterate backwards
197
195
  var newTrailing = currentLeading
198
196
 
199
197
  var keyframeFound = false
200
198
  while !keyframeFound {
201
-
202
199
  leadingIndex = keyframes.validIndex(newTrailing - 1)
203
200
  trailingIndex = newTrailing
204
201
 
@@ -388,7 +388,6 @@ extension BezierPath: Codable {
388
388
  try inPointsContainer.encode(element.vertex.inTangentRelative)
389
389
  try outPointsContainer.encode(element.vertex.outTangentRelative)
390
390
  }
391
-
392
391
  }
393
392
  }
394
393
 
@@ -469,7 +468,7 @@ extension BezierPath {
469
468
  var previousElement: PathElement?
470
469
  for element in elements {
471
470
  if let previous = previousElement {
472
- if previous.vertex.outTangentRelative.isZero && element.vertex.inTangentRelative.isZero {
471
+ if previous.vertex.outTangentRelative.isZero, element.vertex.inTangentRelative.isZero {
473
472
  cgPath.addLine(to: element.vertex.point)
474
473
  } else {
475
474
  cgPath.addCurve(to: element.vertex.point, control1: previous.vertex.outTangent, control2: element.vertex.inTangent)
@@ -78,7 +78,6 @@ struct CurveVertex {
78
78
  func splitCurve(toVertex: CurveVertex, position: CGFloat) ->
79
79
  (start: CurveVertex, trimPoint: CurveVertex, end: CurveVertex)
80
80
  {
81
-
82
81
  /// If position is less than or equal to 0, trim at start.
83
82
  if position <= 0 {
84
83
  return (
@@ -101,7 +100,7 @@ struct CurveVertex {
101
100
  outTangentRelative: toVertex.outTangentRelative))
102
101
  }
103
102
 
104
- if outTangentRelative.isZero && toVertex.inTangentRelative.isZero {
103
+ if outTangentRelative.isZero, toVertex.inTangentRelative.isZero {
105
104
  /// If both tangents are zero, then span to be trimmed is a straight line.
106
105
  let trimPoint = point.interpolate(to: toVertex.point, amount: position)
107
106
  return (
@@ -166,8 +165,7 @@ struct CurveVertex {
166
165
  /// For curves the curve is iterated over by sample count and the points are measured.
167
166
  /// This is ~99% accurate at a sample count of 30
168
167
  func distanceTo(_ toVertex: CurveVertex, sampleCount: Int = 25) -> CGFloat {
169
-
170
- if outTangentRelative.isZero && toVertex.inTangentRelative.isZero {
168
+ if outTangentRelative.isZero, toVertex.inTangentRelative.isZero {
171
169
  /// Return a linear distance.
172
170
  return point.distanceTo(toVertex.point)
173
171
  }