|
|
/***************************************************************************\
* * File: Geom2D.h * * Description: * Geom2D defines a standard lightweight objects for 2D space, including * size, point, and rect. * * * History: * 2/10/2001: JStall: Copied from \windows\AdvCore\Gdiplus\sdkinc\GdiplusTypes.h * * Copyright (C) 2001 by Microsoft Corporation. All rights reserved. * \***************************************************************************/
#if !defined(DUSERX___Types_h__INCLUDED)
#define DUSERX___Types_h__INCLUDED
#pragma once
namespace DirectUser { namespace Geometry { typedef float REAL;
//--------------------------------------------------------------------------
// Primitive data types
//
// NOTE:
// Types already defined in standard header files:
// INT8
// UINT8
// INT16
// UINT16
// INT32
// UINT32
// INT64
// UINT64
//
// Avoid using the following types:
// LONG - use INT
// ULONG - use UINT
// DWORD - use UINT32
//--------------------------------------------------------------------------
// Forward declarations
class Size; class SizeF; class Point; class PointF; class Rect; class RectF;
//--------------------------------------------------------------------------
// Represents a dimension in a 2D coordinate system
// (floating-point coordinates)
//--------------------------------------------------------------------------
class SizeF { public:
// Default constructor
SizeF() { } SizeF(bool fInit) { if (fInit) { Width = Height = 0.0f; } }
SizeF(IN const SizeF& size) { Width = size.Width; Height = size.Height; }
SizeF(IN REAL width, IN REAL height) { Width = width; Height = height; }
SizeF operator+(IN const SizeF& sz) const { return SizeF(Width + sz.Width, Height + sz.Height); }
SizeF operator-(IN const SizeF& sz) const { return SizeF(Width - sz.Width, Height - sz.Height); }
BOOL Equals(IN const SizeF& sz) const { return (Width == sz.Width) && (Height == sz.Height); }
BOOL Empty() const { return (Width == 0.0f && Height == 0.0f); }
public:
REAL Width; REAL Height; };
//--------------------------------------------------------------------------
// Represents a dimension in a 2D coordinate system
// (integer coordinates)
//--------------------------------------------------------------------------
class Size { public:
// Default constructor
Size() { } Size(bool fInit) { if (fInit) { Width = Height = 0; } }
Size(IN const Size& size) { Width = size.Width; Height = size.Height; }
Size(IN INT width, IN INT height) { Width = width; Height = height; }
Size operator+(IN const Size& sz) const { return Size(Width + sz.Width, Height + sz.Height); }
Size operator-(IN const Size& sz) const { return Size(Width - sz.Width, Height - sz.Height); }
BOOL Equals(IN const Size& sz) const { return (Width == sz.Width) && (Height == sz.Height); }
BOOL Empty() const { return (Width == 0 && Height == 0); }
public:
INT Width; INT Height; };
//--------------------------------------------------------------------------
// Represents a location in a 2D coordinate system
// (floating-point coordinates)
//--------------------------------------------------------------------------
class PointF { public: PointF() { } PointF(bool fInit) { if (fInit) { X = Y = 0.0f; } }
PointF(IN const PointF &point) { X = point.X; Y = point.Y; }
PointF(IN const SizeF &size) { X = size.Width; Y = size.Height; }
PointF(IN REAL x, IN REAL y) { X = x; Y = y; }
PointF operator+(IN const PointF& point) const { return PointF(X + point.X, Y + point.Y); }
PointF operator-(IN const PointF& point) const { return PointF(X - point.X, Y - point.Y); }
BOOL Equals(IN const PointF& point) { return (X == point.X) && (Y == point.Y); }
public:
REAL X; REAL Y; };
//--------------------------------------------------------------------------
// Represents a location in a 2D coordinate system
// (integer coordinates)
//--------------------------------------------------------------------------
class Point { public: Point() { } Point(bool fInit) { if (fInit) { X = Y = 0; } }
Point(IN const Point &point) { X = point.X; Y = point.Y; }
Point(IN const Size &size) { X = size.Width; Y = size.Height; }
Point(IN INT x, IN INT y) { X = x; Y = y; }
Point operator+(IN const Point& point) const { return Point(X + point.X, Y + point.Y); }
Point operator-(IN const Point& point) const { return Point(X - point.X, Y - point.Y); }
BOOL Equals(IN const Point& point) { return (X == point.X) && (Y == point.Y); }
public:
INT X; INT Y; };
//--------------------------------------------------------------------------
// Represents a rectangle in a 2D coordinate system
// (floating-point coordinates)
//--------------------------------------------------------------------------
class RectF { public:
// Default constructor
RectF() { } RectF(bool fInit) { if (fInit) { X = Y = Width = Height = 0.0f; } }
RectF(IN REAL x, IN REAL y, IN REAL width, IN REAL height) { X = x; Y = y; Width = width; Height = height; }
RectF(IN const PointF& location, IN const SizeF& size) { X = location.X; Y = location.Y; Width = size.Width; Height = size.Height; }
RectF* Clone() const { return new RectF(X, Y, Width, Height); }
VOID GetLocation(OUT PointF* point) const { point->X = X; point->Y = Y; }
VOID GetSize(OUT SizeF* size) const { size->Width = Width; size->Height = Height; }
VOID GetBounds(OUT RectF* rect) const { rect->X = X; rect->Y = Y; rect->Width = Width; rect->Height = Height; }
// Return the left, top, right, and bottom
// coordinates of the rectangle
REAL GetLeft() const { return X; }
void SetLeft(REAL x) { X = x; }
REAL GetTop() const { return Y; }
void SetTop(REAL y) { Y = y; }
REAL GetRight() const { return X+Width; }
REAL GetBottom() const { return Y+Height; }
// Determine if the rectangle is empty
BOOL IsEmptyArea() const { REAL epsilon = 1.192092896e-07F; /* FLT_EPSILON */
return (Width <= epsilon) || (Height <= epsilon); }
BOOL Equals(IN const RectF & rect) const { return X == rect.X && Y == rect.Y && Width == rect.Width && Height == rect.Height; }
BOOL Contains(IN REAL x, IN REAL y) const { return x >= X && x < X+Width && y >= Y && y < Y+Height; }
BOOL Contains(IN const PointF& pt) const { return Contains(pt.X, pt.Y); }
BOOL Contains(IN const RectF& rect) const { return (X <= rect.X) && (rect.GetRight() <= GetRight()) && (Y <= rect.Y) && (rect.GetBottom() <= GetBottom()); }
VOID Inflate(IN REAL dx, IN REAL dy) { X -= dx; Y -= dy; Width += 2*dx; Height += 2*dy; }
VOID Inflate(IN const PointF& point) { Inflate(point.X, point.Y); }
// Intersect the current rect with the specified object
BOOL Intersect(IN const RectF& rect) { return Intersect(*this, *this, rect); }
// Intersect rect a and b and save the result into c
// Notice that c may be the same object as a or b.
static BOOL Intersect(OUT RectF& c, IN const RectF& a, IN const RectF& b) { REAL right = min(a.GetRight(), b.GetRight()); REAL bottom = min(a.GetBottom(), b.GetBottom()); REAL left = max(a.GetLeft(), b.GetLeft()); REAL top = max(a.GetTop(), b.GetTop());
c.X = left; c.Y = top; c.Width = right - left; c.Height = bottom - top; return !c.IsEmptyArea(); }
// Determine if the specified rect intersects with the
// current rect object.
BOOL IntersectsWith(IN const RectF& rect) const { return (GetLeft() < rect.GetRight() && GetTop() < rect.GetBottom() && GetRight() > rect.GetLeft() && GetBottom() > rect.GetTop()); }
static BOOL Union(OUT RectF& c, IN const RectF& a, IN const RectF& b) { REAL right = max(a.GetRight(), b.GetRight()); REAL bottom = max(a.GetBottom(), b.GetBottom()); REAL left = min(a.GetLeft(), b.GetLeft()); REAL top = min(a.GetTop(), b.GetTop());
c.X = left; c.Y = top; c.Width = right - left; c.Height = bottom - top; return !c.IsEmptyArea(); }
VOID Offset(IN const PointF& point) { Offset(point.X, point.Y); }
VOID Offset(IN REAL dx, IN REAL dy) { X += dx; Y += dy; }
public:
REAL X; REAL Y; REAL Width; REAL Height; };
//--------------------------------------------------------------------------
// Represents a rectangle in a 2D coordinate system
// (integer coordinates)
//--------------------------------------------------------------------------
class Rect { public:
// Default constructor
Rect() { } Rect(bool fInit) { if (fInit) { X = Y = Width = Height = 0; } }
Rect(IN INT x, IN INT y, IN INT width, IN INT height) { X = x; Y = y; Width = width; Height = height; }
Rect(IN const Point& location, IN const Size& size) { X = location.X; Y = location.Y; Width = size.Width; Height = size.Height; }
Rect* Clone() const { return new Rect(X, Y, Width, Height); }
VOID GetLocation(OUT Point* point) const { point->X = X; point->Y = Y; }
VOID GetSize(OUT Size* size) const { size->Width = Width; size->Height = Height; }
VOID GetBounds(OUT Rect* rect) const { rect->X = X; rect->Y = Y; rect->Width = Width; rect->Height = Height; }
// Return the left, top, right, and bottom
// coordinates of the rectangle
INT GetLeft() const { return X; }
INT GetTop() const { return Y; }
INT GetRight() const { return X+Width; }
INT GetBottom() const { return Y+Height; }
// Determine if the rectangle is empty
BOOL IsEmptyArea() const { return (Width <= 0) || (Height <= 0); }
BOOL Equals(IN const Rect & rect) const { return X == rect.X && Y == rect.Y && Width == rect.Width && Height == rect.Height; }
BOOL Contains(IN INT x, IN INT y) const { return x >= X && x < X+Width && y >= Y && y < Y+Height; }
BOOL Contains(IN const Point& pt) const { return Contains(pt.X, pt.Y); }
BOOL Contains(IN Rect& rect) const { return (X <= rect.X) && (rect.GetRight() <= GetRight()) && (Y <= rect.Y) && (rect.GetBottom() <= GetBottom()); }
VOID Inflate(IN INT dx, IN INT dy) { X -= dx; Y -= dy; Width += 2*dx; Height += 2*dy; }
VOID Inflate(IN const Point& point) { Inflate(point.X, point.Y); }
// Intersect the current rect with the specified object
BOOL Intersect(IN const Rect& rect) { return Intersect(*this, *this, rect); }
// Intersect rect a and b and save the result into c
// Notice that c may be the same object as a or b.
static BOOL Intersect(OUT Rect& c, IN const Rect& a, IN const Rect& b) { INT right = min(a.GetRight(), b.GetRight()); INT bottom = min(a.GetBottom(), b.GetBottom()); INT left = max(a.GetLeft(), b.GetLeft()); INT top = max(a.GetTop(), b.GetTop());
c.X = left; c.Y = top; c.Width = right - left; c.Height = bottom - top; return !c.IsEmptyArea(); }
// Determine if the specified rect intersects with the
// current rect object.
BOOL IntersectsWith(IN const Rect& rect) const { return (GetLeft() < rect.GetRight() && GetTop() < rect.GetBottom() && GetRight() > rect.GetLeft() && GetBottom() > rect.GetTop()); }
static BOOL Union(OUT Rect& c, IN const Rect& a, IN const Rect& b) { INT right = max(a.GetRight(), b.GetRight()); INT bottom = max(a.GetBottom(), b.GetBottom()); INT left = min(a.GetLeft(), b.GetLeft()); INT top = min(a.GetTop(), b.GetTop());
c.X = left; c.Y = top; c.Width = right - left; c.Height = bottom - top; return !c.IsEmptyArea(); }
VOID Offset(IN const Point& point) { Offset(point.X, point.Y); }
VOID Offset(IN INT dx, IN INT dy) { X += dx; Y += dy; }
public:
INT X; INT Y; INT Width; INT Height; };
} // namespace Geometry
} // namespace DirectUser
#endif // DUSERX___Types_h__INCLUDED
|