From fe01544a4c53d8b1dd91a0d11fb91b00f155d73c Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Fri, 15 May 2020 12:07:16 -0300 Subject: [PATCH] Add a Rect.Normalize method with tests. --- src/Avalonia.Visuals/Rect.cs | 47 +++++++++++++++++-- tests/Avalonia.Visuals.UnitTests/RectTests.cs | 16 +++++++ 2 files changed, 58 insertions(+), 5 deletions(-) diff --git a/src/Avalonia.Visuals/Rect.cs b/src/Avalonia.Visuals/Rect.cs index b0c4cb62eb..8dadaa3b0f 100644 --- a/src/Avalonia.Visuals/Rect.cs +++ b/src/Avalonia.Visuals/Rect.cs @@ -421,11 +421,48 @@ namespace Avalonia } /// - /// Gets the union of two rectangles. - /// - /// The other rectangle. - /// The union. - public Rect Union(Rect rect) + /// Normalizes the rectangle so both the and are positive, without changing the location of the rectangle + /// + /// Normalized Rect + /// + /// Empty rect will be return when Rect contains invalid values. Like NaN. + /// + public Rect Normalize() + { + Rect rect = this; + + if(double.IsNaN(rect.Right) || double.IsNaN(rect.Bottom) || double.IsNaN(rect.X) || double.IsNaN(rect.Y) || double.IsNaN(Height) || double.IsNaN(Width)) + { + return Rect.Empty; + } + + if (rect.Width < 0) + { + var old = X; + var x = X + Width; + var width = old - x; + + rect = rect.WithX(x).WithWidth(width); + } + if (rect.Height < 0) + { + var old = Y; + var y = Y + Height; + var height = old - y; + + rect = rect.WithY(y).WithHeight(height); + } + + return rect; + } + + + /// + /// Gets the union of two rectangles. + /// + /// The other rectangle. + /// The union. + public Rect Union(Rect rect) { if (IsEmpty) { diff --git a/tests/Avalonia.Visuals.UnitTests/RectTests.cs b/tests/Avalonia.Visuals.UnitTests/RectTests.cs index 34953e5fd7..89800e41bf 100644 --- a/tests/Avalonia.Visuals.UnitTests/RectTests.cs +++ b/tests/Avalonia.Visuals.UnitTests/RectTests.cs @@ -35,5 +35,21 @@ namespace Avalonia.Visuals.UnitTests Assert.Equal(new Rect(0, 0, 100, 100), result); } + + [Fact] + public void Normalize_Should_Reverse_Negative_Size() + { + var result = new Rect(new Point(100, 100), new Point(0, 0)).Normalize(); + + Assert.Equal(new Rect(0, 0, 100, 100), result); + } + + [Fact] + public void Normalize_Should_Make_Invalid_Rects_Empty() + { + var result = new Rect(double.NegativeInfinity,double.PositiveInfinity, double.PositiveInfinity, double.PositiveInfinity).Normalize(); + + Assert.Equal(Rect.Empty, result); + } } }