You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
309 lines
6.6 KiB
309 lines
6.6 KiB
/******************************Module*Header*******************************\
|
|
* Module Name: rectl.hxx *
|
|
* *
|
|
* Contains common functions on RECTL and POINTL structures. *
|
|
* *
|
|
* Created: 13-Sep-1990 15:11:03 *
|
|
* Author: Charles Whitmer [chuckwh] *
|
|
* *
|
|
* Copyright (c) 1990-1999 Microsoft Corporation *
|
|
\**************************************************************************/
|
|
|
|
// Convert array of POINTLs to POINTSs.
|
|
|
|
#define POINTL_TO_POINTS(ppts, pptl, cpt) \
|
|
{ \
|
|
for (DWORD i = 0; i < (cpt); i++) \
|
|
((PEPOINTS) (ppts))[i] = (pptl)[i]; \
|
|
}
|
|
|
|
// Convert array of POINTSs to POINTLs.
|
|
|
|
#define POINTS_TO_POINTL(pptl, ppts, cpt) \
|
|
{ \
|
|
for (DWORD i = 0; i < (cpt); i++) \
|
|
((PEPOINTL) (pptl))[i] = (ppts)[i]; \
|
|
}
|
|
|
|
/******************************Class***************************************\
|
|
* EPOINTL. *
|
|
* *
|
|
* This is an "energized" version of the common POINTL. *
|
|
* *
|
|
* History: *
|
|
* Thu 13-Sep-1990 15:11:42 -by- Charles Whitmer [chuckwh] *
|
|
* Wrote it. *
|
|
\**************************************************************************/
|
|
|
|
class EPOINTL : public _POINTL /* eptl */
|
|
{
|
|
public:
|
|
// Constructor -- This one is to allow EPOINTLs inside other classes.
|
|
|
|
EPOINTL() {}
|
|
|
|
// Constructor -- Fills the EPOINTL.
|
|
|
|
EPOINTL(LONG x1,LONG y1)
|
|
{
|
|
x = x1;
|
|
y = y1;
|
|
}
|
|
|
|
// Destructor -- Does nothing.
|
|
|
|
~EPOINTL() {}
|
|
|
|
// Initializer -- Initialize the point.
|
|
|
|
VOID vInit(LONG x1,LONG y1)
|
|
{
|
|
x = x1;
|
|
y = y1;
|
|
}
|
|
|
|
// Operator= -- initialize POINTL given POINTS
|
|
|
|
VOID operator=(CONST POINTS& pts)
|
|
{
|
|
x = (LONG) pts.x;
|
|
y = (LONG) pts.y;
|
|
}
|
|
|
|
// Operator+= -- Add to another POINTL.
|
|
|
|
VOID operator+=(POINTL& ptl)
|
|
{
|
|
x += ptl.x;
|
|
y += ptl.y;
|
|
}
|
|
};
|
|
|
|
typedef EPOINTL *PEPOINTL;
|
|
|
|
/******************************Class***************************************\
|
|
* EPOINTS. *
|
|
* *
|
|
* This is an "energized" version of the common POINTS. *
|
|
* *
|
|
* History: *
|
|
* Sat Mar 07 17:07:33 1992 -by- Hock San Lee [hockl]
|
|
* Wrote it. *
|
|
\**************************************************************************/
|
|
|
|
class EPOINTS : public tagPOINTS /* epts */
|
|
{
|
|
public:
|
|
// Constructor -- This one is to allow EPOINTSs inside other classes.
|
|
|
|
EPOINTS() {}
|
|
|
|
// Constructor -- Fills the EPOINTS.
|
|
|
|
EPOINTS(SHORT x1,SHORT y1)
|
|
{
|
|
x = x1;
|
|
y = y1;
|
|
}
|
|
|
|
// Destructor -- Does nothing.
|
|
|
|
~EPOINTS() {}
|
|
|
|
// Initializer -- Initialize the point.
|
|
|
|
VOID vInit(SHORT x1,SHORT y1)
|
|
{
|
|
x = x1;
|
|
y = y1;
|
|
}
|
|
|
|
// Operator= -- initialize POINTS given POINTL
|
|
|
|
VOID operator=(CONST POINTL& ptl)
|
|
{
|
|
x = (SHORT) ptl.x;
|
|
y = (SHORT) ptl.y;
|
|
}
|
|
};
|
|
|
|
typedef EPOINTS *PEPOINTS;
|
|
|
|
/******************************Class***************************************\
|
|
* ERECTL *
|
|
* *
|
|
* This is an "energized" version of the common RECTL. *
|
|
* *
|
|
* History: *
|
|
* Thu 13-Sep-1990 15:11:42 -by- Charles Whitmer [chuckwh] *
|
|
* Wrote it. *
|
|
\**************************************************************************/
|
|
|
|
class ERECTL : public _RECTL
|
|
{
|
|
public:
|
|
// Constructor -- Allows ERECTLs inside other classes.
|
|
|
|
ERECTL() {}
|
|
|
|
// Destructor -- Does nothing.
|
|
|
|
~ERECTL() {}
|
|
|
|
// Initializer -- Initialize the rectangle.
|
|
|
|
VOID vInit(LONG x1,LONG y1,LONG x2,LONG y2)
|
|
{
|
|
left = x1;
|
|
top = y1;
|
|
right = x2;
|
|
bottom = y2;
|
|
}
|
|
|
|
// Initializer -- energize given rectangle so that it can be manipulated
|
|
|
|
VOID vInit(RECTL& rcl)
|
|
{
|
|
left = rcl.left ;
|
|
top = rcl.top ;
|
|
right = rcl.right ;
|
|
bottom = rcl.bottom ;
|
|
}
|
|
|
|
// Initializer -- Initialize the rectangle to a point.
|
|
|
|
VOID vInit(POINTL& ptl)
|
|
{
|
|
left = right = ptl.x;
|
|
top = bottom = ptl.y;
|
|
}
|
|
|
|
// bEmpty -- Check if the RECTL is empty.
|
|
|
|
BOOL bEmpty()
|
|
{
|
|
return((left > right) || (top > bottom));
|
|
}
|
|
|
|
// Operator= -- Initialize the bound to the rectangle.
|
|
|
|
VOID operator=(RECTL& rcl)
|
|
{
|
|
left = rcl.left ;
|
|
top = rcl.top ;
|
|
right = rcl.right ;
|
|
bottom = rcl.bottom ;
|
|
}
|
|
|
|
// Operator= -- Initialize the bound to the point.
|
|
|
|
VOID operator=(POINTL& ptl)
|
|
{
|
|
left = right = ptl.x;
|
|
top = bottom = ptl.y;
|
|
}
|
|
|
|
// Operator+= -- Include a rectangle in the bounds. Only the destination
|
|
// may be empty.
|
|
|
|
VOID operator+=(RECTL& rcl)
|
|
{
|
|
ASSERTGDI(rcl.left <= rcl.right && rcl.top <= rcl.bottom,
|
|
"ERECTL::operator+=: Source rectangle is empty");
|
|
|
|
if (left > right || top > bottom)
|
|
*this = rcl;
|
|
else
|
|
{
|
|
if (rcl.left < left)
|
|
left = rcl.left;
|
|
if (rcl.top < top)
|
|
top = rcl.top;
|
|
if (rcl.right > right)
|
|
right = rcl.right;
|
|
if (rcl.bottom > bottom)
|
|
bottom = rcl.bottom;
|
|
}
|
|
}
|
|
|
|
// Operator+= -- Include a point in the bounds. The destination may be empty.
|
|
|
|
VOID operator+=(POINTL& ptl)
|
|
{
|
|
if (left > right || top > bottom)
|
|
{
|
|
left = right = ptl.x;
|
|
top = bottom = ptl.y;
|
|
}
|
|
else
|
|
{
|
|
if (ptl.x < left)
|
|
left = ptl.x;
|
|
if (ptl.x > right)
|
|
right = ptl.x;
|
|
if (ptl.y < top)
|
|
top = ptl.y;
|
|
if (ptl.y > bottom)
|
|
bottom = ptl.y;
|
|
}
|
|
}
|
|
|
|
// Operator*= -- Intersect two rectangles.
|
|
|
|
VOID operator*=(RECTL& rcl)
|
|
{
|
|
left = max(left, rcl.left);
|
|
right = min(right, rcl.right);
|
|
top = max(top, rcl.top);
|
|
bottom = min(bottom,rcl.bottom);
|
|
}
|
|
|
|
// vOrder -- Make the rectangle well ordered.
|
|
|
|
VOID vOrder()
|
|
{
|
|
LONG l;
|
|
if (left > right)
|
|
{
|
|
l = left;
|
|
left = right;
|
|
right = l;
|
|
}
|
|
if (top > bottom)
|
|
{
|
|
l = top;
|
|
top = bottom;
|
|
bottom = l;
|
|
}
|
|
}
|
|
|
|
// bContain -- Test if it contains another rectangle
|
|
|
|
BOOL bContain(RECTL& rcl)
|
|
{
|
|
return (( left <= rcl.left ) &&
|
|
( right >= rcl.right ) &&
|
|
( top <= rcl.top ) &&
|
|
( bottom >= rcl.bottom));
|
|
|
|
}
|
|
|
|
// bNoIntersect -- Return TRUE if the rectangles have no intersection.
|
|
// Both rectangles must not be empty.
|
|
|
|
BOOL bNoIntersect(ERECTL& ercl)
|
|
{
|
|
#if DBG
|
|
if (bEmpty() || ercl.bEmpty())
|
|
WARNING("ERECTL::bNoIntersect: rectangle is empty");
|
|
#endif
|
|
|
|
return (( left > ercl.right ) ||
|
|
( right < ercl.left ) ||
|
|
( top > ercl.bottom ) ||
|
|
( bottom < ercl.top ));
|
|
|
|
}
|
|
};
|
|
|
|
typedef ERECTL *PERECTL;
|