mirror of
https://github.com/reactos/reactos.git
synced 2024-08-28 22:28:36 +00:00
107 lines
2.9 KiB
C
107 lines
2.9 KiB
C
/* ------------- rect.c --------------- */
|
|
|
|
#include "dflat.h"
|
|
|
|
/* --- Produce the vector end points produced by the overlap
|
|
of two other vectors --- */
|
|
static void subVector(int *v1, int *v2,
|
|
int t1, int t2, int o1, int o2)
|
|
{
|
|
*v1 = *v2 = -1;
|
|
if (DfWithin(o1, t1, t2)) {
|
|
*v1 = o1;
|
|
if (DfWithin(o2, t1, t2))
|
|
*v2 = o2;
|
|
else
|
|
*v2 = t2;
|
|
}
|
|
else if (DfWithin(o2, t1, t2)) {
|
|
*v2 = o2;
|
|
if (DfWithin(o1, t1, t2))
|
|
*v1 = o1;
|
|
else
|
|
*v1 = t1;
|
|
}
|
|
else if (DfWithin(t1, o1, o2)) {
|
|
*v1 = t1;
|
|
if (DfWithin(t2, o1, o2))
|
|
*v2 = t2;
|
|
else
|
|
*v2 = o2;
|
|
}
|
|
else if (DfWithin(t2, o1, o2)) {
|
|
*v2 = t2;
|
|
if (DfWithin(t1, o1, o2))
|
|
*v1 = t1;
|
|
else
|
|
*v1 = o1;
|
|
}
|
|
}
|
|
|
|
/* --- Return the rectangle produced by the overlap
|
|
of two other rectangles ---- */
|
|
DFRECT DfSubRectangle(DFRECT r1, DFRECT r2)
|
|
{
|
|
DFRECT r = {0,0,0,0};
|
|
subVector((int *) &DfRectLeft(r), (int *) &DfRectRight(r),
|
|
DfRectLeft(r1), DfRectRight(r1),
|
|
DfRectLeft(r2), DfRectRight(r2));
|
|
subVector((int *) &DfRectTop(r), (int *) &DfRectBottom(r),
|
|
DfRectTop(r1), DfRectBottom(r1),
|
|
DfRectTop(r2), DfRectBottom(r2));
|
|
if (DfRectRight(r) == -1 || DfRectTop(r) == -1)
|
|
DfRectRight(r) =
|
|
DfRectLeft(r) =
|
|
DfRectTop(r) =
|
|
DfRectBottom(r) = 0;
|
|
return r;
|
|
}
|
|
|
|
/* ------- return the client rectangle of a window ------ */
|
|
DFRECT DfClientRect(void *wnd)
|
|
{
|
|
DFRECT rc;
|
|
|
|
if (wnd == NULL)
|
|
{
|
|
DfRectLeft(rc) = 1; // DfGetClientLeft((DFWINDOW)wnd);
|
|
DfRectTop(rc) = 2; // DfGetClientTop((DFWINDOW)wnd);
|
|
DfRectRight(rc) = DfGetScreenWidth () - 2; // DfGetClientRight((DFWINDOW)wnd);
|
|
DfRectBottom(rc) = DfGetScreenHeight () - 2; // DfGetClientBottom((DFWINDOW)wnd);
|
|
return rc;
|
|
}
|
|
|
|
DfRectLeft(rc) = DfGetClientLeft((DFWINDOW)wnd);
|
|
DfRectTop(rc) = DfGetClientTop((DFWINDOW)wnd);
|
|
DfRectRight(rc) = DfGetClientRight((DFWINDOW)wnd);
|
|
DfRectBottom(rc) = DfGetClientBottom((DFWINDOW)wnd);
|
|
|
|
return rc;
|
|
}
|
|
|
|
/* ----- return the rectangle relative to
|
|
its window's screen position -------- */
|
|
DFRECT DfRelativeWindowRect(void *wnd, DFRECT rc)
|
|
{
|
|
DfRectLeft(rc) -= DfGetLeft((DFWINDOW)wnd);
|
|
DfRectRight(rc) -= DfGetLeft((DFWINDOW)wnd);
|
|
DfRectTop(rc) -= DfGetTop((DFWINDOW)wnd);
|
|
DfRectBottom(rc) -= DfGetTop((DFWINDOW)wnd);
|
|
return rc;
|
|
}
|
|
|
|
/* ----- clip a rectangle to the parents of the window ----- */
|
|
DFRECT DfClipRectangle(void *wnd, DFRECT rc)
|
|
{
|
|
DFRECT sr;
|
|
DfRectLeft(sr) = DfRectTop(sr) = 0;
|
|
DfRectRight(sr) = DfGetScreenWidth()-1;
|
|
DfRectBottom(sr) = DfGetScreenHeight()-1;
|
|
if (!DfTestAttribute((DFWINDOW)wnd, DF_NOCLIP))
|
|
while ((wnd = DfGetParent((DFWINDOW)wnd)) != NULL)
|
|
rc = DfSubRectangle(rc, DfClientRect(wnd));
|
|
return DfSubRectangle(rc, sr);
|
|
}
|
|
|
|
/* EOF */
|