#ifndef lint static char sccsid[] = "@(#)mem_getput.c 9.2 88/01/19 SMI"; #endif /* * Copyright 1986 by Sun Microsystems, Inc. */ /* * Memory pixrect pixel get/put */ #include #ifdef REF #include #endif #include #include #include /* pointer casting macros */ #define P8(p) ((u_char *)(p)) #define P16(p) ((u_short *)(p)) #define P32(p) ((u_long *)(p)) /* leftmost bit in a byte */ #define LEFT_BIT (128) mem_get(pr, x, y) register Pixrect *pr; register int x, y; { register struct mpr_data *mprd; register caddr_t addr; register short depth; if (x < 0 || x >= pr->pr_size.x || y < 0 || y >= pr->pr_size.y) return PIX_ERR; mprd = (struct mpr_data *) pr->pr_data; x += mprd->md_offset.x; y += mprd->md_offset.y; addr = (caddr_t) mprd->md_image + pr_product(mprd->md_linebytes, y); depth = pr->pr_depth; if (depth == 1) { if (mprd->md_flags & MP_REVERSEVIDEO) return P8(addr)[x >> 3] >> (7 - (x & 7)) & 1 ^ 1; else return P8(addr)[x >> 3] >> (7 - (x & 7)) & 1; } else if (depth == 8) { return P8(addr)[x]; } else if (depth == 16) { return P16(addr)[x]; } else if (depth == 32) { return P32(addr)[x]; } else return PIX_ERR; } mem_put(pr, x, y, value) register Pixrect *pr; register int x, y; int value; { register struct mprp_data *mprpd; register caddr_t addr; register short depth; if (x < 0 || x >= pr->pr_size.x || y < 0 || y >= pr->pr_size.y) return PIX_ERR; mprpd = (struct mprp_data *) pr->pr_data; x += mprpd->mpr.md_offset.x; y += mprpd->mpr.md_offset.y; addr = (caddr_t) mprpd->mpr.md_image + pr_product(mprpd->mpr.md_linebytes, y); depth = pr->pr_depth; if (depth == 1) { if (mprpd->mpr.md_flags & MP_REVERSEVIDEO && value & 1 || !(value & 1)) P8(addr)[x >> 3] &= (u_char) (~LEFT_BIT >> (x & 7)); else P8(addr)[x >> 3] |= (u_char) ( LEFT_BIT >> (x & 7)); } else if (!(mprpd->mpr.md_flags & MP_PLANEMASK)) { if (depth == 8) { P8(addr)[x] = value; } else if (depth == 16) { P16(addr)[x] = value; } else if (depth == 32) { P32(addr)[x] = value; } else return PIX_ERR; } else { if (depth == 8) { addr = (caddr_t) (P8(addr) + x); *P8(addr) ^= (*P8(addr) ^ value) & mprpd->planes; } else if (depth == 16) { addr = (caddr_t) (P16(addr) + x); *P16(addr) ^= (*P16(addr) ^ value) & mprpd->planes; } else if (depth == 32) { addr = (caddr_t) (P32(addr) + x); *P32(addr) ^= (*P32(addr) ^ value) & mprpd->planes; } else return PIX_ERR; } return 0; }