diff --git a/src/SixLabors.Core/Primitives/Point.cs b/src/SixLabors.Core/Primitives/Point.cs
index 6b9e129d8..77ebb62f6 100644
--- a/src/SixLabors.Core/Primitives/Point.cs
+++ b/src/SixLabors.Core/Primitives/Point.cs
@@ -1,4 +1,4 @@
-// Copyright (c) Six Labors and contributors.
+// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using System;
@@ -235,6 +235,17 @@ namespace SixLabors.Primitives
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Point Transform(Point point, Matrix3x2 matrix) => Round(Vector2.Transform(new Vector2(point.X, point.Y), matrix));
+ ///
+ /// Deconstructs this point into two integers
+ ///
+ /// The out value for X
+ /// The out value for Y
+ public void Deconstruct(out int x, out int y)
+ {
+ x = this.X;
+ y = this.Y;
+ }
+
///
/// Translates this by the specified amount.
///
diff --git a/src/SixLabors.Core/Primitives/PointF.cs b/src/SixLabors.Core/Primitives/PointF.cs
index a214b32e5..844a5f264 100644
--- a/src/SixLabors.Core/Primitives/PointF.cs
+++ b/src/SixLabors.Core/Primitives/PointF.cs
@@ -1,4 +1,4 @@
-// Copyright (c) Six Labors and contributors.
+// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using System;
@@ -247,6 +247,17 @@ namespace SixLabors.Primitives
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static PointF Transform(PointF point, Matrix3x2 matrix) => Vector2.Transform(point, matrix);
+ ///
+ /// Deconstructs this point into two floats
+ ///
+ /// The out value for X
+ /// The out value for Y
+ public void Deconstruct(out float x, out float y)
+ {
+ x = this.X;
+ y = this.Y;
+ }
+
///
/// Translates this by the specified amount.
///
diff --git a/src/SixLabors.Core/Primitives/Rectangle.cs b/src/SixLabors.Core/Primitives/Rectangle.cs
index 26694a028..239813ac7 100644
--- a/src/SixLabors.Core/Primitives/Rectangle.cs
+++ b/src/SixLabors.Core/Primitives/Rectangle.cs
@@ -1,4 +1,4 @@
-// Copyright (c) Six Labors and contributors.
+// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using System;
@@ -320,6 +320,21 @@ namespace SixLabors.Primitives
return new Rectangle(x1, y1, x2 - x1, y2 - y1);
}
+ ///
+ /// Deconstructs this rectangle into four integers
+ ///
+ /// The out value for X
+ /// The out value for Y
+ /// The out value for the width
+ /// The out value for the height
+ public void Deconstruct(out int x, out int y, out int width, out int height)
+ {
+ x = this.X;
+ y = this.Y;
+ width = this.Width;
+ height = this.Height;
+ }
+
///
/// Creates a Rectangle that represents the intersection between this Rectangle and the .
///
diff --git a/src/SixLabors.Core/Primitives/RectangleF.cs b/src/SixLabors.Core/Primitives/RectangleF.cs
index b5b96efc8..f212e5bcc 100644
--- a/src/SixLabors.Core/Primitives/RectangleF.cs
+++ b/src/SixLabors.Core/Primitives/RectangleF.cs
@@ -1,4 +1,4 @@
-// Copyright (c) Six Labors and contributors.
+// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using System;
@@ -259,6 +259,21 @@ namespace SixLabors.Primitives
return new RectangleF(x1, y1, x2 - x1, y2 - y1);
}
+ ///
+ /// Deconstructs this rectangle into four floats
+ ///
+ /// The out value for X
+ /// The out value for Y
+ /// The out value for the width
+ /// The out value for the height
+ public void Deconstruct(out float x, out float y, out float width, out float height)
+ {
+ x = this.X;
+ y = this.Y;
+ width = this.Width;
+ height = this.Height;
+ }
+
///
/// Creates a RectangleF that represents the intersection between this RectangleF and the .
///
diff --git a/src/SixLabors.Core/Primitives/Size.cs b/src/SixLabors.Core/Primitives/Size.cs
index 4c6c37979..0c468a80b 100644
--- a/src/SixLabors.Core/Primitives/Size.cs
+++ b/src/SixLabors.Core/Primitives/Size.cs
@@ -1,4 +1,4 @@
-// Copyright (c) Six Labors and contributors.
+// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using System;
@@ -251,6 +251,17 @@ namespace SixLabors.Primitives
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Size Truncate(SizeF size) => new Size(unchecked((int)size.Width), unchecked((int)size.Height));
+ ///
+ /// Deconstructs this size into two integers
+ ///
+ /// The out value for the width
+ /// The out value for the height
+ public void Deconstruct(out int width, out int height)
+ {
+ width = this.Width;
+ height = this.Height;
+ }
+
///
public override int GetHashCode() => HashCode.Combine(this.Width, this.Height);
diff --git a/src/SixLabors.Core/Primitives/SizeF.cs b/src/SixLabors.Core/Primitives/SizeF.cs
index a2bd687be..b7e15b5e3 100644
--- a/src/SixLabors.Core/Primitives/SizeF.cs
+++ b/src/SixLabors.Core/Primitives/SizeF.cs
@@ -1,4 +1,4 @@
-// Copyright (c) Six Labors and contributors.
+// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using System;
@@ -197,6 +197,17 @@ namespace SixLabors.Primitives
return new SizeF(v.X, v.Y);
}
+ ///
+ /// Deconstructs this size into two floats
+ ///
+ /// The out value for the width
+ /// The out value for the height
+ public void Deconstruct(out float width, out float height)
+ {
+ width = this.Width;
+ height = this.Height;
+ }
+
///
public override int GetHashCode() => HashCode.Combine(this.Width, this.Height);
diff --git a/tests/SixLabors.Core.Tests/Primitives/PointFTests.cs b/tests/SixLabors.Core.Tests/Primitives/PointFTests.cs
index cdd7410d5..8535b3fb0 100644
--- a/tests/SixLabors.Core.Tests/Primitives/PointFTests.cs
+++ b/tests/SixLabors.Core.Tests/Primitives/PointFTests.cs
@@ -1,4 +1,4 @@
-// Copyright (c) Six Labors and contributors.
+// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using System;
@@ -191,5 +191,20 @@ namespace SixLabors.Primitives.Tests
var p = new PointF(5.1F, -5.123F);
Assert.Equal(string.Format(CultureInfo.CurrentCulture, "PointF [ X={0}, Y={1} ]", p.X, p.Y), p.ToString());
}
+
+ [Theory]
+ [InlineData(float.MaxValue, float.MinValue)]
+ [InlineData(float.MinValue, float.MinValue)]
+ [InlineData(float.MaxValue, float.MaxValue)]
+ [InlineData(0, 0)]
+ public void DeconstructTest(float x, float y)
+ {
+ PointF p = new PointF(x, y);
+
+ (float deconstructedX, float deconstructedY) = p;
+
+ Assert.Equal(x, deconstructedX);
+ Assert.Equal(y, deconstructedY);
+ }
}
}
\ No newline at end of file
diff --git a/tests/SixLabors.Core.Tests/Primitives/PointTests.cs b/tests/SixLabors.Core.Tests/Primitives/PointTests.cs
index 43d662572..6a873567b 100644
--- a/tests/SixLabors.Core.Tests/Primitives/PointTests.cs
+++ b/tests/SixLabors.Core.Tests/Primitives/PointTests.cs
@@ -1,4 +1,4 @@
-// Copyright (c) Six Labors and contributors.
+// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using System;
@@ -239,5 +239,20 @@ namespace SixLabors.Primitives.Tests
var p = new Point(5, -5);
Assert.Equal(string.Format(CultureInfo.CurrentCulture, "Point [ X={0}, Y={1} ]", p.X, p.Y), p.ToString());
}
+
+ [Theory]
+ [InlineData(int.MaxValue, int.MinValue)]
+ [InlineData(int.MinValue, int.MinValue)]
+ [InlineData(int.MaxValue, int.MaxValue)]
+ [InlineData(0, 0)]
+ public void DeconstructTest(int x, int y)
+ {
+ Point p = new Point(x, y);
+
+ (int deconstructedX, int deconstructedY) = p;
+
+ Assert.Equal(x, deconstructedX);
+ Assert.Equal(y, deconstructedY);
+ }
}
}
\ No newline at end of file
diff --git a/tests/SixLabors.Core.Tests/Primitives/RectangleFTests.cs b/tests/SixLabors.Core.Tests/Primitives/RectangleFTests.cs
index 463509eac..926416ae5 100644
--- a/tests/SixLabors.Core.Tests/Primitives/RectangleFTests.cs
+++ b/tests/SixLabors.Core.Tests/Primitives/RectangleFTests.cs
@@ -1,4 +1,4 @@
-// Copyright (c) Six Labors and contributors.
+// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using System;
@@ -252,5 +252,35 @@ namespace SixLabors.Primitives.Tests
var r = new RectangleF(5, 5.1F, 1.3F, 1);
Assert.Equal(string.Format(CultureInfo.CurrentCulture, "RectangleF [ X={0}, Y={1}, Width={2}, Height={3} ]", r.X, r.Y, r.Width, r.Height), r.ToString());
}
+
+ [Theory]
+ [InlineData(float.MinValue, float.MaxValue, float.MaxValue, float.MaxValue)]
+ [InlineData(float.MinValue, float.MaxValue, float.MaxValue, float.MinValue)]
+ [InlineData(float.MinValue, float.MaxValue, float.MinValue, float.MaxValue)]
+ [InlineData(float.MinValue, float.MaxValue, float.MinValue, float.MinValue)]
+ [InlineData(float.MinValue, float.MinValue, float.MaxValue, float.MaxValue)]
+ [InlineData(float.MinValue, float.MinValue, float.MaxValue, float.MinValue)]
+ [InlineData(float.MinValue, float.MinValue, float.MinValue, float.MaxValue)]
+ [InlineData(float.MinValue, float.MinValue, float.MinValue, float.MinValue)]
+ [InlineData(float.MaxValue, float.MaxValue, float.MaxValue, float.MaxValue)]
+ [InlineData(float.MaxValue, float.MaxValue, float.MaxValue, float.MinValue)]
+ [InlineData(float.MaxValue, float.MaxValue, float.MinValue, float.MaxValue)]
+ [InlineData(float.MaxValue, float.MaxValue, float.MinValue, float.MinValue)]
+ [InlineData(float.MaxValue, float.MinValue, float.MaxValue, float.MaxValue)]
+ [InlineData(float.MaxValue, float.MinValue, float.MaxValue, float.MinValue)]
+ [InlineData(float.MaxValue, float.MinValue, float.MinValue, float.MaxValue)]
+ [InlineData(float.MaxValue, float.MinValue, float.MinValue, float.MinValue)]
+ [InlineData(0, 0, 0, 0)]
+ public void DeconstructTest(float x, float y, float width, float height)
+ {
+ RectangleF r = new RectangleF(x, y, width, height);
+
+ (float dx, float dy, float dw, float dh) = r;
+
+ Assert.Equal(x, dx);
+ Assert.Equal(y, dy);
+ Assert.Equal(width, dw);
+ Assert.Equal(height, dh);
+ }
}
}
\ No newline at end of file
diff --git a/tests/SixLabors.Core.Tests/Primitives/RectangleTests.cs b/tests/SixLabors.Core.Tests/Primitives/RectangleTests.cs
index 90354bd72..8a00cd1fc 100644
--- a/tests/SixLabors.Core.Tests/Primitives/RectangleTests.cs
+++ b/tests/SixLabors.Core.Tests/Primitives/RectangleTests.cs
@@ -1,4 +1,4 @@
-// Copyright (c) Six Labors and contributors.
+// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using System;
@@ -294,5 +294,35 @@ namespace SixLabors.Primitives.Tests
var r = new Rectangle(5, -5, 0, 1);
Assert.Equal(string.Format(CultureInfo.CurrentCulture, "Rectangle [ X={0}, Y={1}, Width={2}, Height={3} ]", r.X, r.Y, r.Width, r.Height), r.ToString());
}
+
+ [Theory]
+ [InlineData(int.MinValue, int.MaxValue, int.MaxValue, int.MaxValue)]
+ [InlineData(int.MinValue, int.MaxValue, int.MaxValue, int.MinValue)]
+ [InlineData(int.MinValue, int.MaxValue, int.MinValue, int.MaxValue)]
+ [InlineData(int.MinValue, int.MaxValue, int.MinValue, int.MinValue)]
+ [InlineData(int.MinValue, int.MinValue, int.MaxValue, int.MaxValue)]
+ [InlineData(int.MinValue, int.MinValue, int.MaxValue, int.MinValue)]
+ [InlineData(int.MinValue, int.MinValue, int.MinValue, int.MaxValue)]
+ [InlineData(int.MinValue, int.MinValue, int.MinValue, int.MinValue)]
+ [InlineData(int.MaxValue, int.MaxValue, int.MaxValue, int.MaxValue)]
+ [InlineData(int.MaxValue, int.MaxValue, int.MaxValue, int.MinValue)]
+ [InlineData(int.MaxValue, int.MaxValue, int.MinValue, int.MaxValue)]
+ [InlineData(int.MaxValue, int.MaxValue, int.MinValue, int.MinValue)]
+ [InlineData(int.MaxValue, int.MinValue, int.MaxValue, int.MaxValue)]
+ [InlineData(int.MaxValue, int.MinValue, int.MaxValue, int.MinValue)]
+ [InlineData(int.MaxValue, int.MinValue, int.MinValue, int.MaxValue)]
+ [InlineData(int.MaxValue, int.MinValue, int.MinValue, int.MinValue)]
+ [InlineData(0, 0, 0, 0)]
+ public void DeconstructTest(int x, int y, int width, int height)
+ {
+ Rectangle r = new Rectangle(x, y, width, height);
+
+ (int dx, int dy, int dw, int dh) = r;
+
+ Assert.Equal(x, dx);
+ Assert.Equal(y, dy);
+ Assert.Equal(width, dw);
+ Assert.Equal(height, dh);
+ }
}
}
\ No newline at end of file
diff --git a/tests/SixLabors.Core.Tests/Primitives/SizeFTests.cs b/tests/SixLabors.Core.Tests/Primitives/SizeFTests.cs
index 71f856646..0545a93db 100644
--- a/tests/SixLabors.Core.Tests/Primitives/SizeFTests.cs
+++ b/tests/SixLabors.Core.Tests/Primitives/SizeFTests.cs
@@ -231,5 +231,20 @@ namespace SixLabors.Primitives.Tests
SizeF expected = new SizeF(width / divisor, height / divisor);
Assert.Equal(expected, size / divisor);
}
+
+ [Theory]
+ [InlineData(float.MaxValue, float.MinValue)]
+ [InlineData(float.MinValue, float.MinValue)]
+ [InlineData(float.MaxValue, float.MaxValue)]
+ [InlineData(0, 0)]
+ public void DeconstructTest(float width, float height)
+ {
+ SizeF s = new SizeF(width, height);
+
+ (float deconstructedWidth, float deconstructedHeight) = s;
+
+ Assert.Equal(width, deconstructedWidth);
+ Assert.Equal(height, deconstructedHeight);
+ }
}
}
\ No newline at end of file
diff --git a/tests/SixLabors.Core.Tests/Primitives/SizeTests.cs b/tests/SixLabors.Core.Tests/Primitives/SizeTests.cs
index 0cfb62dd5..05f690603 100644
--- a/tests/SixLabors.Core.Tests/Primitives/SizeTests.cs
+++ b/tests/SixLabors.Core.Tests/Primitives/SizeTests.cs
@@ -1,4 +1,4 @@
-// Copyright (c) Six Labors and contributors.
+// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using System;
@@ -360,5 +360,20 @@ namespace SixLabors.Primitives.Tests
expected = new SizeF(width / divisor, height / divisor);
Assert.Equal(expected, size / divisor);
}
+
+ [Theory]
+ [InlineData(int.MaxValue, int.MinValue)]
+ [InlineData(int.MinValue, int.MinValue)]
+ [InlineData(int.MaxValue, int.MaxValue)]
+ [InlineData(0, 0)]
+ public void DeconstructTest(int width, int height)
+ {
+ Size s = new Size(width, height);
+
+ (int deconstructedWidth, int deconstructedHeight) = s;
+
+ Assert.Equal(width, deconstructedWidth);
+ Assert.Equal(height, deconstructedHeight);
+ }
}
}
\ No newline at end of file