diff --git a/Lottie.xcodeproj/project.pbxproj b/Lottie.xcodeproj/project.pbxproj index 956c3a86f6..b1425696a0 100644 --- a/Lottie.xcodeproj/project.pbxproj +++ b/Lottie.xcodeproj/project.pbxproj @@ -554,6 +554,7 @@ 2EAF5B0427A0798700E00531 /* AnimationFontProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2EAF59F227A0798700E00531 /* AnimationFontProvider.swift */; }; 2EAF5B0527A0798700E00531 /* AnimationFontProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2EAF59F227A0798700E00531 /* AnimationFontProvider.swift */; }; 2EAF5B0627A0798700E00531 /* AnimationFontProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2EAF59F227A0798700E00531 /* AnimationFontProvider.swift */; }; + 36E57EAC28AF7ADF00B7EFDA /* HardcodedTextProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36E57EAB28AF7ADF00B7EFDA /* HardcodedTextProvider.swift */; }; 6D0E635F28246BD0007C5DB6 /* Difference in Frameworks */ = {isa = PBXBuildFile; productRef = 6D0E635E28246BD0007C5DB6 /* Difference */; }; 6D99D6432823790700E5205B /* LegacyGradientFillRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D99D6422823790700E5205B /* LegacyGradientFillRenderer.swift */; }; 6D99D6442823790700E5205B /* LegacyGradientFillRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D99D6422823790700E5205B /* LegacyGradientFillRenderer.swift */; }; @@ -783,6 +784,7 @@ 2EAF59EF27A0798700E00531 /* GradientValueProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GradientValueProvider.swift; sourceTree = ""; }; 2EAF59F027A0798700E00531 /* PointValueProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PointValueProvider.swift; sourceTree = ""; }; 2EAF59F227A0798700E00531 /* AnimationFontProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AnimationFontProvider.swift; sourceTree = ""; }; + 36E57EAB28AF7ADF00B7EFDA /* HardcodedTextProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HardcodedTextProvider.swift; sourceTree = ""; }; 6D99D6422823790700E5205B /* LegacyGradientFillRenderer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LegacyGradientFillRenderer.swift; sourceTree = ""; }; 6DB3BDB528243FA5002A276D /* ValueProvidersTests.swift */ = {isa = PBXFileReference; indentWidth = 2; lastKnownFileType = sourcecode.swift; path = ValueProvidersTests.swift; sourceTree = ""; tabWidth = 2; }; 6DB3BDB7282454A6002A276D /* DictionaryInitializable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DictionaryInitializable.swift; sourceTree = ""; }; @@ -876,6 +878,7 @@ 2E8040BF27A07343006E74CB /* Snapshotting+presentationLayer.swift */, 2EAF59A627A076BC00E00531 /* Bundle+Module.swift */, 2E09FA0527B6CEB600BA84E5 /* HardcodedFontProvider.swift */, + 36E57EAB28AF7ADF00B7EFDA /* HardcodedTextProvider.swift */, ); path = Utils; sourceTree = ""; @@ -1876,6 +1879,7 @@ 6DEF696E2824A76C007D640F /* BundleTests.swift in Sources */, 2EAF59A727A076BC00E00531 /* Bundle+Module.swift in Sources */, 2E8044AE27A07347006E74CB /* Snapshotting+presentationLayer.swift in Sources */, + 36E57EAC28AF7ADF00B7EFDA /* HardcodedTextProvider.swift in Sources */, 2E72128527BB32DB0027BC56 /* PerformanceTests.swift in Sources */, 6DB3BDC328245AA2002A276D /* ParsingTests.swift in Sources */, 6DB3BDB628243FA5002A276D /* ValueProvidersTests.swift in Sources */, diff --git a/Sources/Private/CoreAnimation/CoreAnimationLayer.swift b/Sources/Private/CoreAnimation/CoreAnimationLayer.swift index e96a82bf90..574643210e 100644 --- a/Sources/Private/CoreAnimation/CoreAnimationLayer.swift +++ b/Sources/Private/CoreAnimation/CoreAnimationLayer.swift @@ -17,6 +17,7 @@ final class CoreAnimationLayer: BaseAnimationLayer { init( animation: Animation, imageProvider: AnimationImageProvider, + textProvider: AnimationTextProvider, fontProvider: AnimationFontProvider, compatibilityTrackerMode: CompatibilityTracker.Mode, logger: LottieLogger) @@ -24,6 +25,7 @@ final class CoreAnimationLayer: BaseAnimationLayer { { self.animation = animation self.imageProvider = imageProvider + self.textProvider = textProvider self.fontProvider = fontProvider self.logger = logger compatibilityTracker = CompatibilityTracker(mode: compatibilityTrackerMode, logger: logger) @@ -44,6 +46,7 @@ final class CoreAnimationLayer: BaseAnimationLayer { animation = typedLayer.animation currentAnimationConfiguration = typedLayer.currentAnimationConfiguration imageProvider = typedLayer.imageProvider + textProvider = typedLayer.textProvider fontProvider = typedLayer.fontProvider didSetUpAnimation = typedLayer.didSetUpAnimation compatibilityTracker = typedLayer.compatibilityTracker @@ -92,6 +95,16 @@ final class CoreAnimationLayer: BaseAnimationLayer { didSet { reloadImages() } } + /// The `AnimationTextProvider` that `TextLayer`'s use to retrieve texts, + /// that they should use to render their text context + var textProvider: AnimationTextProvider { + didSet { + // We need to rebuild the current animation after updating the text provider, + // since this is used in `TextLayer.setupAnimations(context:)` + rebuildCurrentAnimation() + } + } + /// The `FontProvider` that `TextLayer`s use to retrieve the `CTFont` /// that they should use to render their text content var fontProvider: AnimationFontProvider { @@ -203,6 +216,7 @@ final class CoreAnimationLayer: BaseAnimationLayer { LayerContext( animation: animation, imageProvider: imageProvider, + textProvider: textProvider, fontProvider: fontProvider, compatibilityTracker: compatibilityTracker, layerName: "root layer") @@ -234,6 +248,7 @@ final class CoreAnimationLayer: BaseAnimationLayer { compatibilityTracker: compatibilityTracker, logger: logger, currentKeypath: AnimationKeypath(keys: []), + textProvider: textProvider, logHierarchyKeypaths: configuration.logHierarchyKeypaths) // Perform a layout pass if necessary so all of the sublayers @@ -383,15 +398,6 @@ extension CoreAnimationLayer: RootAnimationLayer { (sublayers ?? []).filter { $0 is AnimationLayer } } - var textProvider: AnimationTextProvider { - get { DictionaryTextProvider([:]) } - set { - logger.assertionFailure(""" - The Core Animation rendering engine currently doesn't support `textProvider`s") - """) - } - } - func reloadImages() { // When the image provider changes, we have to update all `ImageLayer`s // so they can query the most up-to-date image from the new image provider. diff --git a/Sources/Private/CoreAnimation/Layers/AnimationLayer.swift b/Sources/Private/CoreAnimation/Layers/AnimationLayer.swift index 21ea5d8317..661903fc89 100644 --- a/Sources/Private/CoreAnimation/Layers/AnimationLayer.swift +++ b/Sources/Private/CoreAnimation/Layers/AnimationLayer.swift @@ -41,6 +41,9 @@ struct LayerAnimationContext { /// The AnimationKeypath represented by the current layer var currentKeypath: AnimationKeypath + /// The `AnimationTextProvider` + var textProvider: AnimationTextProvider + /// Whether or not to log `AnimationKeypath`s for all of the animation's layers /// - Used for `CoreAnimationLayer.logHierarchyKeypaths()` var logHierarchyKeypaths: Bool diff --git a/Sources/Private/CoreAnimation/Layers/LayerModel+makeAnimationLayer.swift b/Sources/Private/CoreAnimation/Layers/LayerModel+makeAnimationLayer.swift index 1611f3e04a..2fcc4cbe22 100644 --- a/Sources/Private/CoreAnimation/Layers/LayerModel+makeAnimationLayer.swift +++ b/Sources/Private/CoreAnimation/Layers/LayerModel+makeAnimationLayer.swift @@ -9,6 +9,7 @@ import QuartzCore struct LayerContext { let animation: Animation let imageProvider: AnimationImageProvider + let textProvider: AnimationTextProvider let fontProvider: AnimationFontProvider let compatibilityTracker: CompatibilityTracker var layerName: String diff --git a/Sources/Private/CoreAnimation/Layers/TextLayer.swift b/Sources/Private/CoreAnimation/Layers/TextLayer.swift index f4a636957d..dd216c2016 100644 --- a/Sources/Private/CoreAnimation/Layers/TextLayer.swift +++ b/Sources/Private/CoreAnimation/Layers/TextLayer.swift @@ -36,6 +36,21 @@ final class TextLayer: BaseCompositionLayer { // MARK: Internal + override func setupAnimations(context: LayerAnimationContext) throws { + try super.setupAnimations(context: context) + let textAnimationContext = context.addingKeypathComponent(textLayerModel.name) + + let sourceText = try textLayerModel.text.exactlyOneKeyframe( + context: textAnimationContext, + description: "text layer text") + + renderLayer.text = context.textProvider.textFor( + keypathName: textAnimationContext.currentKeypath.fullPath, + sourceText: sourceText.text) + + renderLayer.sizeToFit() + } + func configureRenderLayer(with context: LayerContext) throws { // We can't use `CATextLayer`, because it doesn't support enough features we use. // Instead, we use the same `CoreTextRenderLayer` (with a custom `draw` implementation) @@ -54,7 +69,6 @@ final class TextLayer: BaseCompositionLayer { """) } - renderLayer.text = text.text renderLayer.font = context.fontProvider.fontFor(family: text.fontFamily, size: CGFloat(text.fontSize)) renderLayer.alignment = text.justification.textAlignment diff --git a/Sources/Public/Animation/AnimationView.swift b/Sources/Public/Animation/AnimationView.swift index def3b93c0c..eb8a088016 100644 --- a/Sources/Public/Animation/AnimationView.swift +++ b/Sources/Public/Animation/AnimationView.swift @@ -996,6 +996,7 @@ final public class AnimationView: AnimationViewBase { let coreAnimationLayer = try CoreAnimationLayer( animation: animation, imageProvider: imageProvider.cachedImageProvider, + textProvider: textProvider, fontProvider: fontProvider, compatibilityTrackerMode: .track, logger: logger) @@ -1030,6 +1031,7 @@ final public class AnimationView: AnimationViewBase { let coreAnimationLayer = try CoreAnimationLayer( animation: animation, imageProvider: imageProvider.cachedImageProvider, + textProvider: textProvider, fontProvider: fontProvider, compatibilityTrackerMode: .abort, logger: logger) diff --git a/Tests/AutomaticEngineTests.swift b/Tests/AutomaticEngineTests.swift index e659238201..4bc8488fb4 100644 --- a/Tests/AutomaticEngineTests.swift +++ b/Tests/AutomaticEngineTests.swift @@ -19,6 +19,7 @@ final class AutomaticEngineTests: XCTestCase { let animationLayer = try XCTUnwrap(CoreAnimationLayer( animation: animation, imageProvider: BundleImageProvider(bundle: Bundle.main, searchPath: nil), + textProvider: DefaultTextProvider(), fontProvider: DefaultFontProvider(), compatibilityTrackerMode: .track, logger: .shared)) diff --git a/Tests/Samples/Issues/issue_1722.json b/Tests/Samples/Issues/issue_1722.json new file mode 100644 index 0000000000..9fba3bcad0 --- /dev/null +++ b/Tests/Samples/Issues/issue_1722.json @@ -0,0 +1 @@ +{"v":"5.9.6","fr":25,"ip":0,"op":126,"w":600,"h":600,"nm":"Bouncing","ddd":0,"assets":[],"fonts":{"list":[{"origin":0,"fPath":"","fClass":"","fFamily":"Blogger Sans","fWeight":"","fStyle":"Bold","fName":"BloggerSans-Bold","ascent":72.8127343747765}]},"layers":[{"ddd":0,"ind":1,"ty":3,"nm":"Null 27","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":114,"s":[-10,163,0],"to":[0,-64.833,0],"ti":[0,64.833,0]},{"t":125,"s":[-10,-226,0]}],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[47.6,47.6,100],"ix":6,"l":2}},"ao":0,"ip":0,"op":126,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Ball Bounce","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[660.5,-396,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0.834,"s":[660.5,-395.388,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":1.668,"s":[660.5,-393.645,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":2.503,"s":[660.5,-390.742,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":3.337,"s":[660.5,-386.653,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":4.171,"s":[660.5,-381.357,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":5.005,"s":[660.5,-374.839,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":5.839,"s":[660.5,-367.086,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":6.674,"s":[660.5,-358.094,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":7.508,"s":[660.5,-347.861,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":8.342,"s":[660.5,-336.39,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":9.176,"s":[660.5,-323.69,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":10.01,"s":[660.5,-309.775,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":10.844,"s":[660.5,-294.662,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":11.679,"s":[660.5,-278.374,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":12.513,"s":[660.5,-260.939,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":13.347,"s":[660.5,-242.389,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":14.181,"s":[660.5,-222.761,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":15.015,"s":[660.5,-202.094,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":15.85,"s":[660.5,-180.435,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":16.684,"s":[660.5,-157.831,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":17.518,"s":[660.5,-134.335,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":18.352,"s":[660.5,-110.003,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":19.186,"s":[660.5,-84.894,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20.021,"s":[660.5,-59.07,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20.854,"s":[660.5,-32.597,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":21.688,"s":[660.5,-5.542,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":22.522,"s":[660.5,22.026,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":23.356,"s":[660.5,50.034,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":24.19,"s":[660.5,78.408,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25.025,"s":[660.5,107.075,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25.859,"s":[660.5,135.957,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":26.693,"s":[660.5,164.978,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":27.527,"s":[660.5,194.06,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":28.361,"s":[660.5,223.125,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":29.196,"s":[660.5,220.402,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30.03,"s":[660.5,198.225,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30.864,"s":[660.5,176.148,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":32,"s":[660.5,154.294,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":32.532,"s":[660.5,132.788,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":33.367,"s":[660.5,111.752,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":34.201,"s":[660.5,91.306,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":35.035,"s":[660.5,71.568,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":35.869,"s":[660.5,52.653,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":36.703,"s":[660.5,34.673,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":37.537,"s":[660.5,17.736,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":38.372,"s":[660.5,1.946,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":39.206,"s":[660.5,-12.598,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":40.04,"s":[660.5,-25.802,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":40.874,"s":[660.5,-37.576,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":41.708,"s":[660.5,-47.837,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":42.543,"s":[660.5,-56.508,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":43.377,"s":[660.5,-63.519,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":44.211,"s":[660.5,-68.803,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":45.045,"s":[660.5,-72.305,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":45.879,"s":[660.5,-73.973,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":46.714,"s":[660.5,-73.764,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":47.548,"s":[660.5,-71.643,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":48.382,"s":[660.5,-67.582,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":49.216,"s":[660.5,-61.559,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":50.05,"s":[660.5,-53.562,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":50.884,"s":[660.5,-43.607,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":51.719,"s":[660.5,-31.734,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":52.553,"s":[660.5,-17.99,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":53.387,"s":[660.5,-2.431,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":54.221,"s":[660.5,14.881,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":55.055,"s":[660.5,33.878,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":55.89,"s":[660.5,54.482,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":56.724,"s":[660.5,76.613,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":57.558,"s":[660.5,100.182,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":58.392,"s":[660.5,125.095,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":59.226,"s":[660.5,151.253,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":60.061,"s":[660.5,178.553,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":60.895,"s":[660.5,206.886,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":61.729,"s":[660.5,232.621,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":62.562,"s":[660.5,210.545,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":63.396,"s":[660.5,189.395,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":64.23,"s":[660.5,169.254,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":65.065,"s":[660.5,150.202,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":65.899,"s":[660.5,132.313,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":66.733,"s":[660.5,115.658,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":67.567,"s":[660.5,100.302,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":68.401,"s":[660.5,86.305,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":69.236,"s":[660.5,73.723,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":70.07,"s":[660.5,62.603,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":70.904,"s":[660.5,52.99,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":71.738,"s":[660.5,44.921,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":72.572,"s":[660.5,38.428,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":73.407,"s":[660.5,33.534,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":74.241,"s":[660.5,30.26,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":75.075,"s":[660.5,28.617,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":75.909,"s":[660.5,28.612,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":76.743,"s":[660.5,30.243,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":77.577,"s":[660.5,33.503,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":78.412,"s":[660.5,38.38,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":79.246,"s":[660.5,44.852,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":80.08,"s":[660.5,52.894,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":80.914,"s":[660.5,62.474,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":81.748,"s":[660.5,73.553,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":82.583,"s":[660.5,86.086,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":83.417,"s":[660.5,100.023,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":84.251,"s":[660.5,115.31,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":85.085,"s":[660.5,131.884,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":85.919,"s":[660.5,149.68,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":86.754,"s":[660.5,168.626,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":87.588,"s":[660.5,188.649,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":88.422,"s":[660.5,209.667,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":89.256,"s":[660.5,231.598,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":90.09,"s":[660.5,218.728,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":90.924,"s":[660.5,202.788,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":91.759,"s":[660.5,187.803,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":92.593,"s":[660.5,173.831,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":93.427,"s":[660.5,160.926,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":94.261,"s":[660.5,149.141,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":95.095,"s":[660.5,138.52,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":95.93,"s":[660.5,129.105,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":96.764,"s":[660.5,120.933,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":97.598,"s":[660.5,114.037,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":98.432,"s":[660.5,108.441,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":99.266,"s":[660.5,104.169,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":100.101,"s":[660.5,101.237,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":100.935,"s":[660.5,99.655,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":101.769,"s":[660.5,99.429,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":102.603,"s":[660.5,100.56,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":103.437,"s":[660.5,103.043,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":104.271,"s":[660.5,106.867,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":105.105,"s":[660.5,112.017,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":105.939,"s":[660.5,118.472,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":106.773,"s":[660.5,126.205,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":107.607,"s":[660.5,135.187,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":108.441,"s":[660.5,145.379,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":109.276,"s":[660.5,156.743,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":110.11,"s":[660.5,169.232,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":110.944,"s":[660.5,182.797,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":111.778,"s":[660.5,197.384,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":112.612,"s":[660.5,212.934,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":113.447,"s":[660.5,229.386,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":114.281,"s":[660.5,225.502,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":115.115,"s":[660.5,213.404,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":115.949,"s":[660.5,202.216,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":116.783,"s":[660.5,191.984,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":117.617,"s":[660.5,182.746,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":118.452,"s":[660.5,174.538,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":119.286,"s":[660.5,167.394,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":120.12,"s":[660.5,161.34,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":120.954,"s":[660.5,156.401,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":121.788,"s":[660.5,152.595,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":122.623,"s":[660.5,149.937,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":123.457,"s":[660.5,148.437,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":124.291,"s":[660.5,148.1,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":125.125,"s":[660.5,148.928,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":125.959,"s":[660.5,150.916,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":126.794,"s":[660.5,154.056,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":127.628,"s":[660.5,158.336,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":128.462,"s":[660.5,163.738,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":129.296,"s":[660.5,170.24,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":130.13,"s":[660.5,177.816,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":130.964,"s":[660.5,186.436,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":131.799,"s":[660.5,196.065,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":132.633,"s":[660.5,206.665,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":133.467,"s":[660.5,218.193,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":134.301,"s":[660.5,230.604,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":135.135,"s":[660.5,225.466,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":135.97,"s":[660.5,216.592,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":136.804,"s":[660.5,208.615,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":137.638,"s":[660.5,201.566,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":138.472,"s":[660.5,195.473,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":139.306,"s":[660.5,190.359,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":140.141,"s":[660.5,186.244,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":140.975,"s":[660.5,183.144,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":141.809,"s":[660.5,181.071,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":142.643,"s":[660.5,180.032,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":143.477,"s":[660.5,180.032,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":144.311,"s":[660.5,181.07,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":145.146,"s":[660.5,183.141,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":145.979,"s":[660.5,186.237,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":146.813,"s":[660.5,190.345,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":147.647,"s":[660.5,195.449,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":148.481,"s":[660.5,201.528,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":149.316,"s":[660.5,208.557,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":150.15,"s":[660.5,216.509,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":150.984,"s":[660.5,225.351,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":151.818,"s":[660.5,233.273,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":152.652,"s":[660.5,226.048,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":153.487,"s":[660.5,219.682,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":154.321,"s":[660.5,214.199,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":155.155,"s":[660.5,209.622,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":155.989,"s":[660.5,205.967,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":156.823,"s":[660.5,203.25,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":157.657,"s":[660.5,201.479,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":158.492,"s":[660.5,200.662,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":159.326,"s":[660.5,200.802,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":160.16,"s":[660.5,201.898,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":160.994,"s":[660.5,203.945,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":161.828,"s":[660.5,206.934,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":162.663,"s":[660.5,210.854,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":163.497,"s":[660.5,215.688,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":164.331,"s":[660.5,221.418,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":165.165,"s":[660.5,228.019,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":165.999,"s":[660.5,232.737,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":166.834,"s":[660.5,227.371,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":167.668,"s":[660.5,222.858,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":168.502,"s":[660.5,219.215,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":169.336,"s":[660.5,216.457,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":170.17,"s":[660.5,214.594,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":171.004,"s":[660.5,213.633,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":171.839,"s":[660.5,213.577,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":172.673,"s":[660.5,214.427,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":173.507,"s":[660.5,216.178,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":174.341,"s":[660.5,218.823,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":175.175,"s":[660.5,222.353,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":176.01,"s":[660.5,226.751,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":176.844,"s":[660.5,232.001,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":177.678,"s":[660.5,230.724,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":178.512,"s":[660.5,227.133,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":179.346,"s":[660.5,224.394,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":180.181,"s":[660.5,222.519,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":181.015,"s":[660.5,221.515,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":181.849,"s":[660.5,221.385,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":182.683,"s":[660.5,222.129,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":183.517,"s":[660.5,223.745,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":184.351,"s":[660.5,226.226,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":185.186,"s":[660.5,229.56,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":186.02,"s":[660.5,232.932,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":186.854,"s":[660.5,229.907,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":187.688,"s":[660.5,227.724,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":188.521,"s":[660.5,226.392,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":189.356,"s":[660.5,225.914,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":190.19,"s":[660.5,226.293,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":191.024,"s":[660.5,227.527,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":191.858,"s":[660.5,229.611,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":192.692,"s":[660.5,232.536,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":193.527,"s":[660.5,231.276,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":194.361,"s":[660.5,229.598,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":195.195,"s":[660.5,228.763,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":196.029,"s":[660.5,228.773,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":196.863,"s":[660.5,229.629,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":197.697,"s":[660.5,231.326,0],"to":[0,0,0],"ti":[0,0,0]},{"t":198.5322265625,"s":[660.5,233.285,0]}],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":25.025,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":27.527,"s":[100,80,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":32.532,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":40.04,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":45.879,"s":[100,110,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":58.392,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":60.895,"s":[100,87,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":65.899,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":68.401,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":75.909,"s":[100,110,100]},{"t":86.75390625,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[110,110],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":179,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":5,"nm":"Animation text layer","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[651.201,288.583,0],"ix":2,"l":2},"a":{"a":0,"k":[0.865,-46.518,0],"ix":1,"l":2},"s":{"a":0,"k":[36.132,36.132,100],"ix":6,"l":2}},"ao":0,"t":{"d":{"k":[{"s":{"s":178,"f":"BloggerSans-Bold","t":"Animation text layer","ca":0,"j":2,"tr":9,"lh":346,"ls":0,"fc":[0.91,0.22,0.271],"sc":[1,1,1],"sw":0.00999999977648,"of":false},"t":0}]},"p":{},"m":{"g":1,"a":{"a":0,"k":[0,0],"ix":2}},"a":[]},"ip":114,"op":126,"st":6,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":5,"nm":"Animation text layer","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[300,300,0],"ix":2,"l":2},"a":{"a":0,"k":[0.865,-46.518,0],"ix":1,"l":2},"s":{"a":0,"k":[17.199,17.199,100],"ix":6,"l":2}},"ao":0,"t":{"d":{"k":[{"s":{"s":178,"f":"BloggerSans-Bold","t":"Animation text layer","ca":0,"j":2,"tr":9,"lh":346,"ls":0,"fc":[1,1,1],"sc":[1,1,1],"sw":0.00999999977648,"of":false},"t":0}]},"p":{},"m":{"g":1,"a":{"a":0,"k":[0,0],"ix":2}},"a":[]},"ip":88,"op":114,"st":6,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":5,"nm":"Animation text layer","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[300,300,0],"ix":2,"l":2},"a":{"a":0,"k":[0.865,-46.518,0],"ix":1,"l":2},"s":{"a":0,"k":[17.199,17.199,100],"ix":6,"l":2}},"ao":0,"t":{"d":{"k":[{"s":{"s":178,"f":"BloggerSans-Bold","t":"Animation text layer","ca":0,"j":2,"tr":9,"lh":346,"ls":0,"fc":[0.411,0.835,0.253],"sc":[1,1,1],"sw":0.00999999977648,"of":false},"t":0}]},"p":{},"m":{"g":1,"a":{"a":0,"k":[0,0],"ix":2}},"a":[]},"ip":62,"op":88,"st":6,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":5,"nm":"Animation text layer","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[300,300,0],"ix":2,"l":2},"a":{"a":0,"k":[0.865,-46.518,0],"ix":1,"l":2},"s":{"a":0,"k":[17.199,17.199,100],"ix":6,"l":2}},"ao":0,"t":{"d":{"k":[{"s":{"s":178,"f":"BloggerSans-Bold","t":"Animation text layer","ca":0,"j":2,"tr":9,"lh":346,"ls":0,"fc":[1,1,1],"sc":[1,1,1],"sw":0.00999999977648,"of":false},"t":0}]},"p":{},"m":{"g":1,"a":{"a":0,"k":[0,0],"ix":2}},"a":[]},"ip":29,"op":62,"st":6,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":5,"nm":"Animation text layer","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[300,300,0],"ix":2,"l":2},"a":{"a":0,"k":[0.866,-46.518,0],"ix":1,"l":2},"s":{"a":0,"k":[17.199,17.199,100],"ix":6,"l":2}},"ao":0,"t":{"d":{"k":[{"s":{"s":178,"f":"BloggerSans-Bold","t":"Animation text layer","ca":0,"j":2,"tr":9,"lh":346,"ls":0,"fc":[0.949,0.214,0.214],"sc":[1,1,1],"sw":0.00999999977648,"of":false},"t":0}]},"p":{},"m":{"g":1,"a":{"a":0,"k":[0,0],"ix":2}},"a":[]},"ip":0,"op":29,"st":0,"ct":1,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/Tests/SnapshotConfiguration.swift b/Tests/SnapshotConfiguration.swift index 251324fae1..662f1004a9 100644 --- a/Tests/SnapshotConfiguration.swift +++ b/Tests/SnapshotConfiguration.swift @@ -22,6 +22,9 @@ struct SnapshotConfiguration { /// A custom `AnimationImageProvider` to use when rendering this animation var customImageProvider: AnimationImageProvider? + /// A custom `AnimationTextProvider` to use when rendering this animation + var customTextProvider: AnimationTextProvider? + /// A custom `AnimationFontProvider` to use when rendering this animation var customFontProvider: AnimationFontProvider? @@ -70,6 +73,9 @@ extension SnapshotConfiguration { // Test cases for `AnimatedImageProvider` "Nonanimating/_dog": .customImageProvider(HardcodedImageProvider(imageName: "Samples/Images/dog.png")), + // Test cases for `AnimatedTextProvider` + "Issues/issue_1722": .customTextProvider(HardcodedTextProvider(text: "Bounce-bounce")), + // Test cases for `AnimationFontProvider` "Nonanimating/Text_Glyph": .customFontProvider(HardcodedFontProvider(font: UIFont(name: "Chalkduster", size: 36)!)), @@ -128,6 +134,15 @@ extension SnapshotConfiguration { return configuration } + static func customTextProvider( + _ customTextProvider: AnimationTextProvider) + -> SnapshotConfiguration + { + var configuration = SnapshotConfiguration.default + configuration.customTextProvider = customTextProvider + return configuration + } + /// A `SnapshotConfiguration` value using the given custom value providers static func customFontProvider( _ customFontProvider: AnimationFontProvider) diff --git a/Tests/SnapshotTests.swift b/Tests/SnapshotTests.swift index 772b2d63c9..12ac7b0e9c 100644 --- a/Tests/SnapshotTests.swift +++ b/Tests/SnapshotTests.swift @@ -256,6 +256,10 @@ extension SnapshotConfiguration { animationView.imageProvider = customImageProvider } + if let customTextProvider = snapshotConfiguration.customTextProvider { + animationView.textProvider = customTextProvider + } + if let customFontProvider = snapshotConfiguration.customFontProvider { animationView.fontProvider = customFontProvider } diff --git a/Tests/Utils/HardcodedTextProvider.swift b/Tests/Utils/HardcodedTextProvider.swift new file mode 100644 index 0000000000..2dba7e3ab5 --- /dev/null +++ b/Tests/Utils/HardcodedTextProvider.swift @@ -0,0 +1,27 @@ +// Created by Igor Katselenbogen on 08/19/22. +// Copyright © 2022 Airbnb Inc. All rights reserved. + +import Lottie + +// MARK: - HardcodedTextProvider + +/// An `AnimationTextProvider` that always returns a specific hardcoded text +class HardcodedTextProvider: AnimationTextProvider { + + // MARK: Lifecycle + + init(text: String) { + self.text = text + } + + // MARK: Internal + + func textFor(keypathName _: String, sourceText _: String) -> String { + text + } + + // MARK: Private + + private let text: String + +} diff --git a/Tests/__Snapshots__/AutomaticEngineTests/testAutomaticEngineDetection.Issues-issue_1722.txt b/Tests/__Snapshots__/AutomaticEngineTests/testAutomaticEngineDetection.Issues-issue_1722.txt new file mode 100644 index 0000000000..4b816d7353 --- /dev/null +++ b/Tests/__Snapshots__/AutomaticEngineTests/testAutomaticEngineDetection.Issues-issue_1722.txt @@ -0,0 +1 @@ +Supports Core Animation engine \ No newline at end of file diff --git a/Tests/__Snapshots__/AutomaticEngineTests/testAutomaticEngineDetection.Nonanimating-Text_Glyph.txt b/Tests/__Snapshots__/AutomaticEngineTests/testAutomaticEngineDetection.Nonanimating-Text_Glyph.txt index db2c381da2..1b7147d0e6 100644 --- a/Tests/__Snapshots__/AutomaticEngineTests/testAutomaticEngineDetection.Nonanimating-Text_Glyph.txt +++ b/Tests/__Snapshots__/AutomaticEngineTests/testAutomaticEngineDetection.Nonanimating-Text_Glyph.txt @@ -1,2 +1,3 @@ Does not support Core Animation engine. Encountered compatibility issues: +[TEXT] The Core Animation rendering engine does not support animating multiple keyframes for text layer text values (due to limitations of Core Animation `CAKeyframeAnimation`s). [TEXT] The Core Animation rendering engine does not support animating multiple keyframes for text layer text values (due to limitations of Core Animation `CAKeyframeAnimation`s). \ No newline at end of file diff --git a/Tests/__Snapshots__/AutomaticEngineTests/testAutomaticEngineDetection.Nonanimating-Text_NoGlyph.txt b/Tests/__Snapshots__/AutomaticEngineTests/testAutomaticEngineDetection.Nonanimating-Text_NoGlyph.txt index db2c381da2..1b7147d0e6 100644 --- a/Tests/__Snapshots__/AutomaticEngineTests/testAutomaticEngineDetection.Nonanimating-Text_NoGlyph.txt +++ b/Tests/__Snapshots__/AutomaticEngineTests/testAutomaticEngineDetection.Nonanimating-Text_NoGlyph.txt @@ -1,2 +1,3 @@ Does not support Core Animation engine. Encountered compatibility issues: +[TEXT] The Core Animation rendering engine does not support animating multiple keyframes for text layer text values (due to limitations of Core Animation `CAKeyframeAnimation`s). [TEXT] The Core Animation rendering engine does not support animating multiple keyframes for text layer text values (due to limitations of Core Animation `CAKeyframeAnimation`s). \ No newline at end of file diff --git a/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.Issues-issue_1722-0.png b/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.Issues-issue_1722-0.png new file mode 100644 index 0000000000..ac0358eb69 Binary files /dev/null and b/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.Issues-issue_1722-0.png differ diff --git a/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.Issues-issue_1722-100.png b/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.Issues-issue_1722-100.png new file mode 100644 index 0000000000..9201f9779d Binary files /dev/null and b/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.Issues-issue_1722-100.png differ diff --git a/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.Issues-issue_1722-25.png b/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.Issues-issue_1722-25.png new file mode 100644 index 0000000000..13e580d910 Binary files /dev/null and b/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.Issues-issue_1722-25.png differ diff --git a/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.Issues-issue_1722-50.png b/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.Issues-issue_1722-50.png new file mode 100644 index 0000000000..e15cb468cf Binary files /dev/null and b/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.Issues-issue_1722-50.png differ diff --git a/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.Issues-issue_1722-75.png b/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.Issues-issue_1722-75.png new file mode 100644 index 0000000000..ffc7b04622 Binary files /dev/null and b/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.Issues-issue_1722-75.png differ diff --git a/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.Issues-issue_885-0.png b/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.Issues-issue_885-0.png index a8d90ab20b..9357c536ba 100644 Binary files a/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.Issues-issue_885-0.png and b/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.Issues-issue_885-0.png differ diff --git a/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.Issues-issue_885-100.png b/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.Issues-issue_885-100.png index 7e73c9b861..25f14b03b6 100644 Binary files a/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.Issues-issue_885-100.png and b/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.Issues-issue_885-100.png differ diff --git a/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.Issues-issue_885-25.png b/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.Issues-issue_885-25.png index fe2523cf4c..407a35e31f 100644 Binary files a/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.Issues-issue_885-25.png and b/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.Issues-issue_885-25.png differ diff --git a/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.Issues-issue_885-50.png b/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.Issues-issue_885-50.png index 7738b26eb5..1ae0a16058 100644 Binary files a/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.Issues-issue_885-50.png and b/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.Issues-issue_885-50.png differ diff --git a/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.Issues-issue_885-75.png b/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.Issues-issue_885-75.png index cc3abb7df0..badc669250 100644 Binary files a/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.Issues-issue_885-75.png and b/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.Issues-issue_885-75.png differ diff --git a/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.Issues-pr_1604_2-50.png b/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.Issues-pr_1604_2-50.png index 84cc5d2334..ca0f36c585 100644 Binary files a/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.Issues-pr_1604_2-50.png and b/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.Issues-pr_1604_2-50.png differ diff --git a/Tests/__Snapshots__/SnapshotTests/testMainThreadRenderingEngine.Issues-issue_1722-0.png b/Tests/__Snapshots__/SnapshotTests/testMainThreadRenderingEngine.Issues-issue_1722-0.png new file mode 100644 index 0000000000..ac0358eb69 Binary files /dev/null and b/Tests/__Snapshots__/SnapshotTests/testMainThreadRenderingEngine.Issues-issue_1722-0.png differ diff --git a/Tests/__Snapshots__/SnapshotTests/testMainThreadRenderingEngine.Issues-issue_1722-100.png b/Tests/__Snapshots__/SnapshotTests/testMainThreadRenderingEngine.Issues-issue_1722-100.png new file mode 100644 index 0000000000..9201f9779d Binary files /dev/null and b/Tests/__Snapshots__/SnapshotTests/testMainThreadRenderingEngine.Issues-issue_1722-100.png differ diff --git a/Tests/__Snapshots__/SnapshotTests/testMainThreadRenderingEngine.Issues-issue_1722-25.png b/Tests/__Snapshots__/SnapshotTests/testMainThreadRenderingEngine.Issues-issue_1722-25.png new file mode 100644 index 0000000000..13e580d910 Binary files /dev/null and b/Tests/__Snapshots__/SnapshotTests/testMainThreadRenderingEngine.Issues-issue_1722-25.png differ diff --git a/Tests/__Snapshots__/SnapshotTests/testMainThreadRenderingEngine.Issues-issue_1722-50.png b/Tests/__Snapshots__/SnapshotTests/testMainThreadRenderingEngine.Issues-issue_1722-50.png new file mode 100644 index 0000000000..e15cb468cf Binary files /dev/null and b/Tests/__Snapshots__/SnapshotTests/testMainThreadRenderingEngine.Issues-issue_1722-50.png differ diff --git a/Tests/__Snapshots__/SnapshotTests/testMainThreadRenderingEngine.Issues-issue_1722-75.png b/Tests/__Snapshots__/SnapshotTests/testMainThreadRenderingEngine.Issues-issue_1722-75.png new file mode 100644 index 0000000000..92302c2016 Binary files /dev/null and b/Tests/__Snapshots__/SnapshotTests/testMainThreadRenderingEngine.Issues-issue_1722-75.png differ