Files
Arquivotheca.SunOS-4.1.4/usr.lib/libsunwindow/include/sunwindow/pw_util.h
seta75D ff309bfe1c Init
2021-10-11 18:37:13 -03:00

115 lines
3.2 KiB
C

/* @(#)pw_util.h 1.1 94/10/31 SMI */
/*
* Copyright (c) 1983 by Sun Microsystems, Inc.
*/
/*
* Pw_util.h is a collection of utilities that implementors of
* pixwin.h specified routines should use.
*/
/*
* Loop on clipping and call rect clipping routines.
* Users of this macro operate upon rintersect.
*/
#define pw_begincliploop_internal(pw, rdest, rintersect, rn) \
{ for ((rn) = (pw)->pw_clipdata->pwcd_clipping.rl_head; \
(rn); (rn) = (rn)->rn_next) { \
/* \
* Not doing: \
* rl_rectoffset(&(pw)->pw_clipping, &(rn)->rn_rect, &rtemp); \
* cause assuming all clipping is normalized. \
*/ \
if (rect_intersectsrect((rdest), &(rn)->rn_rect)) { \
(void)rect_intersection((rdest), &(rn)->rn_rect,(rintersect));
#define pw_begincliploop(pw, rdest, rintersect) \
{ register struct rectnode *rn; \
pw_begincliploop_internal(pw, rdest, rintersect, rn);
#define pw_begincliploop2(pw, rdest, rintersect) \
{ register struct rectnode *rn2; \
pw_begincliploop_internal(pw, rdest, rintersect, rn2);
/*
* Terminates pw_begincliploop
*/
#define pw_endcliploop()\
}\
}\
}\
}
/*
* Check for batching and calls batch handler
* Setup rdest; left, top, width, height are in window coordinates.
* Lock rdest.
*/
#define PW_SETUP(pw, rdest, label, left, top, width, height) \
{ \
int left_eval = (left); \
int top_eval = (top); \
\
(rdest).r_width = (width); \
(rdest).r_height = (height); \
if ((pw)->pw_clipdata->pwcd_batch_type != PW_NONE) { \
(rdest).r_left = (left_eval); \
(rdest).r_top = (top_eval); \
(void)pw_update_batch((pw), &(rdest)); \
goto label; \
} \
(rdest).r_left = PW_X_FROM_WIN((pw), (left_eval)); \
(rdest).r_top = PW_Y_FROM_WIN((pw), (top_eval)); \
(void)pw_lock((pw), &(rdest)); \
(rdest).r_left = (left_eval); \
(rdest).r_top = (top_eval); \
}
/*
* Go from window coordinate space to pixwin coordinate space.
*/
#define PW_X_TO_WIN(pw, x) ((x) - (pw)->pw_clipdata->pwcd_x_offset)
#define PW_Y_TO_WIN(pw, y) ((y) - (pw)->pw_clipdata->pwcd_y_offset)
/*
* Go from pixwin coordinate space to window coordinate space.
*/
#define PW_X_FROM_WIN(pw, x) ((x) + (pw)->pw_clipdata->pwcd_x_offset)
#define PW_Y_FROM_WIN(pw, y) ((y) + (pw)->pw_clipdata->pwcd_y_offset)
/*
* Go from window coordinate space to pixwin coordinate space.
* Called when write to retained image that covers pixwin coordinate
* space. Called with pixwin destination offsets.
*/
#define PW_RETAIN_X_OFFSET(pw, x) PW_X_FROM_WIN((pw), (x))
#define PW_RETAIN_Y_OFFSET(pw, y) PW_Y_FROM_WIN((pw), (y))
/*
* Go from pixwin coordinate space to window coordinate space.
* Called with offsets when enter routines that don't go through
* ops-vector, and thus pw_ops* adjustment. Called with pixwin
* destination offsets.
*/
#define PW_X_OFFSET(pw, x) PW_X_TO_WIN((pw), (x))
#define PW_Y_OFFSET(pw, y) PW_Y_TO_WIN((pw), (y))
#define PW_FIXUP_TRANSLATE(pw) \
rl_passtoparent(PW_X_FROM_WIN((pw), 0), \
PW_Y_FROM_WIN((pw), 0), &(pw)->pw_fixup)
#ifdef cplus
/*
* C Library routine specifically relating to pixel device function
* implementation.
*/
/*
* Make rl_fixup set to the clipped part of the bounding box of pw->pw_clipping
*/
void pw_initfixup(struct pixwin *pw, struct rectlist *rl_fixup);
#endif