diff --git a/Example/Example.xcodeproj/project.pbxproj b/Example/Example.xcodeproj/project.pbxproj index 7d498b1e46..a011989167 100644 --- a/Example/Example.xcodeproj/project.pbxproj +++ b/Example/Example.xcodeproj/project.pbxproj @@ -359,6 +359,7 @@ MARKETING_VERSION = 1.0; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; + OTHER_SWIFT_FLAGS = "-warnings-as-errors -enable-upcoming-feature StrictConcurrency -warn-concurrency -enable-actor-data-race-checks"; PRODUCT_BUNDLE_IDENTIFIER = com.airbnb.Example; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = auto; @@ -407,6 +408,7 @@ MACOSX_DEPLOYMENT_TARGET = 13.0; MARKETING_VERSION = 1.0; MTL_FAST_MATH = YES; + OTHER_SWIFT_FLAGS = "-warnings-as-errors -enable-upcoming-feature StrictConcurrency -warn-concurrency -enable-actor-data-race-checks"; PRODUCT_BUNDLE_IDENTIFIER = com.airbnb.Example; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = auto; @@ -443,6 +445,7 @@ ); MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; + OTHER_SWIFT_FLAGS = "-enable-upcoming-feature StrictConcurrency -warn-concurrency"; PRODUCT_BUNDLE_IDENTIFIER = com.airbnb.lottie.example.iOS; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; @@ -472,6 +475,7 @@ "@executable_path/Frameworks", ); MTL_FAST_MATH = YES; + OTHER_SWIFT_FLAGS = "-enable-upcoming-feature StrictConcurrency -warn-concurrency"; PRODUCT_BUNDLE_IDENTIFIER = com.airbnb.lottie.example.iOS; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; diff --git a/Example/Example/RemoteAnimationDemoView.swift b/Example/Example/RemoteAnimationDemoView.swift index 3e6fc8e3f8..488e362994 100644 --- a/Example/Example/RemoteAnimationDemoView.swift +++ b/Example/Example/RemoteAnimationDemoView.swift @@ -6,6 +6,7 @@ import SwiftUI // MARK: - AnimationListView +@MainActor struct RemoteAnimationsDemoView: View { struct Item: Hashable { diff --git a/Lottie.xcodeproj/project.pbxproj b/Lottie.xcodeproj/project.pbxproj index bdbcdbc5cf..ecf635e999 100644 --- a/Lottie.xcodeproj/project.pbxproj +++ b/Lottie.xcodeproj/project.pbxproj @@ -3229,6 +3229,7 @@ MARKETING_VERSION = 1.0; MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu11 gnu++17"; + OTHER_SWIFT_FLAGS = "-warnings-as-errors"; PRODUCT_BUNDLE_IDENTIFIER = com.airbnb.Lottie; PRODUCT_NAME = Lottie; SKIP_INSTALL = YES; @@ -3262,6 +3263,7 @@ MARKETING_VERSION = 1.0; MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu11 gnu++17"; + OTHER_SWIFT_FLAGS = "-warnings-as-errors"; PRODUCT_BUNDLE_IDENTIFIER = com.airbnb.Lottie; PRODUCT_NAME = Lottie; SKIP_INSTALL = YES; @@ -3334,6 +3336,7 @@ MARKETING_VERSION = 1.0; MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu11 gnu++17"; + OTHER_SWIFT_FLAGS = "-warnings-as-errors"; PRODUCT_BUNDLE_IDENTIFIER = com.airbnb.Lottie; PRODUCT_NAME = Lottie; SDKROOT = macosx; @@ -3368,6 +3371,7 @@ MARKETING_VERSION = 1.0; MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu11 gnu++17"; + OTHER_SWIFT_FLAGS = "-warnings-as-errors"; PRODUCT_BUNDLE_IDENTIFIER = com.airbnb.Lottie; PRODUCT_NAME = Lottie; SDKROOT = macosx; @@ -3400,6 +3404,7 @@ MARKETING_VERSION = 1.0; MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu11 gnu++17"; + OTHER_SWIFT_FLAGS = "-warnings-as-errors"; PRODUCT_BUNDLE_IDENTIFIER = com.airbnb.Lottie; PRODUCT_NAME = Lottie; SDKROOT = appletvos; @@ -3434,6 +3439,7 @@ MARKETING_VERSION = 1.0; MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu11 gnu++17"; + OTHER_SWIFT_FLAGS = "-warnings-as-errors"; PRODUCT_BUNDLE_IDENTIFIER = com.airbnb.Lottie; PRODUCT_NAME = Lottie; SDKROOT = appletvos; diff --git a/Rakefile b/Rakefile index 06a219cce5..d5de72bf65 100644 --- a/Rakefile +++ b/Rakefile @@ -9,17 +9,17 @@ namespace :build do desc 'Builds the Lottie package for iOS' task :iOS do - xcodebuild('build -scheme "Lottie (iOS)" -destination generic/platform=iOS -workspace Lottie.xcworkspace') + xcodebuild('build -scheme "Lottie (iOS)" -destination generic/platform=iOS -workspace Lottie.xcworkspace OTHER_SWIFT_FLAGS="-warnings-as-errors"') end desc 'Builds the Lottie package for macOS' task :macOS do - xcodebuild('build -scheme "Lottie (macOS)" -destination generic/platform=macOS -workspace Lottie.xcworkspace') + xcodebuild('build -scheme "Lottie (macOS)" -destination generic/platform=macOS -workspace Lottie.xcworkspace OTHER_SWIFT_FLAGS="-warnings-as-errors"') end desc 'Builds the Lottie package for tvOS' task :tvOS do - xcodebuild('build -scheme "Lottie (tvOS)" -destination generic/platform=tvOS -workspace Lottie.xcworkspace') + xcodebuild('build -scheme "Lottie (tvOS)" -destination generic/platform=tvOS -workspace Lottie.xcworkspace OTHER_SWIFT_FLAGS="-warnings-as-errors"') end end diff --git a/Sources/Private/Model/Assets/Asset.swift b/Sources/Private/Model/Assets/Asset.swift index d610b1ce55..9fcfcb6a41 100644 --- a/Sources/Private/Model/Assets/Asset.swift +++ b/Sources/Private/Model/Assets/Asset.swift @@ -7,6 +7,8 @@ import Foundation +// MARK: - Asset + public class Asset: Codable, DictionaryInitializable { // MARK: Lifecycle @@ -41,3 +43,9 @@ public class Asset: Codable, DictionaryInitializable { case id } } + +// MARK: Sendable + +/// Since `Asset` isn't `final`, we have to use `@unchecked Sendable` instead of `Sendable.` +/// All `Asset` subclasses are immutable `Sendable` values. +extension Asset: @unchecked Sendable { } diff --git a/Sources/Private/Model/Assets/AssetLibrary.swift b/Sources/Private/Model/Assets/AssetLibrary.swift index ba44c3bc44..bc9d24ac65 100644 --- a/Sources/Private/Model/Assets/AssetLibrary.swift +++ b/Sources/Private/Model/Assets/AssetLibrary.swift @@ -7,7 +7,7 @@ import Foundation -final class AssetLibrary: Codable, AnyInitializable { +final class AssetLibrary: Codable, AnyInitializable, Sendable { // MARK: Lifecycle diff --git a/Sources/Private/Model/Keyframes/KeyframeGroup.swift b/Sources/Private/Model/Keyframes/KeyframeGroup.swift index 8fca5380f6..a19b6bc8d9 100644 --- a/Sources/Private/Model/Keyframes/KeyframeGroup.swift +++ b/Sources/Private/Model/Keyframes/KeyframeGroup.swift @@ -203,6 +203,10 @@ extension KeyframeGroup: Hashable where T: Hashable { } } +// MARK: Sendable + +extension KeyframeGroup: Sendable where T: Sendable { } + extension Keyframe { /// Creates a copy of this `Keyframe` with the same timing data, but a different value func withValue(_ newValue: Value) -> Keyframe { diff --git a/Sources/Private/Model/Layers/LayerModel.swift b/Sources/Private/Model/Layers/LayerModel.swift index 5fc3807f61..43c629cb13 100644 --- a/Sources/Private/Model/Layers/LayerModel.swift +++ b/Sources/Private/Model/Layers/LayerModel.swift @@ -226,3 +226,9 @@ extension Array where Element == LayerModel { } } } + +// MARK: - LayerModel + Sendable + +/// Since `LayerModel` isn't `final`, we have to use `@unchecked Sendable` instead of `Sendable.` +/// All `LayerModel` subclasses are immutable `Sendable` values. +extension LayerModel: @unchecked Sendable { } diff --git a/Sources/Private/Model/Objects/Marker.swift b/Sources/Private/Model/Objects/Marker.swift index d981a2cd0c..f689f9e58c 100644 --- a/Sources/Private/Model/Objects/Marker.swift +++ b/Sources/Private/Model/Objects/Marker.swift @@ -8,7 +8,7 @@ import Foundation /// A time marker -final class Marker: Codable, DictionaryInitializable { +final class Marker: Codable, Sendable, DictionaryInitializable { // MARK: Lifecycle diff --git a/Sources/Private/Model/ShapeItems/GradientFill.swift b/Sources/Private/Model/ShapeItems/GradientFill.swift index 71d185655c..afc3d8865b 100644 --- a/Sources/Private/Model/ShapeItems/GradientFill.swift +++ b/Sources/Private/Model/ShapeItems/GradientFill.swift @@ -9,7 +9,7 @@ import Foundation // MARK: - GradientType -enum GradientType: Int, Codable { +enum GradientType: Int, Codable, Sendable { case none case linear case radial diff --git a/Sources/Private/Model/ShapeItems/GradientStroke.swift b/Sources/Private/Model/ShapeItems/GradientStroke.swift index f29b1c6a08..0a1fedeb1e 100644 --- a/Sources/Private/Model/ShapeItems/GradientStroke.swift +++ b/Sources/Private/Model/ShapeItems/GradientStroke.swift @@ -9,7 +9,7 @@ import Foundation // MARK: - LineCap -enum LineCap: Int, Codable { +enum LineCap: Int, Codable, Sendable { case none case butt case round @@ -18,7 +18,7 @@ enum LineCap: Int, Codable { // MARK: - LineJoin -enum LineJoin: Int, Codable { +enum LineJoin: Int, Codable, Sendable { case none case miter case round diff --git a/Sources/Private/Model/ShapeItems/Merge.swift b/Sources/Private/Model/ShapeItems/Merge.swift index 3b35e8b1c9..2c4e9a61b5 100644 --- a/Sources/Private/Model/ShapeItems/Merge.swift +++ b/Sources/Private/Model/ShapeItems/Merge.swift @@ -9,7 +9,7 @@ import Foundation // MARK: - MergeMode -enum MergeMode: Int, Codable { +enum MergeMode: Int, Codable, Sendable { case none case merge case add diff --git a/Sources/Private/Model/ShapeItems/ShapeItem.swift b/Sources/Private/Model/ShapeItems/ShapeItem.swift index a22f50ba3f..0738c93234 100644 --- a/Sources/Private/Model/ShapeItems/ShapeItem.swift +++ b/Sources/Private/Model/ShapeItems/ShapeItem.swift @@ -52,7 +52,7 @@ extension ShapeType: ClassFamily { // MARK: - ShapeType -enum ShapeType: String, Codable { +enum ShapeType: String, Codable, Sendable { case ellipse = "el" case fill = "fl" case gradientFill = "gf" @@ -165,3 +165,9 @@ extension Array where Element == ShapeItem { } } } + +// MARK: - ShapeItem + Sendable + +/// Since `ShapeItem` isn't `final`, we have to use `@unchecked Sendable` instead of `Sendable.` +/// All `ShapeItem` subclasses are immutable `Sendable` values. +extension ShapeItem: @unchecked Sendable { } diff --git a/Sources/Private/Model/ShapeItems/Star.swift b/Sources/Private/Model/ShapeItems/Star.swift index e13e47a0d6..31a7dce147 100644 --- a/Sources/Private/Model/ShapeItems/Star.swift +++ b/Sources/Private/Model/ShapeItems/Star.swift @@ -9,7 +9,7 @@ import Foundation // MARK: - StarType -enum StarType: Int, Codable { +enum StarType: Int, Codable, Sendable { case none case star case polygon diff --git a/Sources/Private/Model/Text/Font.swift b/Sources/Private/Model/Text/Font.swift index c1c9869252..5e60c7d06d 100644 --- a/Sources/Private/Model/Text/Font.swift +++ b/Sources/Private/Model/Text/Font.swift @@ -9,7 +9,7 @@ import Foundation // MARK: - Font -final class Font: Codable, DictionaryInitializable { +final class Font: Codable, Sendable, DictionaryInitializable { // MARK: Lifecycle @@ -41,7 +41,7 @@ final class Font: Codable, DictionaryInitializable { // MARK: - FontList /// A list of fonts -final class FontList: Codable, DictionaryInitializable { +final class FontList: Codable, Sendable, DictionaryInitializable { // MARK: Lifecycle diff --git a/Sources/Private/Model/Text/Glyph.swift b/Sources/Private/Model/Text/Glyph.swift index 03a7c58e55..b11a0148ec 100644 --- a/Sources/Private/Model/Text/Glyph.swift +++ b/Sources/Private/Model/Text/Glyph.swift @@ -8,7 +8,7 @@ import Foundation /// A model that holds a vector character -final class Glyph: Codable, DictionaryInitializable { +final class Glyph: Codable, Sendable, DictionaryInitializable { // MARK: Lifecycle diff --git a/Sources/Private/Utility/LottieAnimationSource.swift b/Sources/Private/Utility/LottieAnimationSource.swift index a3d28d0c27..1d3d86e617 100644 --- a/Sources/Private/Utility/LottieAnimationSource.swift +++ b/Sources/Private/Utility/LottieAnimationSource.swift @@ -1,7 +1,7 @@ // Created by Cal Stephens on 7/26/23. // Copyright © 2023 Airbnb Inc. All rights reserved. -public enum LottieAnimationSource { +public enum LottieAnimationSource: Sendable { case lottieAnimation(LottieAnimation) case dotLottieFile(DotLottieFile) diff --git a/Sources/Private/Utility/Primitives/VectorsExtensions.swift b/Sources/Private/Utility/Primitives/VectorsExtensions.swift index 118b4ee758..0fb7423be9 100644 --- a/Sources/Private/Utility/Primitives/VectorsExtensions.swift +++ b/Sources/Private/Utility/Primitives/VectorsExtensions.swift @@ -69,7 +69,7 @@ extension Double { // MARK: - LottieVector2D /// Needed for decoding json {x: y:} to a CGPoint -public struct LottieVector2D: Codable, Hashable { +public struct LottieVector2D: Codable, Hashable, Sendable { // MARK: Lifecycle diff --git a/Sources/Public/Animation/LottieAnimation.swift b/Sources/Public/Animation/LottieAnimation.swift index 9f7b82c439..bca001c912 100644 --- a/Sources/Public/Animation/LottieAnimation.swift +++ b/Sources/Public/Animation/LottieAnimation.swift @@ -9,7 +9,7 @@ import Foundation // MARK: - CoordinateSpace -public enum CoordinateSpace: Int, Codable { +public enum CoordinateSpace: Int, Codable, Sendable { case type2d case type3d } @@ -20,7 +20,7 @@ public enum CoordinateSpace: Int, Codable { /// /// A `LottieAnimation` holds all of the animation data backing a Lottie Animation. /// Codable, see JSON schema [here](https://github.com/airbnb/lottie-web/tree/master/docs/json). -public final class LottieAnimation: Codable, DictionaryInitializable { +public final class LottieAnimation: Codable, Sendable, DictionaryInitializable { // MARK: Lifecycle @@ -164,7 +164,7 @@ public final class LottieAnimation: Codable, DictionaryInitializable { /// - reducedMotion /// - reduced_motion /// - reduced-motion - lazy private(set) var reducedMotionMarker: Marker? = { + var reducedMotionMarker: Marker? { let allowedReducedMotionMarkerNames = Set([ "reduced motion", "reduced_motion", @@ -175,5 +175,5 @@ public final class LottieAnimation: Codable, DictionaryInitializable { return markers?.first(where: { marker in allowedReducedMotionMarkerNames.contains(marker.name.lowercased()) }) - }() + } } diff --git a/Sources/Public/AnimationCache/AnimationCacheProvider.swift b/Sources/Public/AnimationCache/AnimationCacheProvider.swift index 2eef999117..d0086e937e 100644 --- a/Sources/Public/AnimationCache/AnimationCacheProvider.swift +++ b/Sources/Public/AnimationCache/AnimationCacheProvider.swift @@ -6,12 +6,13 @@ // import Foundation + /// `AnimationCacheProvider` is a protocol that describes an Animation Cache. /// Animation Cache is used when loading `LottieAnimation` models. Using an Animation Cache /// can increase performance when loading an animation multiple times. /// /// Lottie comes with a prebuilt LRU Animation Cache. -public protocol AnimationCacheProvider: AnyObject { +public protocol AnimationCacheProvider: AnyObject, Sendable { func animation(forKey: String) -> LottieAnimation? diff --git a/Sources/Public/AnimationCache/DefaultAnimationCache.swift b/Sources/Public/AnimationCache/DefaultAnimationCache.swift index dbe847f361..3504a3fa6d 100644 --- a/Sources/Public/AnimationCache/DefaultAnimationCache.swift +++ b/Sources/Public/AnimationCache/DefaultAnimationCache.swift @@ -13,7 +13,7 @@ import Foundation /// The default size of the cache is 100. /// /// This cache implementation also responds to memory pressure, as it's backed by `NSCache`. -public class DefaultAnimationCache: AnimationCacheProvider { +public class DefaultAnimationCache: AnimationCacheProvider, @unchecked Sendable { // MARK: Lifecycle @@ -27,10 +27,9 @@ public class DefaultAnimationCache: AnimationCacheProvider { public static let sharedCache = DefaultAnimationCache() /// The size of the cache. - public var cacheSize = defaultCacheCountLimit { - didSet { - cache.countLimit = cacheSize - } + public var cacheSize: Int { + get { cache.countLimit } + set { cache.countLimit = newValue } } /// Clears the Cache. @@ -50,5 +49,5 @@ public class DefaultAnimationCache: AnimationCacheProvider { private static let defaultCacheCountLimit = 100 - private var cache = NSCache() + private let cache = NSCache() } diff --git a/Sources/Public/DotLottie/DotLottieFile.swift b/Sources/Public/DotLottie/DotLottieFile.swift index 41edce11f2..3e121218a9 100644 --- a/Sources/Public/DotLottie/DotLottieFile.swift +++ b/Sources/Public/DotLottie/DotLottieFile.swift @@ -144,3 +144,10 @@ extension String { (self as NSString).deletingPathExtension } } + +// MARK: - DotLottieFile + Sendable + +// Mark `DotLottieFile` as `@unchecked Sendable` to allow it to be used when strict concurrency is enabled. +// In the future, it may be necessary to make changes to the internal implementation of `DotLottieFile` +// to make it truly thread-safe. +extension DotLottieFile: @unchecked Sendable { } diff --git a/Sources/Public/Keyframes/Keyframe.swift b/Sources/Public/Keyframes/Keyframe.swift index 4e63a576a1..85d6da3a95 100644 --- a/Sources/Public/Keyframes/Keyframe.swift +++ b/Sources/Public/Keyframes/Keyframe.swift @@ -90,3 +90,7 @@ extension Keyframe: Hashable where T: Hashable { hasher.combine(spatialOutTangent) } } + +// MARK: Sendable + +extension Keyframe: Sendable where T: Sendable { } diff --git a/Sources/Public/Primitives/Vectors.swift b/Sources/Public/Primitives/Vectors.swift index 1029ccad62..61fca480bd 100644 --- a/Sources/Public/Primitives/Vectors.swift +++ b/Sources/Public/Primitives/Vectors.swift @@ -9,7 +9,7 @@ import Foundation // MARK: - LottieVector1D -public struct LottieVector1D: Hashable { +public struct LottieVector1D: Hashable, Sendable { public init(_ value: Double) { self.value = value @@ -23,7 +23,7 @@ public struct LottieVector1D: Hashable { /// A three dimensional vector. /// These vectors are encoded and decoded from [Double] -public struct LottieVector3D: Hashable { +public struct LottieVector3D: Hashable, Sendable { public let x: Double public let y: Double diff --git a/Tests/SnapshotConfiguration.swift b/Tests/SnapshotConfiguration.swift index 05bd915493..57b1fe5700 100644 --- a/Tests/SnapshotConfiguration.swift +++ b/Tests/SnapshotConfiguration.swift @@ -48,6 +48,12 @@ extension SnapshotConfiguration { "Nonanimating/verifyLineHeight": .precision(0.99), "Nonanimating/blend_mode_test": .precision(0.99), "Issues/issue_2066": .precision(0.9), + "LottieFiles/dog_car_ride": .precision(0.95), + "Issues/issue_1800": .precision(0.95), + "Issues/issue_1717": .precision(0.95), + "DotLottie/animation_external_image": .precision(0.95), + "DotLottie/animation_inline_image": .precision(0.95), + "LottieFiles/gradient_shapes": .precision(0.95), /// Test cases for the `AnimationKeypath` / `AnyValueProvider` system "Nonanimating/keypathTest": .customValueProviders([ diff --git a/Tests/SnapshotTests.swift b/Tests/SnapshotTests.swift index 4e72c6ac9d..6b8275a856 100644 --- a/Tests/SnapshotTests.swift +++ b/Tests/SnapshotTests.swift @@ -68,10 +68,12 @@ class SnapshotTests: XCTestCase { /// reference a sample json file that actually exists func testCustomSnapshotConfigurationsHaveCorrespondingSampleFile() { for (animationName, _) in SnapshotConfiguration.customMapping { - let expectedSampleFile = Bundle.lottie.bundleURL.appendingPathComponent("Samples/\(animationName).json") + let expectedJsonFile = Bundle.lottie.bundleURL.appendingPathComponent("Samples/\(animationName).json") + let expectedDotLottieFile = Bundle.lottie.bundleURL.appendingPathComponent("Samples/\(animationName).lottie") XCTAssert( - Samples.sampleAnimationURLs.contains(expectedSampleFile), + Samples.sampleAnimationURLs.contains(expectedJsonFile) + || Samples.sampleAnimationURLs.contains(expectedDotLottieFile), "Custom configuration for \"\(animationName)\" has no corresponding sample animation") } } diff --git a/Tests/__Snapshots__/SnapshotTests/testMainThreadRenderingEngine.Issues-issue_1732-0.png b/Tests/__Snapshots__/SnapshotTests/testMainThreadRenderingEngine.Issues-issue_1732-0.png index 9d800d1183..35d74cef7b 100644 Binary files a/Tests/__Snapshots__/SnapshotTests/testMainThreadRenderingEngine.Issues-issue_1732-0.png and b/Tests/__Snapshots__/SnapshotTests/testMainThreadRenderingEngine.Issues-issue_1732-0.png differ diff --git a/Tests/__Snapshots__/SnapshotTests/testMainThreadRenderingEngine.Issues-issue_1732-100.png b/Tests/__Snapshots__/SnapshotTests/testMainThreadRenderingEngine.Issues-issue_1732-100.png index 9d800d1183..35d74cef7b 100644 Binary files a/Tests/__Snapshots__/SnapshotTests/testMainThreadRenderingEngine.Issues-issue_1732-100.png and b/Tests/__Snapshots__/SnapshotTests/testMainThreadRenderingEngine.Issues-issue_1732-100.png differ diff --git a/Tests/__Snapshots__/SnapshotTests/testMainThreadRenderingEngine.Issues-issue_1732-25.png b/Tests/__Snapshots__/SnapshotTests/testMainThreadRenderingEngine.Issues-issue_1732-25.png index 25de87f78a..42a4bf9241 100644 Binary files a/Tests/__Snapshots__/SnapshotTests/testMainThreadRenderingEngine.Issues-issue_1732-25.png and b/Tests/__Snapshots__/SnapshotTests/testMainThreadRenderingEngine.Issues-issue_1732-25.png differ diff --git a/Tests/__Snapshots__/SnapshotTests/testMainThreadRenderingEngine.Issues-issue_1732-50.png b/Tests/__Snapshots__/SnapshotTests/testMainThreadRenderingEngine.Issues-issue_1732-50.png index 5518ef0799..71e6b50aa5 100644 Binary files a/Tests/__Snapshots__/SnapshotTests/testMainThreadRenderingEngine.Issues-issue_1732-50.png and b/Tests/__Snapshots__/SnapshotTests/testMainThreadRenderingEngine.Issues-issue_1732-50.png differ diff --git a/Tests/__Snapshots__/SnapshotTests/testMainThreadRenderingEngine.Issues-issue_1732-75.png b/Tests/__Snapshots__/SnapshotTests/testMainThreadRenderingEngine.Issues-issue_1732-75.png index fdcd8e79af..1cf8717a0f 100644 Binary files a/Tests/__Snapshots__/SnapshotTests/testMainThreadRenderingEngine.Issues-issue_1732-75.png and b/Tests/__Snapshots__/SnapshotTests/testMainThreadRenderingEngine.Issues-issue_1732-75.png differ diff --git a/Tests/__Snapshots__/SnapshotTests/testMainThreadRenderingEngine.Issues-issue_1762-0.png b/Tests/__Snapshots__/SnapshotTests/testMainThreadRenderingEngine.Issues-issue_1762-0.png index 788a851a66..acc38005e6 100644 Binary files a/Tests/__Snapshots__/SnapshotTests/testMainThreadRenderingEngine.Issues-issue_1762-0.png and b/Tests/__Snapshots__/SnapshotTests/testMainThreadRenderingEngine.Issues-issue_1762-0.png differ diff --git a/Tests/__Snapshots__/SnapshotTests/testMainThreadRenderingEngine.Issues-issue_1762-100.png b/Tests/__Snapshots__/SnapshotTests/testMainThreadRenderingEngine.Issues-issue_1762-100.png index 5ea0360804..54cab4b14d 100644 Binary files a/Tests/__Snapshots__/SnapshotTests/testMainThreadRenderingEngine.Issues-issue_1762-100.png and b/Tests/__Snapshots__/SnapshotTests/testMainThreadRenderingEngine.Issues-issue_1762-100.png differ diff --git a/Tests/__Snapshots__/SnapshotTests/testMainThreadRenderingEngine.Issues-issue_1762-25.png b/Tests/__Snapshots__/SnapshotTests/testMainThreadRenderingEngine.Issues-issue_1762-25.png index 98f5dc70df..f5a93bffb1 100644 Binary files a/Tests/__Snapshots__/SnapshotTests/testMainThreadRenderingEngine.Issues-issue_1762-25.png and b/Tests/__Snapshots__/SnapshotTests/testMainThreadRenderingEngine.Issues-issue_1762-25.png differ diff --git a/Tests/__Snapshots__/SnapshotTests/testMainThreadRenderingEngine.Issues-issue_1762-50.png b/Tests/__Snapshots__/SnapshotTests/testMainThreadRenderingEngine.Issues-issue_1762-50.png index 4d4c38dc6c..c5f07e30d0 100644 Binary files a/Tests/__Snapshots__/SnapshotTests/testMainThreadRenderingEngine.Issues-issue_1762-50.png and b/Tests/__Snapshots__/SnapshotTests/testMainThreadRenderingEngine.Issues-issue_1762-50.png differ diff --git a/Tests/__Snapshots__/SnapshotTests/testMainThreadRenderingEngine.Issues-issue_1762-75.png b/Tests/__Snapshots__/SnapshotTests/testMainThreadRenderingEngine.Issues-issue_1762-75.png index b23faa4ec5..59ee807966 100644 Binary files a/Tests/__Snapshots__/SnapshotTests/testMainThreadRenderingEngine.Issues-issue_1762-75.png and b/Tests/__Snapshots__/SnapshotTests/testMainThreadRenderingEngine.Issues-issue_1762-75.png differ diff --git a/Tests/__Snapshots__/SnapshotTests/testMainThreadRenderingEngine.LottieFiles-gradient_2-75.png b/Tests/__Snapshots__/SnapshotTests/testMainThreadRenderingEngine.LottieFiles-gradient_2-75.png index ad30347e27..cf41880067 100644 Binary files a/Tests/__Snapshots__/SnapshotTests/testMainThreadRenderingEngine.LottieFiles-gradient_2-75.png and b/Tests/__Snapshots__/SnapshotTests/testMainThreadRenderingEngine.LottieFiles-gradient_2-75.png differ