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.
220 lines
5.8 KiB
220 lines
5.8 KiB
#if !defined(BASE__Rect_inl_INCLUDED)
|
|
#define BASE__Rect_inl_INCLUDED
|
|
#pragma once
|
|
|
|
|
|
/***************************************************************************\
|
|
*
|
|
* InlinePtInRect
|
|
*
|
|
* InlinePtInRect() provides a inline version of PtInRect(). This uses the
|
|
* exact same comparisons as PtInRect (>= and <), so don't change this unless
|
|
* PtInRect() changes.
|
|
*
|
|
\***************************************************************************/
|
|
|
|
__forceinline bool
|
|
InlinePtInRect(const RECT * prcCheck, POINT pt)
|
|
{
|
|
return (pt.x >= prcCheck->left) && (pt.x < prcCheck->right) &&
|
|
(pt.y >= prcCheck->top) && (pt.y < prcCheck->bottom);
|
|
}
|
|
|
|
|
|
/***************************************************************************\
|
|
*
|
|
* InlineIsRectEmpty
|
|
*
|
|
* InlineIsRectEmpty() returns if a rect has a non-negative height and/or
|
|
* width. This is different than InlineIsRectNull() which checks if the rect
|
|
* is all 0's.
|
|
*
|
|
\***************************************************************************/
|
|
|
|
__forceinline bool
|
|
InlineIsRectEmpty(const RECT * prcCheck)
|
|
{
|
|
return ((prcCheck->left >= prcCheck->right) || (prcCheck->top >= prcCheck->bottom));
|
|
}
|
|
|
|
|
|
/***************************************************************************\
|
|
*
|
|
* InlineIsRectNull
|
|
*
|
|
* InlineIsRectNull() returns if a rect is all 0's.
|
|
*
|
|
\***************************************************************************/
|
|
|
|
__forceinline bool
|
|
InlineIsRectNull(const RECT * prcCheck)
|
|
{
|
|
return (prcCheck->left == 0) && (prcCheck->top == 0) &&
|
|
(prcCheck->right == 0) && (prcCheck->bottom == 0);
|
|
}
|
|
|
|
|
|
/***************************************************************************\
|
|
*
|
|
* InlineIsRectNormalized
|
|
*
|
|
* InlineIsRectNormalized() returns if a rect is properly normalized so that
|
|
* the upper-left corner is able the lower-right corner. This is different
|
|
* than !IsRectEmpty() because the rectangle may still be empty.
|
|
*
|
|
\***************************************************************************/
|
|
|
|
__forceinline bool
|
|
InlineIsRectNormalized(const RECT * prcCheck)
|
|
{
|
|
return (prcCheck->left <= prcCheck->right) && (prcCheck->top <= prcCheck->bottom);
|
|
}
|
|
|
|
|
|
/***************************************************************************\
|
|
*
|
|
* InlineZeroRect
|
|
*
|
|
* InlineZeroRect() moves a rect to (0, 0)
|
|
*
|
|
\***************************************************************************/
|
|
|
|
__forceinline void
|
|
InlineZeroRect(RECT * prc)
|
|
{
|
|
prc->right -= prc->left;
|
|
prc->bottom -= prc->top;
|
|
prc->left = 0;
|
|
prc->top = 0;
|
|
}
|
|
|
|
|
|
/***************************************************************************\
|
|
*
|
|
* InlineOffsetRect
|
|
*
|
|
* InlineOffsetRect() offsets a rect by a given amount.
|
|
*
|
|
\***************************************************************************/
|
|
|
|
__forceinline void
|
|
InlineOffsetRect(RECT * prc, int xOffset, int yOffset)
|
|
{
|
|
prc->left += xOffset;
|
|
prc->top += yOffset;
|
|
prc->right += xOffset;
|
|
prc->bottom += yOffset;
|
|
}
|
|
|
|
|
|
/***************************************************************************\
|
|
*
|
|
* InlineInflateRect
|
|
*
|
|
* InlineInflateRect() moves the corners of the rectangle out from the center
|
|
* by a given amount.
|
|
*
|
|
\***************************************************************************/
|
|
|
|
__forceinline void
|
|
InlineInflateRect(RECT * prc, int xIncrease, int yIncrease)
|
|
{
|
|
prc->left -= xIncrease;
|
|
prc->top -= yIncrease;
|
|
prc->right += xIncrease;
|
|
prc->bottom += yIncrease;
|
|
}
|
|
|
|
|
|
/***************************************************************************\
|
|
*
|
|
* InlineCopyRect
|
|
*
|
|
* InlineCopyRect() copies a rectangle.
|
|
*
|
|
\***************************************************************************/
|
|
|
|
__forceinline void
|
|
InlineCopyRect(RECT * prcDest, const RECT * prcSrc)
|
|
{
|
|
prcDest->left = prcSrc->left;
|
|
prcDest->top = prcSrc->top;
|
|
prcDest->right = prcSrc->right;
|
|
prcDest->bottom = prcSrc->bottom;
|
|
}
|
|
|
|
|
|
/***************************************************************************\
|
|
*
|
|
* InlineCopyZeroRect
|
|
*
|
|
* InlineCopyZeroRect() copies a rectangle and moves it to (0, 0)
|
|
*
|
|
\***************************************************************************/
|
|
|
|
__forceinline void
|
|
InlineCopyZeroRect(RECT * prcDest, const RECT * prcSrc)
|
|
{
|
|
prcDest->left = 0;
|
|
prcDest->top = 0;
|
|
prcDest->right = prcSrc->right - prcSrc->left;
|
|
prcDest->bottom = prcSrc->bottom - prcSrc->top;
|
|
}
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
__forceinline void
|
|
InlineSetRectEmpty(
|
|
OUT RECT * prcDest)
|
|
{
|
|
prcDest->left = prcDest->top = prcDest->right = prcDest->bottom = 0;
|
|
}
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
__forceinline bool
|
|
InlineIntersectRect(
|
|
OUT RECT * prcDst,
|
|
IN const RECT * prcSrc1,
|
|
IN const RECT * prcSrc2)
|
|
{
|
|
prcDst->left = max(prcSrc1->left, prcSrc2->left);
|
|
prcDst->right = min(prcSrc1->right, prcSrc2->right);
|
|
|
|
/*
|
|
* check for empty rect
|
|
*/
|
|
if (prcDst->left < prcDst->right) {
|
|
|
|
prcDst->top = max(prcSrc1->top, prcSrc2->top);
|
|
prcDst->bottom = min(prcSrc1->bottom, prcSrc2->bottom);
|
|
|
|
/*
|
|
* check for empty rect
|
|
*/
|
|
if (prcDst->top < prcDst->bottom) {
|
|
return true; // not empty
|
|
}
|
|
}
|
|
|
|
/*
|
|
* empty rect
|
|
*/
|
|
InlineSetRectEmpty(prcDst);
|
|
|
|
return false;
|
|
}
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
__forceinline bool
|
|
InlineEqualRect(
|
|
IN const RECT * prc1,
|
|
IN const RECT * prc2)
|
|
{
|
|
return (prc1->left == prc2->left) && (prc1->top == prc2->top) &&
|
|
(prc1->right == prc2->right) && (prc1->bottom == prc2->bottom);
|
|
}
|
|
|
|
|
|
#endif // BASE__Rect_inl_INCLUDED
|