From d4355adb70e5566e862e9ac7d79a63863373d0e8 Mon Sep 17 00:00:00 2001 From: Jumar Macato Date: Sun, 9 Dec 2018 19:36:05 +0800 Subject: [PATCH] Attempt to make Color animations work --- samples/RenderDemo/Pages/AnimationsPage.xaml | 1 + .../Animation/Animators/ColorAnimator.cs | 4 +- .../Animators/SolidColorBrushAnimator.cs | 69 +++++++++++++++++++ src/Avalonia.Visuals/Media/Brush.cs | 3 +- src/Avalonia.Visuals/Media/Color.cs | 4 +- src/Avalonia.Visuals/Media/SolidColorBrush.cs | 3 + 6 files changed, 79 insertions(+), 5 deletions(-) create mode 100644 src/Avalonia.Visuals/Animation/Animators/SolidColorBrushAnimator.cs diff --git a/samples/RenderDemo/Pages/AnimationsPage.xaml b/samples/RenderDemo/Pages/AnimationsPage.xaml index 728b8f697a..644d6523c1 100644 --- a/samples/RenderDemo/Pages/AnimationsPage.xaml +++ b/samples/RenderDemo/Pages/AnimationsPage.xaml @@ -87,6 +87,7 @@ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> + diff --git a/src/Avalonia.Visuals/Animation/Animators/ColorAnimator.cs b/src/Avalonia.Visuals/Animation/Animators/ColorAnimator.cs index 734fa820be..1bd84dc9a2 100644 --- a/src/Avalonia.Visuals/Animation/Animators/ColorAnimator.cs +++ b/src/Avalonia.Visuals/Animation/Animators/ColorAnimator.cs @@ -1,7 +1,8 @@ -// Original source was written by Romain Guy and Francois Blavoet +// Original color interpolation code was written by Romain Guy and Francois Blavoet // and adopted from LottieSharp Project (https://github.com/ascora/LottieSharp). using System; +using System.Reactive.Disposables; using Avalonia.Logging; using Avalonia.Media; @@ -45,7 +46,6 @@ namespace Avalonia.Animation.Animators oldR = EOCF_sRGB(oldR); oldG = EOCF_sRGB(oldG); oldB = EOCF_sRGB(oldB); - newR = EOCF_sRGB(newR); newG = EOCF_sRGB(newG); newB = EOCF_sRGB(newB); diff --git a/src/Avalonia.Visuals/Animation/Animators/SolidColorBrushAnimator.cs b/src/Avalonia.Visuals/Animation/Animators/SolidColorBrushAnimator.cs new file mode 100644 index 0000000000..ce2bf41fd6 --- /dev/null +++ b/src/Avalonia.Visuals/Animation/Animators/SolidColorBrushAnimator.cs @@ -0,0 +1,69 @@ +using System; +using System.Reactive.Disposables; +using Avalonia.Logging; +using Avalonia.Media; +using Avalonia.Media.Immutable; + +namespace Avalonia.Animation.Animators +{ + /// + /// Animator that interpolates through + /// gamma sRGB color space for better visual result. + /// + public class SolidColorBrushAnimator : Animator + { + ColorAnimator colorAnimator; + + void InitializeColorAnimator() + { + colorAnimator = new ColorAnimator(); + + foreach (AnimatorKeyFrame keyframe in this) + { + colorAnimator.Add(keyframe); + } + } + + public override IDisposable Apply(Animation animation, Animatable control, IClock clock, IObservable match, Action onComplete) + { + var ctrl = (Visual)control; + + foreach (var keyframe in this) + { + if (keyframe.Value as ISolidColorBrush == null) + return Disposable.Empty; + } + + if (control.GetValue(Property) == null) + control.SetValue(Property, new SolidColorBrush(Colors.Transparent)); + + var targetVal = control.GetValue(Property); + + if (typeof(ISolidColorBrush).IsAssignableFrom(targetVal.GetType())) + { + if (colorAnimator == null) + InitializeColorAnimator(); + + SolidColorBrush finalTarget = new SolidColorBrush(); + + if (targetVal.GetType() == typeof(ImmutableSolidColorBrush)) + { + var k = (ImmutableSolidColorBrush)targetVal; + finalTarget.Color = k.Color; + } + else + { + finalTarget = targetVal as SolidColorBrush; + } + + colorAnimator.Property = SolidColorBrush.ColorProperty; + + return colorAnimator.Apply(animation, finalTarget, clock ?? control.Clock, match, onComplete); + } + + return Disposable.Empty; + } + + public override SolidColorBrush Interpolate(double p, SolidColorBrush o, SolidColorBrush n) => null; + } +} \ No newline at end of file diff --git a/src/Avalonia.Visuals/Media/Brush.cs b/src/Avalonia.Visuals/Media/Brush.cs index c2c041f073..f36cd88537 100644 --- a/src/Avalonia.Visuals/Media/Brush.cs +++ b/src/Avalonia.Visuals/Media/Brush.cs @@ -3,6 +3,7 @@ using System; using System.ComponentModel; +using Avalonia.Animation; namespace Avalonia.Media { @@ -10,7 +11,7 @@ namespace Avalonia.Media /// Describes how an area is painted. /// [TypeConverter(typeof(BrushConverter))] - public abstract class Brush : AvaloniaObject, IMutableBrush + public abstract class Brush : Animatable, IMutableBrush { /// /// Defines the property. diff --git a/src/Avalonia.Visuals/Media/Color.cs b/src/Avalonia.Visuals/Media/Color.cs index 5c28ac8bef..a37463a0f0 100644 --- a/src/Avalonia.Visuals/Media/Color.cs +++ b/src/Avalonia.Visuals/Media/Color.cs @@ -15,9 +15,9 @@ namespace Avalonia.Media { static Color() { - Animation.Animation.RegisterAnimator(prop => typeof(IBrush).IsAssignableFrom(prop.PropertyType)); + Animation.Animation.RegisterAnimator(prop => typeof(Color).IsAssignableFrom(prop.PropertyType)); } - + /// /// Gets or sets the Alpha component of the color. /// diff --git a/src/Avalonia.Visuals/Media/SolidColorBrush.cs b/src/Avalonia.Visuals/Media/SolidColorBrush.cs index 32b87df56b..bacb9e4ad7 100644 --- a/src/Avalonia.Visuals/Media/SolidColorBrush.cs +++ b/src/Avalonia.Visuals/Media/SolidColorBrush.cs @@ -1,6 +1,8 @@ // Copyright (c) The Avalonia Project. All rights reserved. // Licensed under the MIT license. See licence.md file in the project root for full license information. +using Avalonia.Animation; +using Avalonia.Animation.Animators; using Avalonia.Media.Immutable; namespace Avalonia.Media @@ -18,6 +20,7 @@ namespace Avalonia.Media static SolidColorBrush() { + Animation.Animation.RegisterAnimator(prop => typeof(IBrush).IsAssignableFrom(prop.PropertyType)); AffectsRender(ColorProperty); }