executor/src/windUpdate.c

113 lines
2.9 KiB
C

/* Copyright 1986, 1989, 1990, 1996 by Abacus Research and
* Development, Inc. All rights reserved.
*/
#if !defined (OMIT_RCSID_STRINGS)
char ROMlib_rcsid_windUpdate[] =
"$Id: windUpdate.c 63 2004-12-24 18:19:43Z ctm $";
#endif
/* Forward declarations in WindowMgr.h (DO NOT DELETE THIS LINE) */
#include "rsys/common.h"
#include "WindowMgr.h"
#include "rsys/cquick.h"
#include "rsys/wind.h"
P1(PUBLIC pascal trap, void, InvalRect, Rect *, r)
{
if (thePort)
{
RgnHandle rh;
Rect r_copy;
r_copy = *r; /* Just in case NewRgn moves memory */
rh = NewRgn();
RectRgn(rh, &r_copy);
OffsetRgn(rh, -CW (PORT_BOUNDS (thePort).left),
-CW (PORT_BOUNDS (thePort).top));
UnionRgn(rh, WINDOW_UPDATE_REGION (thePort),
WINDOW_UPDATE_REGION (thePort));
DisposeRgn(rh);
}
}
P1 (PUBLIC pascal trap, void, InvalRgn, RgnHandle, r)
{
GrafPtr current_port;
RgnHandle update_rgn;
int top, left;
current_port = thePort;
top = CW (PORT_BOUNDS (current_port).top);
left = CW (PORT_BOUNDS (current_port).left);
OffsetRgn (r, -left, -top);
update_rgn = WINDOW_UPDATE_REGION (current_port);
UnionRgn (r, update_rgn, update_rgn);
OffsetRgn (r, left, top);
}
P1(PUBLIC pascal trap, void, ValidRect, Rect *, r)
{
RgnHandle rh;
rh = NewRgn();
RectRgn(rh, r);
OffsetRgn(rh, -CW (PORT_BOUNDS (thePort).left),
-CW (PORT_BOUNDS (thePort).top));
DiffRgn (WINDOW_UPDATE_REGION (thePort), rh,
WINDOW_UPDATE_REGION (thePort));
DisposeRgn(rh);
}
P1(PUBLIC pascal trap, void, ValidRgn, RgnHandle, r)
{
OffsetRgn(r, -CW (PORT_BOUNDS (thePort).left),
-CW (PORT_BOUNDS (thePort).top));
DiffRgn (WINDOW_UPDATE_REGION (thePort), r,
WINDOW_UPDATE_REGION (thePort));
OffsetRgn (r, CW (PORT_BOUNDS (thePort).left),
CW (PORT_BOUNDS (thePort).top));
}
PUBLIC int ROMlib_emptyvis = 0;
P1(PUBLIC pascal trap, void, BeginUpdate, WindowPtr, w)
{
/* #warning Should SaveVisRgn ever become 0? */
if (!SaveVisRgn)
SaveVisRgn = (RgnHandle) RM(NewHandle(0));
CopyRgn(PORT_VIS_REGION (w), MR(SaveVisRgn));
if (EmptyRgn (WINDOW_UPDATE_REGION (w)))
ROMlib_emptyvis = 1;
#if 0
else /* our ROMlib_emptyvis hack below doesn't work if there are some
routines that write to the screen and ignore it */
#endif
{
CopyRgn (WINDOW_UPDATE_REGION (w), PORT_VIS_REGION (w));
OffsetRgn (PORT_VIS_REGION (w),
CW (PORT_BOUNDS (w).left),
CW (PORT_BOUNDS (w).top));
SectRgn (PORT_VIS_REGION (w), MR (SaveVisRgn), PORT_VIS_REGION (w));
SetEmptyRgn (WINDOW_UPDATE_REGION (w));
ROMlib_emptyvis = EmptyRgn (PORT_VIS_REGION (w));
}
}
P1(PUBLIC pascal trap, void, EndUpdate, WindowPtr, w)
{
CopyRgn(MR(SaveVisRgn), PORT_VIS_REGION (w));
CopyRgn (WINDOW_CONT_REGION (w), MR (SaveVisRgn));
OffsetRgn (MR (SaveVisRgn),
CW (PORT_BOUNDS (w).left),
CW (PORT_BOUNDS (w).top));
ROMlib_emptyvis = 0;
}