using System; using Microsoft.Xna.Framework; namespace MonoGame.Extended; /// /// Provides extension methods for the structure. /// public static class RectangleExtensions { /// /// Gets the corners of the rectangle in a clockwise direction starting at the top left. /// /// The rectangle to get the corners of. /// An array of elements representing the corners of the rectangle. public static Point[] GetCorners(this Rectangle rectangle) { var corners = new Point[4]; corners[0] = new Point(rectangle.Left, rectangle.Top); corners[1] = new Point(rectangle.Right, rectangle.Top); corners[2] = new Point(rectangle.Right, rectangle.Bottom); corners[3] = new Point(rectangle.Left, rectangle.Bottom); return corners; } /// /// Converts the specified to a . /// /// The rectangle to convert. /// The converted . public static RectangleF ToRectangleF(this Rectangle rectangle) { return new RectangleF(rectangle.X, rectangle.Y, rectangle.Width, rectangle.Height); } /// /// Clips the specified rectangle against the specified clipping rectangle. /// /// The rectangle to clip. /// The rectangle to clip against. /// The clipped rectangle, or if the rectangles do not intersect. public static Rectangle Clip(this Rectangle rectangle, Rectangle clippingRectangle) { int left = Math.Max(rectangle.Left, clippingRectangle.Left); int top = Math.Max(rectangle.Top, clippingRectangle.Top); int right = Math.Min(rectangle.Right, clippingRectangle.Right); int bottom = Math.Min(rectangle.Bottom, clippingRectangle.Bottom); int width = right - left; int height = bottom - top; if (width <= 0 || height <= 0) return Rectangle.Empty; return new Rectangle(left, top, width, height); } /// /// Gets a rectangle that is relative to the specified source rectangle, with the specified offsets and dimensions. /// /// The source rectangle. /// The x-coordinate of the relative rectangle, relative to the source rectangle. /// The y-coordinate of the relative rectangle, relative to the source rectangle. /// The width, in pixels, of the relative rectangle. /// The height, in pixels, of the relative rectangle. /// The relative rectangle, clipped to the source rectangle. public static Rectangle GetRelativeRectangle(this Rectangle source, int x, int y, int width, int height) { int absoluteX = source.X + x; int absoluteY = source.Y + y; Rectangle relative; relative.X = (int)MathHelper.Clamp(absoluteX, source.Left, source.Right); relative.Y = (int)MathHelper.Clamp(absoluteY, source.Top, source.Bottom); relative.Width = Math.Max(Math.Min(absoluteX + width, source.Right) - relative.X, 0); relative.Height = Math.Max(Math.Min(absoluteY + height, source.Bottom) - relative.Y, 0); return relative; } #if FNA // MomoGame compatibility layer /// /// Deconstruction method for Rectangle. /// public static void Deconstruct(this Rectangle rectangle, out int x, out int y, out int width, out int height) { x = rectangle.X; y = rectangle.Y; width = rectangle.Width; height = rectangle.Height; } #endif }