lottie-ios 3.4.0 → 3.4.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/main.yml +10 -7
- package/.github/workflows/stale_issues.yml +17 -0
- package/.swiftpm/xcode/package.xcworkspace/xcuserdata/calstephens.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- package/Lottie.xcodeproj/project.pbxproj +33 -21
- package/Lottie.xcodeproj/xcshareddata/xcschemes/Lottie (macOS).xcscheme +2 -2
- package/Lottie.xcworkspace/xcuserdata/calstephens.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- package/Lottie.xcworkspace/xcuserdata/calstephens.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +5 -6
- package/Lottie.xcworkspace/xcuserdata/calstephens.xcuserdatad/xcdebugger/Expressions.xcexplist +114 -1
- package/Lottie.xcworkspace/xcuserdata/calstephens.xcuserdatad/xcschemes/xcschememanagement.plist +30 -0
- package/Package.swift +1 -1
- package/README.md +5 -6
- package/Rakefile +52 -17
- package/Sources/Private/CoreAnimation/Animations/CAAnimation+TimingConfiguration.swift +7 -2
- package/Sources/Private/CoreAnimation/Animations/CALayer+addAnimation.swift +192 -67
- package/Sources/Private/CoreAnimation/Animations/CombinedShapeAnimation.swift +28 -0
- package/Sources/Private/CoreAnimation/Animations/EllipseAnimation.swift +31 -4
- package/Sources/Private/CoreAnimation/Animations/GradientAnimations.swift +98 -43
- package/Sources/Private/CoreAnimation/Animations/LayerProperty.swift +19 -19
- package/Sources/Private/CoreAnimation/Animations/RectangleAnimation.swift +34 -7
- package/Sources/Private/CoreAnimation/Animations/ShapeAnimation.swift +25 -14
- package/Sources/Private/CoreAnimation/Animations/StarAnimation.swift +61 -32
- package/Sources/Private/CoreAnimation/Animations/StrokeAnimation.swift +6 -2
- package/Sources/Private/CoreAnimation/CoreAnimationLayer.swift +29 -11
- package/Sources/Private/CoreAnimation/Extensions/KeyframeGroup+exactlyOneKeyframe.swift +2 -2
- package/Sources/Private/CoreAnimation/Extensions/Keyframes+combinedIfPossible.swift +116 -23
- package/Sources/Private/CoreAnimation/Layers/AnimationLayer.swift +9 -0
- package/Sources/Private/CoreAnimation/Layers/BaseCompositionLayer.swift +2 -1
- package/Sources/Private/CoreAnimation/Layers/CALayer+setupLayerHierarchy.swift +48 -12
- package/Sources/Private/CoreAnimation/Layers/GradientRenderLayer.swift +10 -3
- package/Sources/Private/CoreAnimation/Layers/LayerModel+makeAnimationLayer.swift +5 -0
- package/Sources/Private/CoreAnimation/Layers/MaskCompositionLayer.swift +1 -1
- package/Sources/Private/CoreAnimation/Layers/PreCompLayer.swift +2 -2
- package/Sources/Private/CoreAnimation/Layers/RepeaterLayer.swift +85 -0
- package/Sources/Private/CoreAnimation/Layers/ShapeItemLayer.swift +94 -38
- package/Sources/Private/CoreAnimation/Layers/ShapeLayer.swift +131 -46
- package/Sources/Private/CoreAnimation/Layers/TextLayer.swift +16 -2
- package/Sources/Private/MainThread/LayerContainers/CompLayers/CompositionLayer.swift +1 -1
- package/Sources/Private/MainThread/LayerContainers/CompLayers/MaskContainerLayer.swift +0 -2
- package/Sources/Private/MainThread/LayerContainers/CompLayers/PreCompositionLayer.swift +2 -2
- package/Sources/Private/MainThread/LayerContainers/MainThreadAnimationLayer.swift +1 -2
- package/Sources/Private/MainThread/LayerContainers/Utility/CoreTextRenderLayer.swift +30 -1
- package/Sources/Private/MainThread/LayerContainers/Utility/InvertedMatteLayer.swift +1 -0
- package/Sources/Private/MainThread/LayerContainers/Utility/LayerTransformNode.swift +0 -1
- package/Sources/Private/MainThread/NodeRenderSystem/Extensions/ItemsExtension.swift +5 -2
- package/Sources/Private/MainThread/NodeRenderSystem/Nodes/ModifierNodes/TrimPathNode.swift +4 -7
- package/Sources/Private/MainThread/NodeRenderSystem/Nodes/OutputNodes/Renderables/GradientFillRenderer.swift +5 -0
- package/Sources/Private/MainThread/NodeRenderSystem/Nodes/OutputNodes/Renderables/GradientStrokeRenderer.swift +1 -2
- package/Sources/Private/MainThread/NodeRenderSystem/Nodes/OutputNodes/Renderables/LegacyGradientFillRenderer.swift +1 -1
- package/Sources/Private/MainThread/NodeRenderSystem/Nodes/OutputNodes/Renderables/StrokeRenderer.swift +1 -1
- package/Sources/Private/MainThread/NodeRenderSystem/Nodes/PathNodes/RectNode.swift +1 -1
- package/Sources/Private/MainThread/NodeRenderSystem/Nodes/PathNodes/StarNode.swift +3 -3
- package/Sources/Private/MainThread/NodeRenderSystem/Nodes/RenderNodes/GradientFillNode.swift +3 -0
- package/Sources/Private/MainThread/NodeRenderSystem/Nodes/RenderNodes/GradientStrokeNode.swift +1 -1
- package/Sources/Private/MainThread/NodeRenderSystem/Nodes/RenderNodes/StrokeNode.swift +28 -1
- package/Sources/Private/MainThread/NodeRenderSystem/RenderLayers/ShapeContainerLayer.swift +1 -1
- package/Sources/Private/MainThread/NodeRenderSystem/RenderLayers/ShapeRenderLayer.swift +0 -1
- package/Sources/Private/Model/Animation.swift +4 -4
- package/Sources/Private/Model/Keyframes/KeyframeGroup.swift +25 -0
- package/Sources/Private/Model/ShapeItems/Ellipse.swift +0 -1
- package/Sources/Private/Model/ShapeItems/Fill.swift +1 -1
- package/Sources/Private/Model/ShapeItems/GradientFill.swift +14 -1
- package/Sources/Private/Model/ShapeItems/GradientStroke.swift +0 -1
- package/Sources/Private/Model/ShapeItems/Group.swift +6 -1
- package/Sources/Private/Model/ShapeItems/Merge.swift +0 -1
- package/Sources/Private/Model/ShapeItems/Rectangle.swift +0 -1
- package/Sources/Private/Model/ShapeItems/Repeater.swift +0 -1
- package/Sources/Private/Model/ShapeItems/ShapeTransform.swift +0 -1
- package/Sources/Private/Model/ShapeItems/Star.swift +0 -1
- package/Sources/Private/Model/ShapeItems/Stroke.swift +0 -1
- package/Sources/Private/Model/ShapeItems/Trim.swift +0 -1
- package/Sources/Private/Model/Text/TextAnimator.swift +0 -1
- package/Sources/Private/Utility/Debugging/LayerDebugging.swift +1 -2
- package/Sources/Private/Utility/Extensions/MathKit.swift +1 -2
- package/Sources/Private/Utility/Extensions/StringExtensions.swift +0 -1
- package/Sources/Private/Utility/Interpolatable/InterpolatableExtensions.swift +0 -1
- package/Sources/Private/{MainThread/NodeRenderSystem/NodeProperties/ValueProviders → Utility/Interpolatable}/KeyframeInterpolator.swift +1 -4
- package/Sources/Private/Utility/Primitives/BezierPath.swift +1 -2
- package/Sources/Private/Utility/Primitives/CurveVertex.swift +2 -4
- package/Sources/Public/Animation/AnimationPublic.swift +2 -4
- package/Sources/Public/Animation/AnimationView.swift +29 -7
- package/Sources/Public/Animation/AnimationViewInitializers.swift +13 -11
- package/Sources/Public/DynamicProperties/ValueProviders/GradientValueProvider.swift +0 -2
- package/Sources/Public/FontProvider/AnimationFontProvider.swift +1 -1
- package/Sources/Public/Logging/LottieLogger.swift +15 -2
- package/Sources/Public/TextProvider/AnimationTextProvider.swift +1 -1
- package/Sources/Public/iOS/AnimatedButton.swift +10 -4
- package/Sources/Public/iOS/AnimatedControl.swift +3 -5
- package/Sources/Public/iOS/AnimatedSwitch.swift +9 -6
- package/Sources/Public/iOS/BundleImageProvider.swift +2 -3
- package/Sources/Public/iOS/FilepathImageProvider.swift +1 -2
- package/Sources/Public/macOS/BundleImageProvider.macOS.swift +1 -2
- package/Sources/Public/macOS/FilepathImageProvider.macOS.swift +1 -3
- package/Tests/AnimationKeypathTests.swift +10 -1
- package/Tests/AutomaticEngineTests.swift +1 -0
- package/Tests/ParsingTests.swift +2 -1
- package/Tests/PerformanceTests.swift +28 -29
- package/Tests/SnapshotConfiguration.swift +19 -0
- package/Tests/SnapshotTests.swift +4 -0
- package/Tests/Utils/HardcodedTextProvider.swift +27 -0
- package/lottie-ios.podspec +2 -2
- package/package.json +1 -1
- package/script/test-carthage/CarthageTest/AppDelegate.swift +6 -7
- package/script/test-carthage/CarthageTest/ViewController.swift +1 -1
- package/script/test-carthage/CarthageTest-macOS/AppDelegate.swift +7 -0
- package/script/test-carthage/CarthageTest-macOS/Assets.xcassets/AccentColor.colorset/Contents.json +11 -0
- package/script/test-carthage/CarthageTest-macOS/Assets.xcassets/AppIcon.appiconset/Contents.json +58 -0
- package/script/test-carthage/CarthageTest-macOS/Assets.xcassets/Contents.json +6 -0
- package/script/test-carthage/CarthageTest-macOS/Base.lproj/Main.storyboard +717 -0
- package/script/test-carthage/CarthageTest-macOS/CarthageTest_macOS.entitlements +10 -0
- package/script/test-carthage/CarthageTest-macOS/ViewController.swift +15 -0
- package/script/test-carthage/CarthageTest.xcodeproj/project.pbxproj +159 -5
- package/script/test-carthage/CarthageTest.xcodeproj/project.xcworkspace/xcuserdata/calstephens.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- package/script/test-carthage/CarthageTest.xcodeproj/xcuserdata/calstephens.xcuserdatad/xcschemes/xcschememanagement.plist +19 -0
- package/Lottie.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +0 -23
- package/Mintfile +0 -3
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~-7Vi1RszY1XYnR2CCkEwIpKG8NwwA9zsZEz_WD7Dv6kKh4RC7N7ob8NIRVHGUJKp7eXxlpeI_gzD87Pcs_2u0g== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~-SKV2drO-SFlrlh-wrzECDMkUSr-aF1lV9h-5onOy94zSTsD-oI45s0-KpOK45L-kq3hRY7v9vm-xmh00_eheg== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~-_CU_vuaiFfObSeDFfmp7GuB20ThMSAL-P_RUMowiQLbdu-y0bU9upIm3q8g6XmXUG5hP6J1az0Ma5Hi_rhhRg== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~03aPYP6VHJjZj5DlphGarj0xdw43qu09Onx5SReZoPvg9zh5uL212E-KWfGct9jf6JG0JFV2tdbBi7X_8bH9aw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~1Z82GPBBPc1VLvn4O7V5glb6lgyXteNlDREUzV_TPymM4ra4UkBMklzV90lEqoYRCDuRVzaQHaDYbmYp3-8CFw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~1mFDCboXpUu9pSHAiVGr1O_QgqEEtvJp_LUhickxLZo0Z5pj3fvadn1l2MzEOd4bFsVBZifUvcyPa7dzlMWF-A== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~2_L9PUjv2JDKu1n8bDLb4XLB-yex6ZVjDDMwfuKAr7teDw-SKgLgkW6H-m_gjWChIVdB4vW6yvHP7XJxvXtRNA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~4VqMqsI5lOfxRppnud6-VDWcNsU8J7VgFCJfW2dXPwOcAkvU-I8Um5yp9n0Zv6nr3VmcxYggaVMDFfR0U_vjKw== +0 -1
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~4krT4ZMzDOu34msFUq0Xod142kw4pAeSWX4JSxlsjOI0Wanu3343qeespgFi61MTWq1DdH9XXspVKqGlGm_fyw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~5_aJsdP-e3dRTAUnH-y1U2plaCuUi1vyHriaZuNK0xFe8wGl9Qft6uLCX2Qt6CRBKJQluEe9o0uRWw1eb42FHQ== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~8b0bSqV7eND54zvHvu1v2Htpm7yn-BOEFw5d3mITJrXWNykJ5BTR9WbrD80JEctNcT-rDqO2xfrQk1tFWeY6Sw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~9u8KAGpgtSm-mQ12Py8RZUbYbDlBhM3w1I2MQO53K2CSn6IePp7g65DBcdXTYMfG1bgoJ-6x30fjnGe-2UYsDQ== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~Bw7uMs4wqB9ahfEqGii2FkQ9pvZmG6HGe2hmbAT2wyM5hpn8Xh5dELysMcEz6hEsqmn6HdRdLOLZhC_fNaXzgA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~BwUq2xXQYuE8ya6HT6lfNsdtEjz5AKGf8GvLY6VBxQyIY1vgj_Gov-3NeM69OS66BQRDK0PG9H4Oyg0R48E4vg== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~EkDVUR6dcnzxV_lYjkrJ5QGMVTCvb_upAoBF6DBu61sQkGvZN3fSRTsJ1XfJIZO-JUzdNoVA3D_CcvokL0gnQg== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~FUkcLSJ8RAuPenM4HFG1R-sN5-cDBGcTxgR2jaVCna7xV0ZTyBHriB1Nn59mariNlJDiCoBtMUQEmauGxWtfBA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~FqsuZe4RVLOOVUYLTL-GTIohZ8TdSfxx7m2KJtLYFPGOdE4XorTX7Oc7kXbhghPRppXT3jW-slI37M34YNEvLQ== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~G4F_NtyTj3i46fmKm0NorHAeq8tYWWYf6uv5yC1DwzdpWVoYbOPufmFNvdEbxZt4AMdV0gKx3HI46EAXNOQVFg== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~GxetzGUNDgaBBXcTmLK6p9JBDX3I3QPshshbui1IaEWvJbQko-E36tCKwaJYHbleAWz9FqkAM_Tqx3YOmSVkVg== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~H1Wjd5kKWDW4t3SDodxiHV72V8WT0xwPubw5cJTNLkPRLgaILFPh-dpy8EOUNgy1KzrDujFsm9EcTsbuqtMPLA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~JpI5MH4zCgebUHFpXVn4zjtsGtMNnO7BQZWfNARAB5UWa9gqz6YXHR3uLCJ_AvJ3lh53BUVkavsx9TY2FMmxbA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~JujNYkJtcux0Ni4QnR64zu4Wz_zYjyKvYaYZm5ypxTLPSzF3_jNE_NO4sdbDamF8wEqWoky1uf4ZE0JT3L607A== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~KJSEA6DKnb2_FRPSqKZGh41eo-C8x448J9kEBrH012bUrZfOSDvrgmIrU0Vz7Ri3gaS9aKKmSaVMvXsHSlTJVA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~MStOwu3jBlJtcRnxrseVOuhI4kCj--ggFPG7sqrq5w1hjrI3bVyD-bm1Jwyx0noY3wT1rHDEvaGWnV2qsGjGwg== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~McsJ8kFVf3IjhgXIRdw8Xx-EXgbV071bmlj2BBnk52xrWl3sEeiIyxwUsF7mIWvMRWfcFfu4VGHYyqfk2BeHXw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~NHt9fVe4kDdbxnglKcEwXaRK-WsYEOaD23Kbl8SJPRMYHr_Z6SJd_HmG3BROHHR_M6TgSmucONpDJdTj5tjuFw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~Nfo2iwCPcfAcOBIVyoUAK0-PIfr5qYxIKZt-uaSaTBdrTNxAuJ1ItmeDPZ3VdJJmxD_c22No7x482bdd3_yYtw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~S2Qlu11xBhEd5aGSzWsnw1TR8u8PiOF93GO0j5bfNoAFCVzxKOwhRFoIXba2EpQnLQqFdIKyhWN3l70A4GPHmg== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~W7a7M37RO9jgck2zeR0471Pm7e8K0Kqj5tXEouDjvqKZXSrWxMaWD28oqkKKYAiU4608R4S9mM11KyphljdMSw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~XUo1oyPCrlL7CA74wG-OzQ06VOWJYWvHGFHU7keZN1SKaIXjHX5qi_kBzjG_rBCi89-S8GVmCy7S3PHSjG8SbQ== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~Xh0VmDvFNMELHu08-vrs54pegVyUwwDRxx_nXkwyD0NjnYozyqcGAKAr_QWHmw6F8XyuWg51M9KGpJJIFzzGuw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~Xve-wMBp_lxVUgD9qH5GwieGP9cAWtm0xULZvdGjBRUMvaevmpCB5gnbMBuIXAO6a1c9v6WUq0jNVX7ut5HvOw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~ZU1XkZFgnEE22CXEF-pOlcj5f10x-KM1Vw9d4IOLu-NiTZcz7koYPixhdrB1PJr8J-h9NpJmfqEastfxamA1jQ== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~_YkNYEHTsbbtFILJpzH3HenH0t4ShI25dIMdve541CF5bl-jPF3X3F7tq-t5dvP0TEkATsOJdLQdBp1xv4Q-ag== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~boy6mpn2jkwm60jjgQ0TG25UqRdN46LzmgTVCrpy6nBOgkLCGkGHcbceiwjU1itS_vj3-iQX0ZnrWOQrPyfHNA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~bwzpVZ9hAqGDHhXs2FRA82dfGfLmc7-m0uQhZDDfHHO7hQ17M_Np341BZX4WDLhYYS4cdUgaDodlNpdfpG3nXw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~cBxe-9PpAGFdAsYkmdN3lJVqEliLcRYlyoAov0aPZfJGwUr_cOm3XpjO7nmf_2eLf8UAx-rycjnJzw07xLrNCA== +0 -1
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~dirWk6W4Pav1oyciuflfJlRu0iuxbYOmrpQapOJ0mV9C1SQ-jvDRv_7h753Cy18-SwULARUdWsyUy3yNNvxF7w== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~ebwZVjSEHroc9jtIm4jd_h_YAqEBcOkAZ4HPNJT8pLCldjRcTq-obQLakxXOhfuoOBlYBoZLuO-Y0lskeZRYKw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~gfcRcmRIr0h09d0jiZsA7nUeQv2XtapxuYEXZy1Z9um0tTJQvz-O5ef5f7zhLenLvjnDtDtlY_aY4Hvpce6e1Q== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~hgOgiVCyv2R0W-f0qKw5xYPeUwj8_ccCM9vKH_7vAQcCO9t8BwR1APGRBv20AONmp-PYMXmtgsBlQkNBRBpdQA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~hrhCl-YRAAr8ByNB_LCgEBsVNHMp92gTIUknetpUHMjcXl4Hpn_uY-h6C45oga0ZALnfGCo6iKTmiPLa4Qvnpg== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~n2yoR7JsyL4DSUwmjnpE4Iq9Qi_eeZrmpPU8cdehDFKfESK7nwxXxfrSMQbk0BQ2lgGPadoRcd1-qr1xVz97jA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~nMCcZm8WvPogyO_nuJ926Q3Q2dqVMN2LdjEL1Kq2wJ_RG-rH-e_6v41l1xZbCsQTa3XykQdEiXNc0HtAvT6IRA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~oc3C7xkUt-OWDL6rrsxs-seS4Fu1bqBWAAXCHalgShaGg9MUrOiRbHT2DcAnhyQFKx6x5FRbvjmYoQWrQiXJZA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~p-ihj7SEgkDXpMu9hvKE_wiX9cvtwyXrdIn964BfedXHKGpC6o7mMPxEyC0kRPVi_EZs_MRV5bAPEpl5h5we0g== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~qlhO_D9oE8uSKH-mZqyRF9pp4Zv1Tv0dIYcqrH4hb1VWlIxcdxmg2j0M8496cQeFXC5bn_JMXdBlD-d6cnFF8w== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~tjpiyIxJR_boTdUNrtFDuKIZoY84fI4lA1oMJbq9e2ZmYKIK5FeRN2O8cV_yMOYJGr4lbv03kTmT70mCjUc2_Q== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~wULeoj18eEKJWAKx1uFQVwS48cUGFcYPRJQj1Ro5XNJsWCwppGSCdIPhwifD6Z2f_j3zfI2SmC2Gg81sBXXW7g== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~zrEihMys4NVV5rx6FmuzEGO2TjloI3OiC7yzIhvqYoRo43ibb2F-Km6Jf4NX-ac62pOLBYZRcjQTvYMpn75_oA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~-7Vi1RszY1XYnR2CCkEwIpKG8NwwA9zsZEz_WD7Dv6kKh4RC7N7ob8NIRVHGUJKp7eXxlpeI_gzD87Pcs_2u0g== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~-SKV2drO-SFlrlh-wrzECDMkUSr-aF1lV9h-5onOy94zSTsD-oI45s0-KpOK45L-kq3hRY7v9vm-xmh00_eheg== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~-_CU_vuaiFfObSeDFfmp7GuB20ThMSAL-P_RUMowiQLbdu-y0bU9upIm3q8g6XmXUG5hP6J1az0Ma5Hi_rhhRg== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~03aPYP6VHJjZj5DlphGarj0xdw43qu09Onx5SReZoPvg9zh5uL212E-KWfGct9jf6JG0JFV2tdbBi7X_8bH9aw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~1Z82GPBBPc1VLvn4O7V5glb6lgyXteNlDREUzV_TPymM4ra4UkBMklzV90lEqoYRCDuRVzaQHaDYbmYp3-8CFw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~1mFDCboXpUu9pSHAiVGr1O_QgqEEtvJp_LUhickxLZo0Z5pj3fvadn1l2MzEOd4bFsVBZifUvcyPa7dzlMWF-A== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~2_L9PUjv2JDKu1n8bDLb4XLB-yex6ZVjDDMwfuKAr7teDw-SKgLgkW6H-m_gjWChIVdB4vW6yvHP7XJxvXtRNA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~4VqMqsI5lOfxRppnud6-VDWcNsU8J7VgFCJfW2dXPwOcAkvU-I8Um5yp9n0Zv6nr3VmcxYggaVMDFfR0U_vjKw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~4krT4ZMzDOu34msFUq0Xod142kw4pAeSWX4JSxlsjOI0Wanu3343qeespgFi61MTWq1DdH9XXspVKqGlGm_fyw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~5_aJsdP-e3dRTAUnH-y1U2plaCuUi1vyHriaZuNK0xFe8wGl9Qft6uLCX2Qt6CRBKJQluEe9o0uRWw1eb42FHQ== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~8b0bSqV7eND54zvHvu1v2Htpm7yn-BOEFw5d3mITJrXWNykJ5BTR9WbrD80JEctNcT-rDqO2xfrQk1tFWeY6Sw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~9u8KAGpgtSm-mQ12Py8RZUbYbDlBhM3w1I2MQO53K2CSn6IePp7g65DBcdXTYMfG1bgoJ-6x30fjnGe-2UYsDQ== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~Bw7uMs4wqB9ahfEqGii2FkQ9pvZmG6HGe2hmbAT2wyM5hpn8Xh5dELysMcEz6hEsqmn6HdRdLOLZhC_fNaXzgA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~BwUq2xXQYuE8ya6HT6lfNsdtEjz5AKGf8GvLY6VBxQyIY1vgj_Gov-3NeM69OS66BQRDK0PG9H4Oyg0R48E4vg== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~EkDVUR6dcnzxV_lYjkrJ5QGMVTCvb_upAoBF6DBu61sQkGvZN3fSRTsJ1XfJIZO-JUzdNoVA3D_CcvokL0gnQg== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~FUkcLSJ8RAuPenM4HFG1R-sN5-cDBGcTxgR2jaVCna7xV0ZTyBHriB1Nn59mariNlJDiCoBtMUQEmauGxWtfBA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~FqsuZe4RVLOOVUYLTL-GTIohZ8TdSfxx7m2KJtLYFPGOdE4XorTX7Oc7kXbhghPRppXT3jW-slI37M34YNEvLQ== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~G4F_NtyTj3i46fmKm0NorHAeq8tYWWYf6uv5yC1DwzdpWVoYbOPufmFNvdEbxZt4AMdV0gKx3HI46EAXNOQVFg== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~GxetzGUNDgaBBXcTmLK6p9JBDX3I3QPshshbui1IaEWvJbQko-E36tCKwaJYHbleAWz9FqkAM_Tqx3YOmSVkVg== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~H1Wjd5kKWDW4t3SDodxiHV72V8WT0xwPubw5cJTNLkPRLgaILFPh-dpy8EOUNgy1KzrDujFsm9EcTsbuqtMPLA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~JpI5MH4zCgebUHFpXVn4zjtsGtMNnO7BQZWfNARAB5UWa9gqz6YXHR3uLCJ_AvJ3lh53BUVkavsx9TY2FMmxbA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~JujNYkJtcux0Ni4QnR64zu4Wz_zYjyKvYaYZm5ypxTLPSzF3_jNE_NO4sdbDamF8wEqWoky1uf4ZE0JT3L607A== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~KJSEA6DKnb2_FRPSqKZGh41eo-C8x448J9kEBrH012bUrZfOSDvrgmIrU0Vz7Ri3gaS9aKKmSaVMvXsHSlTJVA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~MStOwu3jBlJtcRnxrseVOuhI4kCj--ggFPG7sqrq5w1hjrI3bVyD-bm1Jwyx0noY3wT1rHDEvaGWnV2qsGjGwg== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~McsJ8kFVf3IjhgXIRdw8Xx-EXgbV071bmlj2BBnk52xrWl3sEeiIyxwUsF7mIWvMRWfcFfu4VGHYyqfk2BeHXw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~NHt9fVe4kDdbxnglKcEwXaRK-WsYEOaD23Kbl8SJPRMYHr_Z6SJd_HmG3BROHHR_M6TgSmucONpDJdTj5tjuFw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~Nfo2iwCPcfAcOBIVyoUAK0-PIfr5qYxIKZt-uaSaTBdrTNxAuJ1ItmeDPZ3VdJJmxD_c22No7x482bdd3_yYtw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~S2Qlu11xBhEd5aGSzWsnw1TR8u8PiOF93GO0j5bfNoAFCVzxKOwhRFoIXba2EpQnLQqFdIKyhWN3l70A4GPHmg== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~W7a7M37RO9jgck2zeR0471Pm7e8K0Kqj5tXEouDjvqKZXSrWxMaWD28oqkKKYAiU4608R4S9mM11KyphljdMSw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~XUo1oyPCrlL7CA74wG-OzQ06VOWJYWvHGFHU7keZN1SKaIXjHX5qi_kBzjG_rBCi89-S8GVmCy7S3PHSjG8SbQ== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~Xh0VmDvFNMELHu08-vrs54pegVyUwwDRxx_nXkwyD0NjnYozyqcGAKAr_QWHmw6F8XyuWg51M9KGpJJIFzzGuw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~Xve-wMBp_lxVUgD9qH5GwieGP9cAWtm0xULZvdGjBRUMvaevmpCB5gnbMBuIXAO6a1c9v6WUq0jNVX7ut5HvOw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~ZU1XkZFgnEE22CXEF-pOlcj5f10x-KM1Vw9d4IOLu-NiTZcz7koYPixhdrB1PJr8J-h9NpJmfqEastfxamA1jQ== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~_YkNYEHTsbbtFILJpzH3HenH0t4ShI25dIMdve541CF5bl-jPF3X3F7tq-t5dvP0TEkATsOJdLQdBp1xv4Q-ag== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~boy6mpn2jkwm60jjgQ0TG25UqRdN46LzmgTVCrpy6nBOgkLCGkGHcbceiwjU1itS_vj3-iQX0ZnrWOQrPyfHNA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~bwzpVZ9hAqGDHhXs2FRA82dfGfLmc7-m0uQhZDDfHHO7hQ17M_Np341BZX4WDLhYYS4cdUgaDodlNpdfpG3nXw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~cBxe-9PpAGFdAsYkmdN3lJVqEliLcRYlyoAov0aPZfJGwUr_cOm3XpjO7nmf_2eLf8UAx-rycjnJzw07xLrNCA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~dirWk6W4Pav1oyciuflfJlRu0iuxbYOmrpQapOJ0mV9C1SQ-jvDRv_7h753Cy18-SwULARUdWsyUy3yNNvxF7w== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~ebwZVjSEHroc9jtIm4jd_h_YAqEBcOkAZ4HPNJT8pLCldjRcTq-obQLakxXOhfuoOBlYBoZLuO-Y0lskeZRYKw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~gfcRcmRIr0h09d0jiZsA7nUeQv2XtapxuYEXZy1Z9um0tTJQvz-O5ef5f7zhLenLvjnDtDtlY_aY4Hvpce6e1Q== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~hgOgiVCyv2R0W-f0qKw5xYPeUwj8_ccCM9vKH_7vAQcCO9t8BwR1APGRBv20AONmp-PYMXmtgsBlQkNBRBpdQA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~hrhCl-YRAAr8ByNB_LCgEBsVNHMp92gTIUknetpUHMjcXl4Hpn_uY-h6C45oga0ZALnfGCo6iKTmiPLa4Qvnpg== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~n2yoR7JsyL4DSUwmjnpE4Iq9Qi_eeZrmpPU8cdehDFKfESK7nwxXxfrSMQbk0BQ2lgGPadoRcd1-qr1xVz97jA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~nMCcZm8WvPogyO_nuJ926Q3Q2dqVMN2LdjEL1Kq2wJ_RG-rH-e_6v41l1xZbCsQTa3XykQdEiXNc0HtAvT6IRA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~oc3C7xkUt-OWDL6rrsxs-seS4Fu1bqBWAAXCHalgShaGg9MUrOiRbHT2DcAnhyQFKx6x5FRbvjmYoQWrQiXJZA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~p-ihj7SEgkDXpMu9hvKE_wiX9cvtwyXrdIn964BfedXHKGpC6o7mMPxEyC0kRPVi_EZs_MRV5bAPEpl5h5we0g== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~qlhO_D9oE8uSKH-mZqyRF9pp4Zv1Tv0dIYcqrH4hb1VWlIxcdxmg2j0M8496cQeFXC5bn_JMXdBlD-d6cnFF8w== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~tjpiyIxJR_boTdUNrtFDuKIZoY84fI4lA1oMJbq9e2ZmYKIK5FeRN2O8cV_yMOYJGr4lbv03kTmT70mCjUc2_Q== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~wULeoj18eEKJWAKx1uFQVwS48cUGFcYPRJQj1Ro5XNJsWCwppGSCdIPhwifD6Z2f_j3zfI2SmC2Gg81sBXXW7g== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~zrEihMys4NVV5rx6FmuzEGO2TjloI3OiC7yzIhvqYoRo43ibb2F-Km6Jf4NX-ac62pOLBYZRcjQTvYMpn75_oA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Info.plist +0 -29
- package/Tests/Samples/9squares_AlBoardman.json +0 -1
- package/Tests/Samples/Boat_Loader.json +0 -1
- package/Tests/Samples/HamburgerArrow.json +0 -1
- package/Tests/Samples/IconTransitions.json +0 -1
- package/Tests/Samples/Images/dog.png +0 -0
- package/Tests/Samples/Issues/issue_1403.json +0 -1
- package/Tests/Samples/Issues/issue_1407.json +0 -1
- package/Tests/Samples/Issues/issue_1488.json +0 -1
- package/Tests/Samples/Issues/issue_1505.json +0 -1
- package/Tests/Samples/Issues/issue_1628.json +0 -1
- package/Tests/Samples/Issues/pr_1536.json +0 -1
- package/Tests/Samples/Issues/pr_1563.json +0 -8439
- package/Tests/Samples/Issues/pr_1592.json +0 -5527
- package/Tests/Samples/Issues/pr_1599.json +0 -738
- package/Tests/Samples/Issues/pr_1604_1.json +0 -1
- package/Tests/Samples/Issues/pr_1604_2.json +0 -1
- package/Tests/Samples/LottieFiles/LICENSE.md +0 -14
- package/Tests/Samples/LottieFiles/bounce_strokes.json +0 -1
- package/Tests/Samples/LottieFiles/cactus.json +0 -1
- package/Tests/Samples/LottieFiles/dog_car_ride.json +0 -1
- package/Tests/Samples/LottieFiles/draft_icon.json +0 -1
- package/Tests/Samples/LottieFiles/gradient_1.json +0 -1
- package/Tests/Samples/LottieFiles/gradient_2.json +0 -1
- package/Tests/Samples/LottieFiles/gradient_pill.json +0 -1
- package/Tests/Samples/LottieFiles/gradient_shapes.json +0 -1
- package/Tests/Samples/LottieFiles/gradient_square.json +0 -1
- package/Tests/Samples/LottieFiles/growth.json +0 -1
- package/Tests/Samples/LottieFiles/infinity_loader.json +0 -1
- package/Tests/Samples/LottieFiles/loading_dots_1.json +0 -1
- package/Tests/Samples/LottieFiles/loading_dots_2.json +0 -1
- package/Tests/Samples/LottieFiles/loading_dots_3.json +0 -1
- package/Tests/Samples/LottieFiles/loading_gradient_strokes.json +0 -1
- package/Tests/Samples/LottieFiles/settings_slider.json +0 -1
- package/Tests/Samples/LottieFiles/shop.json +0 -1
- package/Tests/Samples/LottieFiles/step_loader.json +0 -1
- package/Tests/Samples/LottieLogo1.json +0 -1
- package/Tests/Samples/LottieLogo1_masked.json +0 -1
- package/Tests/Samples/LottieLogo2.json +0 -1
- package/Tests/Samples/MotionCorpse_Jrcanest.json +0 -1
- package/Tests/Samples/Nonanimating/BasicLayers.json +0 -1
- package/Tests/Samples/Nonanimating/DisableNodesTest.json +0 -1
- package/Tests/Samples/Nonanimating/FirstText.json +0 -1
- package/Tests/Samples/Nonanimating/GeometryTransformTest.json +0 -1
- package/Tests/Samples/Nonanimating/Text_AnimatedProperties.json +0 -1
- package/Tests/Samples/Nonanimating/Text_Glyph.json +0 -1
- package/Tests/Samples/Nonanimating/Text_NoAnimation.json +0 -1
- package/Tests/Samples/Nonanimating/Text_NoGlyph.json +0 -1
- package/Tests/Samples/Nonanimating/Zoom.json +0 -1
- package/Tests/Samples/Nonanimating/_dog.json +0 -1
- package/Tests/Samples/Nonanimating/base64Test.json +0 -1
- package/Tests/Samples/Nonanimating/blend_mode_test.json +0 -1
- package/Tests/Samples/Nonanimating/keypathTest.json +0 -1
- package/Tests/Samples/Nonanimating/verifyLineHeight.json +0 -1
- package/Tests/Samples/PinJump.json +0 -1
- package/Tests/Samples/Private/BrokenLottieFiles/growth_man.json +0 -874
- package/Tests/Samples/Private/BrokenLottieFiles/rocket.json +0 -1
- package/Tests/Samples/Private/China_EmptyState_Itinerary.json +0 -1
- package/Tests/Samples/Private/LoaderHourglass.json +0 -12070
- package/Tests/Samples/Private/README.md +0 -7
- package/Tests/Samples/Private/Urgency/alarm_animated.json +0 -1
- package/Tests/Samples/Private/Urgency/diamond_animated.json +0 -1
- package/Tests/Samples/Private/Urgency/eye_animated.json +0 -1
- package/Tests/Samples/Private/Urgency/light_bulb_animated.json +0 -1
- package/Tests/Samples/Private/Urgency/light_bulb_static.json +0 -1
- package/Tests/Samples/Private/Urgency/piggy_bank_static.json +0 -1
- package/Tests/Samples/Private/Urgency/price_tag_legacy.json +0 -1
- package/Tests/Samples/Private/Urgency/rausch_alarm.json +0 -1
- package/Tests/Samples/Private/Urgency/rausch_alert.json +0 -1
- package/Tests/Samples/Private/Urgency/rausch_clock.json +0 -1
- package/Tests/Samples/Private/Urgency/rausch_diamond.json +0 -1
- package/Tests/Samples/Private/Urgency/rausch_money.json +0 -1
- package/Tests/Samples/Private/Urgency/rausch_piggy_bank.json +0 -1
- package/Tests/Samples/Private/Urgency/rausch_tag.json +0 -1
- package/Tests/Samples/Private/Urgency/red_envelope_animated.json +0 -1
- package/Tests/Samples/Private/Urgency/tag_animated.json +0 -1
- package/Tests/Samples/Private/Urgency/trophy_animated.json +0 -1
- package/Tests/Samples/Private/Urgency/wings_key_animated.json +0 -1
- package/Tests/Samples/Private/_flexible.json +0 -1
- package/Tests/Samples/Private/aircover.json +0 -1
- package/Tests/Samples/Private/belo_spin_rausch.json +0 -1
- package/Tests/Samples/Private/celebration.json +0 -2821
- package/Tests/Samples/Private/checkbox.json +0 -1
- package/Tests/Samples/Private/checkbox_small.json +0 -1
- package/Tests/Samples/Private/getting_your_trip_ready.json +0 -3540
- package/Tests/Samples/Private/gradient_afternoon.json +0 -1
- package/Tests/Samples/Private/gradient_brand.json +0 -1
- package/Tests/Samples/Private/gradient_evening.json +0 -1
- package/Tests/Samples/Private/gradient_morning.json +0 -1
- package/Tests/Samples/Private/issue_1467.json +0 -1
- package/Tests/Samples/Private/loading_dots.json +0 -1
- package/Tests/Samples/Private/loading_dots_small.json +0 -1
- package/Tests/Samples/Private/payment_loader.json +0 -1
- package/Tests/Samples/Private/radio_button.json +0 -1
- package/Tests/Samples/Private/selfie_intro.json +0 -1
- package/Tests/Samples/Private/stepper_add.json +0 -1
- package/Tests/Samples/Private/stepper_subtract.json +0 -1
- package/Tests/Samples/Private/switch.json +0 -1
- package/Tests/Samples/Private/thumb.json +0 -1
- package/Tests/Samples/Private/toggle_no.json +0 -1
- package/Tests/Samples/Private/toggle_yes.json +0 -1
- package/Tests/Samples/Private/user_error_black_and_white.json +0 -1
- package/Tests/Samples/Private/user_error_cut_off.json +0 -1
- package/Tests/Samples/Switch.json +0 -1
- package/Tests/Samples/Switch_States.json +0 -1
- package/Tests/Samples/TwitterHeart.json +0 -1
- package/Tests/Samples/TwitterHeartButton.json +0 -1
- package/Tests/Samples/TypeFace/A.json +0 -1
- package/Tests/Samples/TypeFace/Apostrophe.json +0 -1
- package/Tests/Samples/TypeFace/B.json +0 -1
- package/Tests/Samples/TypeFace/BlinkingCursor.json +0 -1
- package/Tests/Samples/TypeFace/C.json +0 -1
- package/Tests/Samples/TypeFace/Colon.json +0 -1
- package/Tests/Samples/TypeFace/Comma.json +0 -1
- package/Tests/Samples/TypeFace/D.json +0 -1
- package/Tests/Samples/TypeFace/E.json +0 -1
- package/Tests/Samples/TypeFace/F.json +0 -1
- package/Tests/Samples/TypeFace/G.json +0 -1
- package/Tests/Samples/TypeFace/H.json +0 -1
- package/Tests/Samples/TypeFace/I.json +0 -1
- package/Tests/Samples/TypeFace/J.json +0 -1
- package/Tests/Samples/TypeFace/K.json +0 -1
- package/Tests/Samples/TypeFace/L.json +0 -1
- package/Tests/Samples/TypeFace/M.json +0 -1
- package/Tests/Samples/TypeFace/N.json +0 -1
- package/Tests/Samples/TypeFace/O.json +0 -1
- package/Tests/Samples/TypeFace/P.json +0 -1
- package/Tests/Samples/TypeFace/Q.json +0 -1
- package/Tests/Samples/TypeFace/R.json +0 -1
- package/Tests/Samples/TypeFace/S.json +0 -1
- package/Tests/Samples/TypeFace/T.json +0 -1
- package/Tests/Samples/TypeFace/U.json +0 -1
- package/Tests/Samples/TypeFace/V.json +0 -1
- package/Tests/Samples/TypeFace/W.json +0 -1
- package/Tests/Samples/TypeFace/X.json +0 -1
- package/Tests/Samples/TypeFace/Y.json +0 -1
- package/Tests/Samples/TypeFace/Z.json +0 -1
- package/Tests/Samples/Watermelon.json +0 -1
- package/Tests/Samples/setValueTest.json +0 -1
- package/Tests/Samples/timeremap.json +0 -1
- package/Tests/Samples/vcTransition1.json +0 -1
- package/Tests/Samples/vcTransition2.json +0 -1
- package/script/lint/airbnb.swiftformat +0 -68
- package/script/lint/swiftlint.yml +0 -38
- package/script/test-carthage/Carthage/Build/.lottie-ios.version +0 -19
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/Info.plist +0 -46
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/BCSymbolMaps/BF971162-BE99-3507-B5B3-11947DC6B176.bcsymbolmap +0 -14778
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/Lottie.framework/Headers/Lottie-Swift.h +0 -673
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/Lottie.framework/Info.plist +0 -0
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/Lottie.framework/Lottie +0 -0
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/Lottie.framework/Modules/Lottie.swiftmodule/arm64-apple-ios.swiftdoc +0 -0
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/Lottie.framework/Modules/Lottie.swiftmodule/arm64-apple-ios.swiftmodule +0 -0
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/Lottie.framework/Modules/Lottie.swiftmodule/arm64.swiftdoc +0 -0
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/Lottie.framework/Modules/Lottie.swiftmodule/arm64.swiftmodule +0 -0
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/Lottie.framework/Modules/module.modulemap +0 -4
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/dSYMs/Lottie.framework.dSYM/Contents/Info.plist +0 -20
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/dSYMs/Lottie.framework.dSYM/Contents/Resources/DWARF/Lottie +0 -0
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Headers/Lottie-Swift.h +0 -1352
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Info.plist +0 -0
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Lottie +0 -0
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/Lottie.swiftmodule/Project/arm64-apple-ios-simulator.swiftsourceinfo +0 -0
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/Lottie.swiftmodule/Project/arm64.swiftsourceinfo +0 -0
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/Lottie.swiftmodule/Project/x86_64-apple-ios-simulator.swiftsourceinfo +0 -0
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/Lottie.swiftmodule/Project/x86_64.swiftsourceinfo +0 -0
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/Lottie.swiftmodule/arm64-apple-ios-simulator.swiftdoc +0 -0
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/Lottie.swiftmodule/arm64-apple-ios-simulator.swiftmodule +0 -0
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/Lottie.swiftmodule/arm64.swiftdoc +0 -0
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/Lottie.swiftmodule/arm64.swiftmodule +0 -0
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/Lottie.swiftmodule/x86_64-apple-ios-simulator.swiftdoc +0 -0
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/Lottie.swiftmodule/x86_64-apple-ios-simulator.swiftmodule +0 -0
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/Lottie.swiftmodule/x86_64.swiftdoc +0 -0
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/Lottie.swiftmodule/x86_64.swiftmodule +0 -0
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/module.modulemap +0 -4
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/_CodeSignature/CodeResources +0 -256
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/dSYMs/Lottie.framework.dSYM/Contents/Info.plist +0 -20
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/dSYMs/Lottie.framework.dSYM/Contents/Resources/DWARF/Lottie +0 -0
- package/script/test-carthage/Carthage/Checkouts/lottie-ios/Lottie.xcodeproj/project.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- package/script/test-carthage/Carthage/Checkouts/lottie-ios/Lottie.xcodeproj/xcuserdata/cal.xcuserdatad/xcschemes/xcschememanagement.plist +0 -37
- package/script/test-carthage/Carthage/Checkouts/lottie-ios/Lottie.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
|
@@ -29,18 +29,36 @@ extension GradientRenderLayer {
|
|
|
29
29
|
// MARK: Internal
|
|
30
30
|
|
|
31
31
|
/// Adds gradient-related animations to this layer, from the given `GradientFill`
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
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
|
+
{
|
|
39
|
+
// We have to set `colors` and `locations` to non-nil values
|
|
40
|
+
// for the animations below to actually take effect
|
|
41
|
+
locations = []
|
|
42
|
+
|
|
43
|
+
// The initial value for `colors` must be an array with the exact same number of colors
|
|
44
|
+
// as the gradient that will be applied in the `CAAnimation`
|
|
45
|
+
switch type {
|
|
46
|
+
case .rgb:
|
|
47
|
+
colors = .init(
|
|
48
|
+
repeating: CGColor.rgb(0, 0, 0),
|
|
49
|
+
count: gradient.numberOfColors)
|
|
50
|
+
|
|
51
|
+
case .alpha:
|
|
52
|
+
colors = .init(
|
|
53
|
+
repeating: CGColor.rgb(0, 0, 0),
|
|
54
|
+
count: gradient.colorConfiguration(from: gradient.colors.keyframes[0].value, type: .alpha).count)
|
|
55
|
+
}
|
|
38
56
|
|
|
39
57
|
try addAnimation(
|
|
40
58
|
for: .colors,
|
|
41
59
|
keyframes: gradient.colors.keyframes,
|
|
42
60
|
value: { colorComponents in
|
|
43
|
-
|
|
61
|
+
gradient.colorConfiguration(from: colorComponents, type: type).map { $0.color }
|
|
44
62
|
},
|
|
45
63
|
context: context)
|
|
46
64
|
|
|
@@ -48,7 +66,7 @@ extension GradientRenderLayer {
|
|
|
48
66
|
for: .locations,
|
|
49
67
|
keyframes: gradient.colors.keyframes,
|
|
50
68
|
value: { colorComponents in
|
|
51
|
-
|
|
69
|
+
gradient.colorConfiguration(from: colorComponents, type: type).map { $0.location }
|
|
52
70
|
},
|
|
53
71
|
context: context)
|
|
54
72
|
|
|
@@ -98,10 +116,10 @@ extension GradientRenderLayer {
|
|
|
98
116
|
// at any given time requires knowing the current `startPoint`,
|
|
99
117
|
// we can't allow them to animate separately.
|
|
100
118
|
let absoluteStartPoint = try gradient.startPoint
|
|
101
|
-
.exactlyOneKeyframe(context: context, description: "gradient startPoint").
|
|
119
|
+
.exactlyOneKeyframe(context: context, description: "gradient startPoint").pointValue
|
|
102
120
|
|
|
103
121
|
let absoluteEndPoint = try gradient.endPoint
|
|
104
|
-
.exactlyOneKeyframe(context: context, description: "gradient endPoint").
|
|
122
|
+
.exactlyOneKeyframe(context: context, description: "gradient endPoint").pointValue
|
|
105
123
|
|
|
106
124
|
startPoint = percentBasedPointInBounds(from: absoluteStartPoint)
|
|
107
125
|
|
|
@@ -113,55 +131,92 @@ extension GradientRenderLayer {
|
|
|
113
131
|
}
|
|
114
132
|
}
|
|
115
133
|
|
|
134
|
+
// MARK: - GradientContentType
|
|
135
|
+
|
|
136
|
+
/// Each type of gradient that can be constructed from a `GradientShapeItem`
|
|
137
|
+
enum GradientContentType {
|
|
138
|
+
case rgb
|
|
139
|
+
case alpha
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/// `colors` and `locations` configuration for a `CAGradientLayer`
|
|
143
|
+
typealias GradientColorConfiguration = [(color: CGColor, location: CGFloat)]
|
|
144
|
+
|
|
116
145
|
extension GradientShapeItem {
|
|
146
|
+
|
|
147
|
+
// MARK: Internal
|
|
148
|
+
|
|
149
|
+
/// Whether or not this `GradientShapeItem` includes an alpha component
|
|
150
|
+
/// that has to be rendered as a separate `CAGradientLayer` from the
|
|
151
|
+
/// layer that renders the rgb color components
|
|
152
|
+
var hasAlphaComponent: Bool {
|
|
153
|
+
for colorComponentsKeyframe in colors.keyframes {
|
|
154
|
+
let colorComponents = colorComponentsKeyframe.value
|
|
155
|
+
let alphaConfiguration = colorConfiguration(from: colorComponents, type: .alpha)
|
|
156
|
+
|
|
157
|
+
let notFullyOpaque = alphaConfiguration.contains(where: { color, _ in
|
|
158
|
+
color.alpha < 0.999
|
|
159
|
+
})
|
|
160
|
+
|
|
161
|
+
if notFullyOpaque {
|
|
162
|
+
return true
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
return false
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
// MARK: Fileprivate
|
|
170
|
+
|
|
117
171
|
/// Converts the compact `[Double]` color components representation
|
|
118
172
|
/// into an array of `CGColor`s and the location of those colors within the gradient.
|
|
119
173
|
/// - The color components array is a repeating list of `[location, red, green, blue]` values
|
|
120
174
|
/// for each color in the gradient, followed by an optional repeating list of
|
|
121
175
|
/// `[location, alpha]` values that control the colors' alpha values.
|
|
176
|
+
/// - The RGB and alpha values can have different color stops / locations,
|
|
177
|
+
/// so each has to be rendered in a separate `CAGradientLayer`.
|
|
122
178
|
fileprivate func colorConfiguration(
|
|
123
179
|
from colorComponents: [Double],
|
|
124
|
-
|
|
125
|
-
->
|
|
180
|
+
type: GradientContentType)
|
|
181
|
+
-> GradientColorConfiguration
|
|
126
182
|
{
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
183
|
+
switch type {
|
|
184
|
+
case .rgb:
|
|
185
|
+
precondition(
|
|
186
|
+
colorComponents.count >= numberOfColors * 4,
|
|
187
|
+
"Each color must have RGB components and a location component")
|
|
130
188
|
|
|
131
|
-
|
|
189
|
+
// Each group of four `Double` values represents a single `CGColor`,
|
|
190
|
+
// and its relative location within the gradient.
|
|
191
|
+
var colors = GradientColorConfiguration()
|
|
132
192
|
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
for colorIndex in 0..<numberOfColors {
|
|
136
|
-
let colorStartIndex = colorIndex * 4
|
|
193
|
+
for colorIndex in 0..<numberOfColors {
|
|
194
|
+
let colorStartIndex = colorIndex * 4
|
|
137
195
|
|
|
138
|
-
|
|
196
|
+
let colorLocation = CGFloat(colorComponents[colorStartIndex])
|
|
139
197
|
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
if alphaLocation == colorLocation {
|
|
147
|
-
alpha = colorComponents[alphaIndex + 1]
|
|
148
|
-
} else {
|
|
149
|
-
try context.logCompatibilityIssue("""
|
|
150
|
-
The Core Animation rendering engine currently expects gradient colors and alpha values
|
|
151
|
-
to be in the same order, with the same color stops / locations.
|
|
152
|
-
""")
|
|
153
|
-
}
|
|
198
|
+
let color = CGColor.rgb(
|
|
199
|
+
CGFloat(colorComponents[colorStartIndex + 1]),
|
|
200
|
+
CGFloat(colorComponents[colorStartIndex + 2]),
|
|
201
|
+
CGFloat(colorComponents[colorStartIndex + 3]))
|
|
202
|
+
|
|
203
|
+
colors.append((color: color, location: colorLocation))
|
|
154
204
|
}
|
|
155
205
|
|
|
156
|
-
|
|
157
|
-
CGFloat(colorComponents[colorStartIndex + 1]),
|
|
158
|
-
CGFloat(colorComponents[colorStartIndex + 2]),
|
|
159
|
-
CGFloat(colorComponents[colorStartIndex + 3]),
|
|
160
|
-
CGFloat(alpha))
|
|
206
|
+
return colors
|
|
161
207
|
|
|
162
|
-
|
|
163
|
-
|
|
208
|
+
case .alpha:
|
|
209
|
+
// After the rgb color components, there can be arbitrary number of repeating
|
|
210
|
+
// `[alphaLocation, alphaValue]` pairs that define a separate alpha gradient.
|
|
211
|
+
var alphaValues = GradientColorConfiguration()
|
|
212
|
+
|
|
213
|
+
for alphaIndex in stride(from: numberOfColors * 4, to: colorComponents.endIndex, by: 2) {
|
|
214
|
+
let alphaLocation = CGFloat(colorComponents[alphaIndex])
|
|
215
|
+
let alphaValue = CGFloat(colorComponents[alphaIndex + 1])
|
|
216
|
+
alphaValues.append((color: .rgba(0, 0, 0, alphaValue), location: alphaLocation))
|
|
217
|
+
}
|
|
164
218
|
|
|
165
|
-
|
|
219
|
+
return alphaValues
|
|
220
|
+
}
|
|
166
221
|
}
|
|
167
222
|
}
|
|
@@ -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
|
|
|
@@ -14,14 +14,12 @@ extension CAShapeLayer {
|
|
|
14
14
|
{
|
|
15
15
|
try addAnimation(
|
|
16
16
|
for: .path,
|
|
17
|
-
keyframes: rectangle.
|
|
18
|
-
value: {
|
|
17
|
+
keyframes: try rectangle.combinedKeyframes(context: context).keyframes,
|
|
18
|
+
value: { keyframe in
|
|
19
19
|
BezierPath.rectangle(
|
|
20
|
-
position:
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
cornerRadius: try rectangle.cornerRadius
|
|
24
|
-
.exactlyOneKeyframe(context: context, description: "rectangle cornerRadius").value.cgFloatValue,
|
|
20
|
+
position: keyframe.position.pointValue,
|
|
21
|
+
size: keyframe.size.sizeValue,
|
|
22
|
+
cornerRadius: keyframe.cornerRadius.cgFloatValue,
|
|
25
23
|
direction: rectangle.direction)
|
|
26
24
|
.cgPath()
|
|
27
25
|
.duplicated(times: pathMultiplier)
|
|
@@ -29,3 +27,32 @@ extension CAShapeLayer {
|
|
|
29
27
|
context: context)
|
|
30
28
|
}
|
|
31
29
|
}
|
|
30
|
+
|
|
31
|
+
extension Rectangle {
|
|
32
|
+
/// Data that represents how to render a rectangle at a specific point in time
|
|
33
|
+
struct Keyframe {
|
|
34
|
+
let size: Vector3D
|
|
35
|
+
let position: Vector3D
|
|
36
|
+
let cornerRadius: Vector1D
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/// Creates a single array of animatable keyframes from the separate arrays of keyframes in this Rectangle
|
|
40
|
+
func combinedKeyframes(context: LayerAnimationContext) throws-> KeyframeGroup<Rectangle.Keyframe> {
|
|
41
|
+
let combinedKeyframes = Keyframes.combinedIfPossible(
|
|
42
|
+
size, position, cornerRadius,
|
|
43
|
+
makeCombinedResult: Rectangle.Keyframe.init)
|
|
44
|
+
|
|
45
|
+
if let combinedKeyframes = combinedKeyframes {
|
|
46
|
+
return combinedKeyframes
|
|
47
|
+
} else {
|
|
48
|
+
// If we weren't able to combine all of the keyframes, we have to take the timing values
|
|
49
|
+
// from one property and use a fixed value for the other properties.
|
|
50
|
+
return try size.map { sizeValue in
|
|
51
|
+
Keyframe(
|
|
52
|
+
size: sizeValue,
|
|
53
|
+
position: try position.exactlyOneKeyframe(context: context, description: "rectangle position"),
|
|
54
|
+
cornerRadius: try cornerRadius.exactlyOneKeyframe(context: context, description: "rectangle cornerRadius"))
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
@@ -120,25 +120,36 @@ extension Trim {
|
|
|
120
120
|
let interpolatedStrokeEnd = strokeEnd.manuallyInterpolateKeyframes()
|
|
121
121
|
let interpolatedStrokeOffset = offset.manuallyInterpolateKeyframes()
|
|
122
122
|
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
123
|
+
var adjustedStrokeStart = KeyframeGroup(
|
|
124
|
+
keyframes: try adjustKeyframesForTrimOffsets(
|
|
125
|
+
strokeKeyframes: interpolatedStrokeStart,
|
|
126
|
+
offsetKeyframes: interpolatedStrokeOffset,
|
|
127
|
+
context: context))
|
|
128
|
+
|
|
129
|
+
var adjustedStrokeEnd = KeyframeGroup(
|
|
130
|
+
keyframes: try adjustKeyframesForTrimOffsets(
|
|
131
|
+
strokeKeyframes: interpolatedStrokeEnd,
|
|
132
|
+
offsetKeyframes: interpolatedStrokeOffset,
|
|
133
|
+
context: context))
|
|
132
134
|
|
|
133
135
|
// If maximum stroke value is larger than 100%, then we have to create copies of the path
|
|
134
136
|
// so the total path length includes the maximum stroke
|
|
135
|
-
let
|
|
136
|
-
let
|
|
137
|
+
let startStrokes = adjustedStrokeStart.keyframes.map { $0.value.cgFloatValue }
|
|
138
|
+
let endStrokes = adjustedStrokeEnd.keyframes.map { $0.value.cgFloatValue }
|
|
139
|
+
let minimumStrokeMultiplier = Double(floor((startStrokes.min() ?? 0) / 100.0))
|
|
140
|
+
let maximumStrokeMultiplier = Double(ceil((endStrokes.max() ?? 100) / 100.0))
|
|
141
|
+
|
|
142
|
+
if minimumStrokeMultiplier < 0 {
|
|
143
|
+
// Core Animation doesn't support negative stroke offsets, so we have to
|
|
144
|
+
// shift all of the offset values up by the minimum
|
|
145
|
+
adjustedStrokeStart = adjustedStrokeStart.map { Vector1D($0.value + (abs(minimumStrokeMultiplier) * 100.0)) }
|
|
146
|
+
adjustedStrokeEnd = adjustedStrokeEnd.map { Vector1D($0.value + (abs(minimumStrokeMultiplier) * 100.0)) }
|
|
147
|
+
}
|
|
137
148
|
|
|
138
149
|
return (
|
|
139
|
-
strokeStart:
|
|
140
|
-
strokeEnd:
|
|
141
|
-
pathMultiplier:
|
|
150
|
+
strokeStart: adjustedStrokeStart,
|
|
151
|
+
strokeEnd: adjustedStrokeEnd,
|
|
152
|
+
pathMultiplier: Int(abs(maximumStrokeMultiplier) + abs(minimumStrokeMultiplier)))
|
|
142
153
|
}
|
|
143
154
|
|
|
144
155
|
// MARK: Private
|
|
@@ -36,25 +36,16 @@ extension CAShapeLayer {
|
|
|
36
36
|
{
|
|
37
37
|
try addAnimation(
|
|
38
38
|
for: .path,
|
|
39
|
-
keyframes: star.
|
|
40
|
-
value: {
|
|
41
|
-
// We can only use one set of keyframes to animate a given CALayer keypath,
|
|
42
|
-
// so we currently animate `position` and ignore any other keyframes.
|
|
43
|
-
// TODO: Is there a way to support this properly?
|
|
39
|
+
keyframes: try star.combinedKeyframes(context: context).keyframes,
|
|
40
|
+
value: { keyframe in
|
|
44
41
|
BezierPath.star(
|
|
45
|
-
position: position.pointValue,
|
|
46
|
-
outerRadius:
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
innerRoundedness: try star.innerRoundness?
|
|
53
|
-
.exactlyOneKeyframe(context: context, description: "innerRoundness").value.cgFloatValue ?? 0,
|
|
54
|
-
numberOfPoints: try star.points
|
|
55
|
-
.exactlyOneKeyframe(context: context, description: "points").value.cgFloatValue,
|
|
56
|
-
rotation: try star.rotation
|
|
57
|
-
.exactlyOneKeyframe(context: context, description: "rotation").value.cgFloatValue,
|
|
42
|
+
position: keyframe.position.pointValue,
|
|
43
|
+
outerRadius: keyframe.outerRadius.cgFloatValue,
|
|
44
|
+
innerRadius: keyframe.innerRadius.cgFloatValue,
|
|
45
|
+
outerRoundedness: keyframe.outerRoundness.cgFloatValue,
|
|
46
|
+
innerRoundedness: keyframe.innerRoundness.cgFloatValue,
|
|
47
|
+
numberOfPoints: keyframe.points.cgFloatValue,
|
|
48
|
+
rotation: keyframe.rotation.cgFloatValue,
|
|
58
49
|
direction: star.direction)
|
|
59
50
|
.cgPath()
|
|
60
51
|
.duplicated(times: pathMultiplier)
|
|
@@ -71,21 +62,14 @@ extension CAShapeLayer {
|
|
|
71
62
|
{
|
|
72
63
|
try addAnimation(
|
|
73
64
|
for: .path,
|
|
74
|
-
keyframes: star.
|
|
75
|
-
value: {
|
|
76
|
-
// We can only use one set of keyframes to animate a given CALayer keypath,
|
|
77
|
-
// so we currently animate `position` and ignore any other keyframes.
|
|
78
|
-
// TODO: Is there a way to support this properly?
|
|
65
|
+
keyframes: try star.combinedKeyframes(context: context).keyframes,
|
|
66
|
+
value: { keyframe in
|
|
79
67
|
BezierPath.polygon(
|
|
80
|
-
position: position.pointValue,
|
|
81
|
-
numberOfPoints:
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
outerRoundedness: try star.outerRoundness
|
|
86
|
-
.exactlyOneKeyframe(context: context, description: "outerRoundedness").value.cgFloatValue,
|
|
87
|
-
rotation: try star.rotation
|
|
88
|
-
.exactlyOneKeyframe(context: context, description: "rotation").value.cgFloatValue,
|
|
68
|
+
position: keyframe.position.pointValue,
|
|
69
|
+
numberOfPoints: keyframe.points.cgFloatValue,
|
|
70
|
+
outerRadius: keyframe.outerRadius.cgFloatValue,
|
|
71
|
+
outerRoundedness: keyframe.outerRoundness.cgFloatValue,
|
|
72
|
+
rotation: keyframe.rotation.cgFloatValue,
|
|
89
73
|
direction: star.direction)
|
|
90
74
|
.cgPath()
|
|
91
75
|
.duplicated(times: pathMultiplier)
|
|
@@ -93,3 +77,48 @@ extension CAShapeLayer {
|
|
|
93
77
|
context: context)
|
|
94
78
|
}
|
|
95
79
|
}
|
|
80
|
+
|
|
81
|
+
extension Star {
|
|
82
|
+
/// Data that represents how to render a star at a specific point in time
|
|
83
|
+
struct Keyframe {
|
|
84
|
+
let position: Vector3D
|
|
85
|
+
let outerRadius: Vector1D
|
|
86
|
+
let innerRadius: Vector1D
|
|
87
|
+
let outerRoundness: Vector1D
|
|
88
|
+
let innerRoundness: Vector1D
|
|
89
|
+
let points: Vector1D
|
|
90
|
+
let rotation: Vector1D
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/// Creates a single array of animatable keyframes from the separate arrays of keyframes in this star/polygon
|
|
94
|
+
func combinedKeyframes(context: LayerAnimationContext) throws -> KeyframeGroup<Keyframe> {
|
|
95
|
+
let combinedKeyframes = Keyframes.combinedIfPossible(
|
|
96
|
+
position,
|
|
97
|
+
outerRadius,
|
|
98
|
+
innerRadius ?? KeyframeGroup(Vector1D(0)),
|
|
99
|
+
outerRoundness,
|
|
100
|
+
innerRoundness ?? KeyframeGroup(Vector1D(0)),
|
|
101
|
+
points,
|
|
102
|
+
rotation,
|
|
103
|
+
makeCombinedResult: Star.Keyframe.init)
|
|
104
|
+
|
|
105
|
+
if let combinedKeyframes = combinedKeyframes {
|
|
106
|
+
return combinedKeyframes
|
|
107
|
+
} else {
|
|
108
|
+
// If we weren't able to combine all of the keyframes, we have to take the timing values
|
|
109
|
+
// from one property and use a fixed value for the other properties.
|
|
110
|
+
return try position.map { positionValue in
|
|
111
|
+
Keyframe(
|
|
112
|
+
position: positionValue,
|
|
113
|
+
outerRadius: try outerRadius.exactlyOneKeyframe(context: context, description: "star outerRadius"),
|
|
114
|
+
innerRadius: try innerRadius?.exactlyOneKeyframe(context: context, description: "star innerRadius")
|
|
115
|
+
?? Vector1D(0),
|
|
116
|
+
outerRoundness: try outerRoundness.exactlyOneKeyframe(context: context, description: "star outerRoundness"),
|
|
117
|
+
innerRoundness: try innerRoundness?.exactlyOneKeyframe(context: context, description: "star innerRoundness")
|
|
118
|
+
?? Vector1D(0),
|
|
119
|
+
points: try points.exactlyOneKeyframe(context: context, description: "star points"),
|
|
120
|
+
rotation: try rotation.exactlyOneKeyframe(context: context, description: "star rotation"))
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
@@ -55,9 +55,13 @@ extension CAShapeLayer {
|
|
|
55
55
|
try addOpacityAnimation(for: stroke, context: context)
|
|
56
56
|
|
|
57
57
|
if let (dashPattern, dashPhase) = stroke.dashPattern?.shapeLayerConfiguration {
|
|
58
|
-
lineDashPattern = try dashPattern.map {
|
|
58
|
+
let lineDashPattern = try dashPattern.map {
|
|
59
59
|
try KeyframeGroup(keyframes: $0)
|
|
60
|
-
.exactlyOneKeyframe(context: context, description: "stroke dashPattern").
|
|
60
|
+
.exactlyOneKeyframe(context: context, description: "stroke dashPattern").cgFloatValue
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
if lineDashPattern.isSupportedLayerDashPattern {
|
|
64
|
+
self.lineDashPattern = lineDashPattern as [NSNumber]
|
|
61
65
|
}
|
|
62
66
|
|
|
63
67
|
try addAnimation(
|