257 lines
		
	
	
		
			8.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			257 lines
		
	
	
		
			8.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
								 | 
							
								////////////////////////////////////////////////////////////////////////////////////////////////////
							 | 
						||
| 
								 | 
							
								// NoesisGUI - http://www.noesisengine.com
							 | 
						||
| 
								 | 
							
								// Copyright (c) 2013 Noesis Technologies S.L. All Rights Reserved.
							 | 
						||
| 
								 | 
							
								////////////////////////////////////////////////////////////////////////////////////////////////////
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifndef __DRAWING_RECT_H__
							 | 
						||
| 
								 | 
							
								#define __DRAWING_RECT_H__
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <NsCore/Noesis.h>
							 | 
						||
| 
								 | 
							
								#include <NsCore/ReflectionImplement.h>
							 | 
						||
| 
								 | 
							
								#include <NsCore/StringFwd.h>
							 | 
						||
| 
								 | 
							
								#include <NsDrawing/TypesApi.h>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace Noesis
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class Transform2;
							 | 
						||
| 
								 | 
							
								class Matrix4;
							 | 
						||
| 
								 | 
							
								struct Size;
							 | 
						||
| 
								 | 
							
								struct Sizei;
							 | 
						||
| 
								 | 
							
								struct Point;
							 | 
						||
| 
								 | 
							
								struct Pointi;
							 | 
						||
| 
								 | 
							
								struct Recti;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								////////////////////////////////////////////////////////////////////////////////////////////////////
							 | 
						||
| 
								 | 
							
								/// A 2D Rectangle defined by an origin and a size
							 | 
						||
| 
								 | 
							
								////////////////////////////////////////////////////////////////////////////////////////////////////
							 | 
						||
| 
								 | 
							
								struct Rect
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    float x;
							 | 
						||
| 
								 | 
							
								    float y;
							 | 
						||
| 
								 | 
							
								    float width;
							 | 
						||
| 
								 | 
							
								    float height;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /// Default constructor which initializes all values to 0
							 | 
						||
| 
								 | 
							
								    Rect();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /// Constructor from coordinates for the sides of the rectangle
							 | 
						||
| 
								 | 
							
								    /// The width of the new rectangle is right - left
							 | 
						||
| 
								 | 
							
								    /// The height of the new rectangle is bottom - top
							 | 
						||
| 
								 | 
							
								    Rect(float left, float top, float right, float bottom);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /// Constructor from size. The created rectangle is located at the origin (0,0)
							 | 
						||
| 
								 | 
							
								    explicit Rect(const Size& size);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /// Constructor from location and size
							 | 
						||
| 
								 | 
							
								    Rect(const Point& location, const Size& size);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /// Constructor from an integer rect
							 | 
						||
| 
								 | 
							
								    Rect(const Recti& rect);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /// Copy constructor
							 | 
						||
| 
								 | 
							
								    Rect(const Rect& rect) = default;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /// Copy operator
							 | 
						||
| 
								 | 
							
								    Rect& operator=(const Rect& rect) = default;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /// Comparison operators
							 | 
						||
| 
								 | 
							
								    bool operator==(const Rect& rect) const;
							 | 
						||
| 
								 | 
							
								    bool operator!=(const Rect& rect) const;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /// Gets or sets the position of the rectangle's top-left corner
							 | 
						||
| 
								 | 
							
								    Point GetLocation() const;
							 | 
						||
| 
								 | 
							
								    void SetLocation(const Point& location);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /// Gets or sets the width and height of the rectangle
							 | 
						||
| 
								 | 
							
								    Size GetSize() const;
							 | 
						||
| 
								 | 
							
								    void SetSize(const Size& size);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /// Accessors to rectangle sides
							 | 
						||
| 
								 | 
							
								    float GetLeft() const;
							 | 
						||
| 
								 | 
							
								    float GetRight() const;
							 | 
						||
| 
								 | 
							
								    float GetTop() const;
							 | 
						||
| 
								 | 
							
								    float GetBottom() const;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /// Accessors to rectangle corners
							 | 
						||
| 
								 | 
							
								    Point GetTopLeft() const;
							 | 
						||
| 
								 | 
							
								    Point GetTopRight() const;
							 | 
						||
| 
								 | 
							
								    Point GetBottomLeft() const;
							 | 
						||
| 
								 | 
							
								    Point GetBottomRight() const;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /// Indicates whether this rectangle is empty (its size is 0)
							 | 
						||
| 
								 | 
							
								    bool IsEmpty() const;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /// Determines whether this rectangle contains the specified point or rectangle
							 | 
						||
| 
								 | 
							
								    bool Contains(float x, float y) const;
							 | 
						||
| 
								 | 
							
								    bool Contains(const Point& point) const;
							 | 
						||
| 
								 | 
							
								    bool Contains(const Rect& rect) const;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /// Expands or contracts the rectangle by the specified amount
							 | 
						||
| 
								 | 
							
								    /// The width of the resulting rectangle is increased or decreased by twice the specified width
							 | 
						||
| 
								 | 
							
								    /// offset, because it is applied to both the left and right sides of the rectangle. Likewise,
							 | 
						||
| 
								 | 
							
								    /// the height of the rectangle is increased or decreased by twice the specified height
							 | 
						||
| 
								 | 
							
								    /// If the specified width or height modifiers shrink the rectangle by more than its current
							 | 
						||
| 
								 | 
							
								    /// width or height (giving a negative area) this rectangle becomes the Empty rectangle
							 | 
						||
| 
								 | 
							
								    void Inflate(float width, float height);
							 | 
						||
| 
								 | 
							
								    void Inflate(const Size& size);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /// Finds the intersection of two rectangles and stores the result as a Rect structure
							 | 
						||
| 
								 | 
							
								    Rect Intersect(const Rect& rect) const;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /// Indicates whether the specified rectangle intersects with this rectangle
							 | 
						||
| 
								 | 
							
								    bool IntersectsWith(const Rect& rect) const;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /// Translates the rectangle by the specified amount
							 | 
						||
| 
								 | 
							
								    void Offset(const Point& offset);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /// Multiplies the size of the current rectangle by the specified x and y value
							 | 
						||
| 
								 | 
							
								    void Scale(float scaleX, float scaleY);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /// Expands a rectangle exactly enough to contain the specified rectangle or point
							 | 
						||
| 
								 | 
							
								    void Expand(const Point& point);
							 | 
						||
| 
								 | 
							
								    void Expand(const Rect& rect);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /// Transforms the rectangle by the given matrix
							 | 
						||
| 
								 | 
							
								    void Transform(const Transform2& mtx);
							 | 
						||
| 
								 | 
							
								    void Transform(const Matrix4& mtx);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /// Creates a string representation of this rectangle
							 | 
						||
| 
								 | 
							
								    /// The string has the following form: "x,y,width,height"
							 | 
						||
| 
								 | 
							
								    NS_DRAWING_TYPES_API String ToString() const;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /// Tries to parse a Rect from a string
							 | 
						||
| 
								 | 
							
								    NS_DRAWING_TYPES_API static bool TryParse(const char* str, Rect& result);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /// Empty rect (with all members set to 0)
							 | 
						||
| 
								 | 
							
								    static Rect Empty();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    NS_IMPLEMENT_INLINE_REFLECTION(Rect, NoParent)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        NsProp("X", &Rect::x);
							 | 
						||
| 
								 | 
							
								        NsProp("Y", &Rect::y);
							 | 
						||
| 
								 | 
							
								        NsProp("Width", &Rect::width);
							 | 
						||
| 
								 | 
							
								        NsProp("Height", &Rect::height);
							 | 
						||
| 
								 | 
							
								        NsProp("IsEmpty", &Rect::IsEmpty);
							 | 
						||
| 
								 | 
							
								        NsProp("Left", &Rect::GetLeft);
							 | 
						||
| 
								 | 
							
								        NsProp("Top", &Rect::GetTop);
							 | 
						||
| 
								 | 
							
								        NsProp("Right", &Rect::GetRight);
							 | 
						||
| 
								 | 
							
								        NsProp("Bottom", &Rect::GetBottom);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								////////////////////////////////////////////////////////////////////////////////////////////////////
							 | 
						||
| 
								 | 
							
								/// A 2D Rectangle defined by an integer origin and an integer size
							 | 
						||
| 
								 | 
							
								////////////////////////////////////////////////////////////////////////////////////////////////////
							 | 
						||
| 
								 | 
							
								struct Recti
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    int x;
							 | 
						||
| 
								 | 
							
								    int y;
							 | 
						||
| 
								 | 
							
								    uint32_t width;
							 | 
						||
| 
								 | 
							
								    uint32_t height;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /// Default constructor which initializes all values to 0
							 | 
						||
| 
								 | 
							
								    Recti();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /// Constructor from coordinates for the sides of the rectangle
							 | 
						||
| 
								 | 
							
								    /// The width of the new rectangle is right - left
							 | 
						||
| 
								 | 
							
								    /// The height of the new rectangle is bottom - top
							 | 
						||
| 
								 | 
							
								    Recti(int left, int top, int right, int bottom);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /// Constructor from size. The created rectangle is located at the origin (0,0)
							 | 
						||
| 
								 | 
							
								    explicit Recti(const Sizei& size);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /// Constructor from location and size
							 | 
						||
| 
								 | 
							
								    Recti(const Pointi& location, const Sizei& size);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /// Copy constructor
							 | 
						||
| 
								 | 
							
								    Recti(const Recti& rect) = default;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /// Copy operator
							 | 
						||
| 
								 | 
							
								    Recti& operator=(const Recti& rect) = default;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /// Comparison operators
							 | 
						||
| 
								 | 
							
								    bool operator==(const Recti& rect) const;
							 | 
						||
| 
								 | 
							
								    bool operator!=(const Recti& rect) const;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /// Gets or sets the position of the rectangle's top-left corner
							 | 
						||
| 
								 | 
							
								    Pointi GetLocation() const;
							 | 
						||
| 
								 | 
							
								    void SetLocation(const Pointi& location);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /// Gets or sets the width and height of the rectangle
							 | 
						||
| 
								 | 
							
								    Sizei GetSize() const;
							 | 
						||
| 
								 | 
							
								    void SetSize(const Sizei& size);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /// Accessors to rectangle sides
							 | 
						||
| 
								 | 
							
								    int GetLeft() const;
							 | 
						||
| 
								 | 
							
								    int GetRight() const;
							 | 
						||
| 
								 | 
							
								    int GetTop() const;
							 | 
						||
| 
								 | 
							
								    int GetBottom() const;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /// Accessors to rectangle corners
							 | 
						||
| 
								 | 
							
								    Pointi GetTopLeft() const;
							 | 
						||
| 
								 | 
							
								    Pointi GetTopRight() const;
							 | 
						||
| 
								 | 
							
								    Pointi GetBottomLeft() const;
							 | 
						||
| 
								 | 
							
								    Pointi GetBottomRight() const;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /// Indicates whether this rectangle is empty (its size is 0)
							 | 
						||
| 
								 | 
							
								    bool IsEmpty() const;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /// Determines whether this rectangle contains the specified point or rectangle
							 | 
						||
| 
								 | 
							
								    bool Contains(int x, int y) const;
							 | 
						||
| 
								 | 
							
								    bool Contains(const Pointi& point) const;
							 | 
						||
| 
								 | 
							
								    bool Contains(const Recti& rect) const;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /// Expands or contracts the rectangle by the specified amount
							 | 
						||
| 
								 | 
							
								    /// The width of the resulting rectangle is increased or decreased by twice the specified width
							 | 
						||
| 
								 | 
							
								    /// offset, because it is applied to both the left and right sides of the rectangle. Likewise,
							 | 
						||
| 
								 | 
							
								    /// the height of the rectangle is increased or decreased by twice the specified height
							 | 
						||
| 
								 | 
							
								    /// If the specified width or height modifiers shrink the rectangle by more than its current
							 | 
						||
| 
								 | 
							
								    /// width or height (giving a negative area) this rectangle becomes the Empty rectangle
							 | 
						||
| 
								 | 
							
								    void Inflate(int width, int height);
							 | 
						||
| 
								 | 
							
								    void Inflate(const Sizei& size);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /// Finds the intersection of two rectangles and stores the result as a Recti structure
							 | 
						||
| 
								 | 
							
								    Recti Intersect(const Recti& rect) const;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /// Indicates whether the specified rectangle intersects with this rectangle
							 | 
						||
| 
								 | 
							
								    bool IntersectsWith(const Recti& rect) const;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /// Translates the rectangle by the specified amount
							 | 
						||
| 
								 | 
							
								    void Offset(const Pointi& offset);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /// Multiplies the size of the current rectangle by the specified x and y value
							 | 
						||
| 
								 | 
							
								    void Scale(int scaleX, int scaleY);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /// Expands a rectangle exactly enough to contain the specified rectangle or point
							 | 
						||
| 
								 | 
							
								    void Expand(const Pointi& point);
							 | 
						||
| 
								 | 
							
								    void Expand(const Recti& rect);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /// Creates a string representation of this rectangle
							 | 
						||
| 
								 | 
							
								    /// The string has the following form: "x,y,width,height"
							 | 
						||
| 
								 | 
							
								    NS_DRAWING_TYPES_API String ToString() const;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /// Tries to parse a Recti from a string
							 | 
						||
| 
								 | 
							
								    NS_DRAWING_TYPES_API static bool TryParse(const char* str, Recti& result);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /// Empty rect (with all members set to 0)
							 | 
						||
| 
								 | 
							
								    static Recti Empty();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    NS_IMPLEMENT_INLINE_REFLECTION(Recti, NoParent)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        NsProp("X", &Recti::x);
							 | 
						||
| 
								 | 
							
								        NsProp("Y", &Recti::y);
							 | 
						||
| 
								 | 
							
								        NsProp("Width", &Recti::width);
							 | 
						||
| 
								 | 
							
								        NsProp("Height", &Recti::height);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <NsDrawing/Rect.inl>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif
							 |