diff --git a/src/Avalonia.Base/Media/BoxShadow.cs b/src/Avalonia.Base/Media/BoxShadow.cs
index 71a7c672f2..4b04f84938 100644
--- a/src/Avalonia.Base/Media/BoxShadow.cs
+++ b/src/Avalonia.Base/Media/BoxShadow.cs
@@ -2,7 +2,6 @@ using System;
using System.Diagnostics.CodeAnalysis;
using System.Globalization;
using System.Text;
-using Avalonia.Animation.Animators;
using Avalonia.Utilities;
namespace Avalonia.Media
@@ -90,27 +89,21 @@ namespace Avalonia.Media
sb.Append("inset ");
}
- if (OffsetX != 0.0)
- {
- sb.AppendFormat("{0} ", OffsetX.ToString(CultureInfo.InvariantCulture));
- }
+ sb.AppendFormat(CultureInfo.InvariantCulture, "{0} ", OffsetX);
- if (OffsetY != 0.0)
- {
- sb.AppendFormat("{0} ", OffsetY.ToString(CultureInfo.InvariantCulture));
- }
+ sb.AppendFormat(CultureInfo.InvariantCulture, "{0} ", OffsetY);
- if (Blur != 0.0)
+ if (Blur != 0.0 || Spread != 0.0)
{
- sb.AppendFormat("{0} ", Blur.ToString(CultureInfo.InvariantCulture));
+ sb.AppendFormat(CultureInfo.InvariantCulture, "{0} ", Blur);
}
if (Spread != 0.0)
{
- sb.AppendFormat("{0} ", Spread.ToString(CultureInfo.InvariantCulture));
+ sb.AppendFormat(CultureInfo.InvariantCulture, "{0} ", Spread);
}
- sb.AppendFormat("{0}", Color.ToString());
+ Color.ToString(sb);
}
public static unsafe BoxShadow Parse(string s)
diff --git a/src/Avalonia.Base/Media/Color.cs b/src/Avalonia.Base/Media/Color.cs
index d100fa2822..ba487b1e80 100644
--- a/src/Avalonia.Base/Media/Color.cs
+++ b/src/Avalonia.Base/Media/Color.cs
@@ -447,6 +447,20 @@ namespace Avalonia.Media
return KnownColors.GetKnownColorName(rgb) ?? $"#{rgb.ToString("x8", CultureInfo.InvariantCulture)}";
}
+ internal void ToString(System.Text.StringBuilder builder)
+ {
+ uint rgb = ToUInt32();
+ if(KnownColors.TryGetKnownColorName(rgb, out var name))
+ {
+ builder.Append(name);
+ }
+ else
+ {
+ builder.Append('#');
+ builder.AppendFormat(CultureInfo.InvariantCulture, "{0:x8}", rgb);
+ }
+ }
+
///
/// Returns the integer representation of the color.
///
diff --git a/src/Avalonia.Base/Media/KnownColors.cs b/src/Avalonia.Base/Media/KnownColors.cs
index 64cf1ef2f1..a0dea275bd 100644
--- a/src/Avalonia.Base/Media/KnownColors.cs
+++ b/src/Avalonia.Base/Media/KnownColors.cs
@@ -2,6 +2,7 @@ using System;
using System.Reflection;
using System.Collections.Generic;
using Avalonia.SourceGenerator;
+using System.Diagnostics.CodeAnalysis;
namespace Avalonia.Media
{
@@ -66,6 +67,9 @@ namespace Avalonia.Media
return _knownColors.TryGetValue(rgb, out var name) ? name : null;
}
+ internal static bool TryGetKnownColorName(uint rgb, [NotNullWhen(true)] out string? name)
+ => _knownColors.TryGetValue(rgb, out name);
+
public static Color ToColor(this KnownColor color)
{
return Color.FromUInt32((uint)color);
diff --git a/tests/Avalonia.Base.UnitTests/Media/BoxShadowTests.cs b/tests/Avalonia.Base.UnitTests/Media/BoxShadowTests.cs
index c9092bb133..c553a3b953 100644
--- a/tests/Avalonia.Base.UnitTests/Media/BoxShadowTests.cs
+++ b/tests/Avalonia.Base.UnitTests/Media/BoxShadowTests.cs
@@ -1,3 +1,4 @@
+using System.Collections.Generic;
using Avalonia.Media;
using Xunit;
@@ -5,49 +6,111 @@ namespace Avalonia.Base.UnitTests.Media
{
public class BoxShadowTests
{
- [Fact]
- public void BoxShadow_Should_Parse()
+ [Theory]
+ [MemberData(nameof(ParseGetData))]
+ public void BoxShadow_Should_Parse(BoxShadow expected, string source)
+ {
+ var parsered = BoxShadow.Parse(source);
+ Assert.Equal(expected.IsInset, parsered.IsInset);
+ Assert.Equal(expected.OffsetX, parsered.OffsetX);
+ Assert.Equal(expected.OffsetY, parsered.OffsetY);
+ Assert.Equal(expected.Blur, parsered.Blur);
+ Assert.Equal(expected.Spread, parsered.Spread);
+ Assert.Equal(expected.Color, parsered.Color);
+ }
+
+ [Theory]
+ [MemberData(nameof(ToStringGetData))]
+ public void BoxShadows_Should_ToString(BoxShadows source, string expected) =>
+ Assert.Equal(expected, source.ToString(), true);
+
+ public static IEnumerable