/* Copyright (c) 1989 Bellcore * All Rights Reserved * Permission is granted to copy or use this program, EXCEPT that it * may not be sold for profit, the copyright notice must be reproduced * on copies, and credit should be given to Bellcore where it is due. * BELLCORE MAKES NO WARRANTY AND ACCEPTS NO LIABILITY FOR THIS PROGRAM. */ /* $Header: pixel.c,v 1.1 89/05/10 18:21:32 sau Locked $ $Source: /usr/u/sau/mgr/src/dec/RCS/pixel.c,v $ */ static char RCSid_[] = "$Source: /usr/u/sau/mgr/src/dec/RCS/pixel.c,v $$Revision: 1.1 $"; /* * set/clear/ or invert a pixel (Portable version) (SAU) * return current bit setting (i.e. may be used to replace bit_on) */ #include "bitmap.h" #ifdef atarist #include #endif bit_point(map,x,y,op) register BITMAP *map; register int x,y; int op; { register int bit; /* dst bit */ register DATA *base; /* dst word */ /* clipping */ #ifndef NOCLIP if (x<0 || x>BIT_WIDE(map) || y<0 || y>BIT_HIGH(map)) return(-1); #endif #ifdef INVERT /* invert all raster ops */ op = op_invert[15&op]; #endif x += map->x0; y += map->y0; #ifdef atarist if (IS_SCREEN(map)) { return scrpoint(map, x, y, op); } #endif base = y * BIT_LINE(map) + (x>>LOGBITS) + (map->data); bit = GETLSB(MSB,(x & BITS)); switch(OPCODE(op)) { case OPCODE(SRC): case OPCODE(SRC | DST): case OPCODE(SRC | ~DST): case OPCODE(~0): *base |= bit; break; case OPCODE(~SRC): case OPCODE(~(SRC|DST)): case OPCODE(DST & ~SRC): case OPCODE(0): *base &= ~bit; break; case OPCODE(SRC ^ DST): case OPCODE(~DST): case OPCODE(SRC & ~DST): case OPCODE(~(SRC&DST)): *base ^= bit; break; } return(*base&bit); } #ifdef atarist scrpoint(map,x,y,op) register BITMAP *map; register int x,y; int op; { register int bit; /* dst bit */ extern short *Intin, *Ptsin; /* clipping */ Ptsin[0] = x; Ptsin[1] = y; bit = linea2(); switch(OPCODE(op)) { case OPCODE(SRC): case OPCODE(SRC | DST): case OPCODE(SRC | ~DST): case OPCODE(~0): Intin[0] = bit = 0xf; /* set */ break; case OPCODE(~SRC): case OPCODE(~(SRC|DST)): case OPCODE(DST & ~SRC): case OPCODE(0): Intin[0] = bit = 0; /* clear */ break; case OPCODE(SRC ^ DST): case OPCODE(~DST): case OPCODE(SRC & ~DST): case OPCODE(~(SRC&DST)): bit = linea2(); /* get old bit */ Intin[0] = bit = bit ^ 0xf; /* invert */ break; default: bit = linea2(); return bit; } linea1(); /* set bit */ return bit; } #endif