/* $XFree86: xc/programs/Xserver/hw/xfree86/xf4bpp/offscreen.c,v 1.5 2001/08/01 00:44:56 tsi Exp $ */ /* * Copyright 1993 Gerrit Jan Akkerman * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies and that * both that copyright notice and this permission notice appear in * supporting documentation, and that the name of Gerrit Jan Akkerman not be * used in advertising or publicity pertaining to distribution of the * software without specific, written prior permission. * * GERRIT JAN AKKERMAN DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, * IN NO EVENT SHALL GERRIT JAN AKKERMAN BE LIABLE FOR ANY SPECIAL, INDIRECT * OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. * */ /* * Copyright IBM Corporation 1987,1988,1989 * * All Rights Reserved * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies and that * both that copyright notice and this permission notice appear in * supporting documentation, and that the name of IBM not be * used in advertising or publicity pertaining to distribution of the * software without specific, written prior permission. * * IBM DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL * IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. * */ /* $XConsortium: offscreen.c /main/4 1996/02/21 17:56:55 kaleb $ */ #include "xf4bpp.h" #include "vgaVideo.h" #include "pixmapstr.h" #include "scrnintstr.h" #include "windowstr.h" #define saved_screen(pWin) \ ((unsigned char *)(((PixmapPtr)((pWin)->drawable.pScreen->devPrivate))->devPrivate.ptr)) #define SAVEDSCREEN(pWin, x, y) \ (*(saved_screen(pWin) + (y) * (BYTES_PER_LINE(pWin)) + (x))) #define DO_ROP(src,dst,alu,planes) \ ((dst) = do_rop((src),(dst),(alu),(planes))) /* NOTE: * The following to functions don't do anything. They're just there to * provide a stable interface to the rest of the system. */ static int do_rop ( int src, int dst, int alu, const unsigned long planes ) { int _dst; /* New dst */ switch ( alu ) { case GXclear: /* 0x0 Zero 0 */ _dst = 0; break ; case GXinvert: /* 0xa NOT dst */ _dst = ~dst; break ; case GXset: /* 0xf 1 */ _dst = src; break ; default: case GXnoop: /* 0x5 dst */ return dst; case GXnor: /* 0x8 NOT src AND NOT dst */ _dst = ~src & ~dst; break ; case GXandInverted: /* 0x4 NOT src AND dst */ _dst = ~src & dst; break ; case GXand: /* 0x1 src AND dst */ _dst = src & dst; break ; case GXequiv: /* 0x9 NOT src XOR dst */ _dst = ~src ^ dst; break ; case GXxor: /* 0x6 src XOR dst */ _dst = src ^ dst; break ; case GXandReverse: /* 0x2 src AND NOT dst */ _dst = src & ~dst; break ; case GXnand: /* 0xe NOT src OR NOT dst */ _dst = ~src | ~dst; break ; case GXorReverse: /* 0xb src OR NOT dst */ _dst = src | ~dst; break ; case GXorInverted: /* 0xd NOT src OR dst */ _dst = ~src | dst; break ; case GXor: /* 0x7 src OR dst */ _dst = src | dst; break ; case GXcopyInverted: /* 0xc NOT src */ _dst = ~src; break ; case GXcopy: /* 0x3 src */ _dst = src; break ; } return (dst & ~planes) | (_dst & planes); } /* File vgaBitBlt.c */ void xf4bppOffBitBlt( pWin, alu, writeplanes, x0, y0, x1, y1, w, h ) WindowPtr pWin; /* GJA */ const int alu, writeplanes ; register int x0 ; int y0 ; register int x1 ; int y1 ; register int w, h ; { int x,y; switch ( alu ) { case GXclear: /* 0x0 Zero 0 */ case GXinvert: /* 0xa NOT dst */ case GXset: /* 0xf 1 */ xf4bppOffFillSolid( pWin, VGA_ALLPLANES, alu, writeplanes, x0, y0, w, h ) ; case GXnoop: /* 0x5 dst */ return ; default: break ; } if ( (w <= 0) || (h <= 0) ) return; for ( y = 0 ; y < h ; y++ ) { for ( x = 0 ; x < w ; x++ ) { DO_ROP(SAVEDSCREEN(pWin,x0+x,y0+y),SAVEDSCREEN(pWin,x1+x,y1+y), alu,writeplanes); } } } /* for file vgaImages.c */ void xf4bppOffDrawColorImage( pWin, x, y, w, h, data, RowIncrement, alu, planes ) WindowPtr pWin; /* GJA */ int x, y ; register int w, h ; unsigned char *data ; register int RowIncrement ; const int alu ; const unsigned long int planes ; { int dx,dy; for ( dy = 0 ; dy < h ; dy++ ) { for ( dx = 0 ; dx < w ; dx++ ) { DO_ROP( data[dy * RowIncrement + dx], SAVEDSCREEN(pWin,x+dx,y+dy), alu, planes); } } } void xf4bppOffReadColorImage( pWin, x, y, lx, ly, data, RowIncrement ) WindowPtr pWin; /* GJA */ int x, y ; int lx, ly ; unsigned char *data ; int RowIncrement ; { int dx, dy; if ( ( lx <= 0 ) || ( ly <= 0 ) ) return ; for ( dy = 0 ; dy < ly ; dy++ ) { for ( dx = 0 ; dx < lx ; dx++ ) { data[dy*RowIncrement+dx] = SAVEDSCREEN(pWin,x+dx,y+dy); } } } /* For file vgaSolid.c */ void xf4bppOffFillSolid( pWin, color, alu, planes, x0, y0, lx, ly ) WindowPtr pWin; /* GJA */ unsigned long int color ; const int alu ; unsigned long int planes ; register int x0 ; register const int y0 ; register int lx ; register const int ly ; /* MUST BE > 0 !! */ { int dx, dy; if ( ( lx == 0 ) || ( ly == 0 ) ) return; for ( dy = 0 ; dy < ly ; dy++ ) { for ( dx = 0 ; dx < lx ; dx++ ) { DO_ROP(color,SAVEDSCREEN(pWin, x0+dx,y0+dy),alu,planes); } } } /* For file vgaStipple.c */ /* GJA -- modified this to take both Width and Height, and to * reduce x and y to Width and Height by taking remainders. */ static unsigned char xygetbits ( register int x, register int y, register const unsigned int Width, register const unsigned int paddedByteWidth, register const unsigned int Height, register const unsigned char * const data ) { register unsigned char bits ; unsigned const char *lineptr, *cptr ; register int shift ; register int wrap ; x = x % Width; y = y % Height; lineptr = data + (y * paddedByteWidth); cptr = lineptr + (x >> 3) ; bits = *cptr ; if ((shift = x & 7)) bits = SCRLEFT8( bits, shift ) | SCRRIGHT8( cptr[1], ( 8 - shift ) ) ; if ( ( wrap = x + 8 - Width ) > 0 ) { bits &= SCRLEFT8( 0xFF, wrap ) ; bits |= SCRRIGHT8( *lineptr, ( 8 - wrap ) ) ; } return bits ; } static void DoMono ( WindowPtr pWin, /* GJA */ int w, int x, int y, register const unsigned char *mastersrc, int h, unsigned int width, register unsigned int paddedByteWidth, unsigned int height, int xshift, int yshift, int alu, int planes, int fg ) { int dy, dx, i; int byte; for ( dy = 0 ; dy < h ; dy++ ) { for ( dx = 0; dx <= w - 8 ; dx += 8 ) { /* get next byte */ byte = xygetbits(dx+xshift,dy+yshift,width, paddedByteWidth, height, mastersrc); for ( i = 0 ; i < 8 ; i++ ) { if ( byte & (128 >> i) ) { DO_ROP(fg,SAVEDSCREEN(pWin,x+dx+i,y+dy), alu,planes); } } } /* get last bits */ byte = xygetbits(dx+xshift,dy+yshift,width, paddedByteWidth, height, mastersrc); for ( i = 0 ; i < (w - dx) ; i++ ) { if ( byte & (128 >> i) ) { DO_ROP(fg,SAVEDSCREEN(pWin,x+dx+i,y+dy), alu,planes); } } } } void xf4bppOffDrawMonoImage( pWin, data, x, y, w, h, fg, alu, planes ) WindowPtr pWin; /* GJA */ unsigned char *data; int x, y, w, h ; unsigned long int fg ; int alu ; unsigned long int planes; { if ( ( alu == GXnoop ) || !( planes &= VGA_ALLPLANES ) ) return ; DoMono( pWin, w, x, y, (const unsigned char *) data, h, w, ( ( w + 31 ) & ~31 ) >> 3, h, 0, 0, alu, (int)planes, (int)fg) ; } void xf4bppOffFillStipple( pWin, pStipple, fg, alu, planes, x, y, w, h, xSrc, ySrc ) WindowPtr pWin; /* GJA */ register PixmapPtr const pStipple ; unsigned long int fg ; const int alu ; unsigned long int planes ; int x, y, w, h ; const int xSrc, ySrc ; { unsigned int width ; unsigned int height ; int xshift ; int yshift ; if ( ( alu == GXnoop ) || !( planes &= VGA_ALLPLANES ) ) return ; /* Figure Bit Offsets & Source Address */ width = pStipple->drawable.width ; if ( ( xshift = ( x - xSrc ) ) < 0 ) xshift = width - ( ( - xshift ) % width ) ; else xshift %= width ; height = pStipple->drawable.height ; if ( ( yshift = ( y - ySrc ) ) < 0 ) yshift = height - ( ( - yshift ) % height ) ; else yshift %= height ; DoMono( pWin, w, x, y, (const unsigned char *) pStipple->devPrivate.ptr, h, width, ( ( width + 31 ) & (unsigned)(~31) ) >> 3, height, xshift, yshift, alu, (int)planes, (int)fg ) ; return ; }