115 lines
3.2 KiB
C
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
|
|
|