Browse Source

Add a Rect.Normalize method with tests.

pull/3948/head
Dan Walmsley 6 years ago
parent
commit
fe01544a4c
  1. 47
      src/Avalonia.Visuals/Rect.cs
  2. 16
      tests/Avalonia.Visuals.UnitTests/RectTests.cs

47
src/Avalonia.Visuals/Rect.cs

@ -421,11 +421,48 @@ namespace Avalonia
}
/// <summary>
/// Gets the union of two rectangles.
/// </summary>
/// <param name="rect">The other rectangle.</param>
/// <returns>The union.</returns>
public Rect Union(Rect rect)
/// Normalizes the rectangle so both the <see cref="Width"/> and <see cref="Height"/> are positive, without changing the location of the rectangle
/// </summary>
/// <returns>Normalized Rect</returns>
/// <remarks>
/// Empty rect will be return when Rect contains invalid values. Like NaN.
/// </remarks>
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;
}
/// <summary>
/// Gets the union of two rectangles.
/// </summary>
/// <param name="rect">The other rectangle.</param>
/// <returns>The union.</returns>
public Rect Union(Rect rect)
{
if (IsEmpty)
{

16
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);
}
}
}

Loading…
Cancel
Save