85 lines
2.3 KiB
C
85 lines
2.3 KiB
C
|
/******************************Module*Header*******************************\
|
||
|
* Module Name: misc.c
|
||
|
*
|
||
|
* Miscellaneous common routines.
|
||
|
*
|
||
|
* Copyright (c) 1992-1995 Microsoft Corporation
|
||
|
*
|
||
|
\**************************************************************************/
|
||
|
|
||
|
#include "precomp.h"
|
||
|
|
||
|
/******************************Public*Routine******************************\
|
||
|
* BOOL bIntersect
|
||
|
*
|
||
|
* If 'prcl1' and 'prcl2' intersect, has a return value of TRUE and returns
|
||
|
* the intersection in 'prclResult'. If they don't intersect, has a return
|
||
|
* value of FALSE, and 'prclResult' is undefined.
|
||
|
*
|
||
|
\**************************************************************************/
|
||
|
|
||
|
BOOL bIntersect(
|
||
|
RECTL* prcl1,
|
||
|
RECTL* prcl2,
|
||
|
RECTL* prclResult)
|
||
|
{
|
||
|
prclResult->left = max(prcl1->left, prcl2->left);
|
||
|
prclResult->right = min(prcl1->right, prcl2->right);
|
||
|
|
||
|
if (prclResult->left < prclResult->right)
|
||
|
{
|
||
|
prclResult->top = max(prcl1->top, prcl2->top);
|
||
|
prclResult->bottom = min(prcl1->bottom, prcl2->bottom);
|
||
|
|
||
|
if (prclResult->top < prclResult->bottom)
|
||
|
{
|
||
|
return(TRUE);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return(FALSE);
|
||
|
}
|
||
|
|
||
|
/******************************Public*Routine******************************\
|
||
|
* LONG cIntersect
|
||
|
*
|
||
|
* This routine takes a list of rectangles from 'prclIn' and clips them
|
||
|
* in-place to the rectangle 'prclClip'. The input rectangles don't
|
||
|
* have to intersect 'prclClip'; the return value will reflect the
|
||
|
* number of input rectangles that did intersect, and the intersecting
|
||
|
* rectangles will be densely packed.
|
||
|
*
|
||
|
\**************************************************************************/
|
||
|
|
||
|
LONG cIntersect(
|
||
|
RECTL* prclClip,
|
||
|
RECTL* prclIn, // List of rectangles
|
||
|
LONG c) // Can be zero
|
||
|
{
|
||
|
LONG cIntersections;
|
||
|
RECTL* prclOut;
|
||
|
|
||
|
cIntersections = 0;
|
||
|
prclOut = prclIn;
|
||
|
|
||
|
for (; c != 0; prclIn++, c--)
|
||
|
{
|
||
|
prclOut->left = max(prclIn->left, prclClip->left);
|
||
|
prclOut->right = min(prclIn->right, prclClip->right);
|
||
|
|
||
|
if (prclOut->left < prclOut->right)
|
||
|
{
|
||
|
prclOut->top = max(prclIn->top, prclClip->top);
|
||
|
prclOut->bottom = min(prclIn->bottom, prclClip->bottom);
|
||
|
|
||
|
if (prclOut->top < prclOut->bottom)
|
||
|
{
|
||
|
prclOut++;
|
||
|
cIntersections++;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return(cIntersections);
|
||
|
}
|