diff options
Diffstat (limited to 'xorg-server/hw/xfree86/xf4bpp/vgaStipple.c')
-rw-r--r-- | xorg-server/hw/xfree86/xf4bpp/vgaStipple.c | 720 |
1 files changed, 0 insertions, 720 deletions
diff --git a/xorg-server/hw/xfree86/xf4bpp/vgaStipple.c b/xorg-server/hw/xfree86/xf4bpp/vgaStipple.c deleted file mode 100644 index 5ad53028c..000000000 --- a/xorg-server/hw/xfree86/xf4bpp/vgaStipple.c +++ /dev/null @@ -1,720 +0,0 @@ -/* - * 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. - * -*/ - -#ifdef HAVE_XORG_CONFIG_H -#include <xorg-config.h> -#endif - -#include "xf4bpp.h" -#include "OScompiler.h" -#include "vgaReg.h" -#include "vgaVideo.h" - -#include "xf86str.h" /* for pScrn->vtSema */ -extern ScrnInfoPtr *xf86Screens; - -#ifndef PC98_EGC -static unsigned char -getbits -( - register const int x, - register const unsigned int patternWidth, - register const unsigned char * const lineptr -) -{ -register unsigned char bits ; -register const unsigned char *cptr ; -register int shift ; -register int wrap ; - -cptr = lineptr + ( x >> 3 ) ; -bits = *cptr ; -if ((shift = x & 7)) - bits = SCRLEFT8( bits, shift ) | SCRRIGHT8( cptr[1], ( 8 - shift ) ) ; -if ( ( wrap = x + 8 - patternWidth ) > 0 ) { - bits &= SCRLEFT8( 0xFF, wrap ) ; - bits |= SCRRIGHT8( *lineptr, ( 8 - wrap ) ) ; -} - -/* GJA -- Handle extraction of 8 bits from < 8 bits wide stipple. - * I duplicated case 4,5,6,7 to give the compiler a chance to optimize. - */ -switch (patternWidth) { -case 1: /* Not really useful. */ - bits &= ~SCRRIGHT8(0xFF,1); - bits |= SCRRIGHT8(bits,1); - bits |= SCRRIGHT8(bits,2); - bits |= SCRRIGHT8(bits,4); - break; -case 2: - bits &= ~SCRRIGHT8(0xFF,2); - bits |= SCRRIGHT8(bits,2); bits |= SCRRIGHT8(bits,4); break; -case 3: - bits &= ~SCRRIGHT8(0xFF,3); - bits |= (SCRRIGHT8(bits,3) | SCRRIGHT8(bits,6)); break; -case 4: - bits = (bits & ~SCRRIGHT8(0xFF,4)) | SCRRIGHT8(bits,4); break; -case 5: - bits = (bits & ~SCRRIGHT8(0xFF,5)) | SCRRIGHT8(bits,5); break; -case 6: - bits = (bits & ~SCRRIGHT8(0xFF,6)) | SCRRIGHT8(bits,6); break; -case 7: - bits = (bits & ~SCRRIGHT8(0xFF,7)) | SCRRIGHT8(bits,7); break; -default: - ; - /* Do nothing, of course */ -} -return bits ; -} -#endif - -/* GJA -- - * Basically, in the code below, we will draw a stipple in the usual - * three parts: left edge, center and right edge. - * For efficiency reasons, the center will be drawn byte aligned, so that - * we will have to shuffle the bits in the left and right edges. - * The hard cases will be stipples with width < 8: In order to get 8 - * bits from those, we will need a loop. One single 'if' will never do. - * This is taken care of above. - */ -static void -DoMonoSingle -( - WindowPtr pWin, /* GJA */ - int w, - int x, - int y, - register const unsigned char *mastersrc, - int h, - register unsigned int width, - register unsigned int paddedByteWidth, - unsigned int height, - int xshift, - int yshift -) -{ -IOADDRESS REGBASE = - xf86Screens[((DrawablePtr)pWin)->pScreen->myNum]->domainIOBase + 0x300; -register volatile unsigned char *xDst ; -register VideoAdapterObject tmp2 ; -register int NeedValX ; -register int counter ; -register int tmp1 ; -unsigned int rowCounter ; -int byte_cnt ; -#ifdef PC98_EGC -unsigned char bitmask; -#endif - -/* Do Left Edge */ -if ((tmp1 = x & 07)) { - tmp2 = SCRRIGHT8( ( (unsigned) 0xFF ), tmp1 ) ; - /* Catch The Cases Where The Entire Region Is Within One Byte */ - if ( ( w -= 8 - tmp1 ) < 0 ) { - tmp2 &= SCRLEFT8( (unsigned) 0xFF, -w ) ; - w = 0 ; - } -#ifndef PC98_EGC - SetVideoGraphics( Bit_MaskIndex, tmp2 ) ; /* Set The Bit Mask */ -#else - bitmask = tmp2; /* Set The Bit Mask */ -#endif - /* - * For Each Line In The Source Pixmap - */ - xDst = SCREENADDRESS( pWin, x, y ); - for ( tmp1 = yshift, rowCounter = h; - rowCounter ; - rowCounter-- , tmp1++ ) { - - if ( tmp1 >= (int)height ) - tmp1 -= height ; -#ifndef PC98_EGC - /* Read To Save */ - tmp2 = *( (VgaMemoryPtr) xDst) ; -#endif - /* Write Pattern */ - *( (VgaMemoryPtr) xDst ) = -#ifndef PC98_EGC - getbits( xshift /* GJA */, width, - mastersrc - + ( tmp1 * paddedByteWidth ) ) >> (x & 07) ; -#else -#if 0 - (getbits( xshift /* GJA */, width, - mastersrc - + ( tmp1 * paddedByteWidth ) ) >> (x & 07) - & bitmask); -#else - (getbits_x( xshift /* GJA */, width, - mastersrc - + ( tmp1 * paddedByteWidth ), (x & 07)) - & bitmask); -#endif -#endif - xDst += BYTES_PER_LINE(pWin); - } - NeedValX = (xshift + 8 - (x & 07)) % width; - x = ( x + 7 ) & ~07 ; -} -else { - NeedValX = xshift ; -} - -if ((byte_cnt = ROW_OFFSET(w))) { /* Fill The Center Of The Box */ - int SavNeedX = NeedValX ; - -#ifndef PC98_EGC - SetVideoGraphics( Bit_MaskIndex, 0xFF ) ; /* Set The Bit Mask */ -#endif - /* - * For Each Line In The Source Pixmap - */ - xDst = SCREENADDRESS( pWin, x, y ); - for ( tmp1 = yshift, rowCounter = h; - rowCounter ; - rowCounter-- , tmp1++ ) { - register const unsigned char *l_ptr ; - if ( tmp1 >= (int)height ) - tmp1 -= height ; - l_ptr = mastersrc + ( tmp1 * paddedByteWidth ) ; - /* - * For Each Byte Across The Pattern In X - */ - for ( counter = byte_cnt, NeedValX = SavNeedX ; - counter-- ; ) { -#ifndef PC98_EGC - /* Read To Save */ - tmp2 = *( (VgaMemoryPtr) xDst) ; -#endif - /* Write Pattern */ - *( (VgaMemoryPtr) xDst ) = -#ifndef PC98_EGC - getbits( NeedValX, width, l_ptr ) ; -#else -#if 0 - getbits( NeedValX, width, l_ptr ) ; -#else - getbits_x ( NeedValX, width, l_ptr, 0 ) ; -#endif -#endif - /* GJA -- The '%' is there since width could be < 8 */ - NeedValX = (NeedValX + 8) % width; - xDst++; - } - xDst += BYTES_PER_LINE(pWin) - byte_cnt; - } -} - -/* Do Right Edge */ -if ((tmp1 = BIT_OFFSET(w))) { /* x Now Is Byte Aligned */ - /* Set The Bit Mask */ -#ifndef PC98_EGC - SetVideoGraphics( Bit_MaskIndex, SCRLEFT8( 0xFF, ( 8 - tmp1 ) ) ) ; -#else - bitmask = SCRLEFT8( 0xFF, ( 8 - tmp1 )); -#endif - /* - * For Each Line In The Source Pixmap - */ - xDst = SCREENADDRESS( pWin, ( x + w ), y ); - for ( tmp1 = yshift, rowCounter = h; - rowCounter ; - rowCounter-- , tmp1++ ) { - if ( tmp1 >= (int)height ) - tmp1 -= height ; -#ifndef PC98_EGC - /* Read To Save */ - tmp2 = *( (VgaMemoryPtr) xDst) ; -#endif - /* Write Pattern */ - *( (VgaMemoryPtr) xDst ) = -#ifndef PC98_EGC - getbits( NeedValX, width, - mastersrc - + ( tmp1 * paddedByteWidth ) ) ; -#else -#if 0 - (getbits( NeedValX, width, - mastersrc - + ( tmp1 * paddedByteWidth ) ) & bitmask); -#else - (getbits_x( NeedValX, width, - mastersrc - + ( tmp1 * paddedByteWidth ), 0 ) & bitmask); -#endif -#endif - xDst += BYTES_PER_LINE(pWin) ; - } -} - -return ; -} - -static void -DoMonoMany -( - WindowPtr pWin, /* GJA */ - int w, - int x, - int y, - register const unsigned char *mastersrc, - int h, - register unsigned int width, - register unsigned int paddedByteWidth, - unsigned int height, - int xshift, - int yshift -) -{ -IOADDRESS REGBASE = - xf86Screens[((DrawablePtr)pWin)->pScreen->myNum]->domainIOBase + 0x300; -register volatile unsigned char *xDst ; -register VideoAdapterObject tmp2 ; -register int NeedValX ; -register int byte_cnt ; -register int tmp1 ; -unsigned DestinationRow ; -unsigned int SourceRow ; -volatile unsigned char *dst ; -int scr_incr = ( height * BYTES_PER_LINE(pWin) ) ; -#ifdef PC98_EGC -unsigned char bitmask; -#endif - -/* Do Left Edge */ -if ((tmp1 = x & 07)) { - tmp2 = SCRRIGHT8( ( (unsigned) 0xFF ), tmp1 ) ; - /* Catch The Cases Where The Entire Region Is Within One Byte */ - if ( ( w -= 8 - tmp1 ) < 0 ) { - tmp2 &= SCRLEFT8( (unsigned) 0xFF, -w ) ; - w = 0 ; - } -#ifndef PC98_EGC - SetVideoGraphics( Bit_MaskIndex, tmp2 ) ; /* Set The Bit Mask */ -#else - bitmask = tmp2; /* Set The Bit Mask */ -#endif - /* - * For Each Line In The Source Pixmap - */ - for ( tmp1 = yshift, SourceRow = 0, dst = SCREENADDRESS( pWin, x, y ) ; - SourceRow < height ; - tmp1++, SourceRow++, dst += BYTES_PER_LINE(pWin) ) { - register unsigned bitPattern ; - - if ( tmp1 >= (int)height ) - tmp1 -= height ; - /* - * For Each Time Pattern Repeats In The Y Dimension - */ - xDst = dst; - for ( DestinationRow = SourceRow, -#ifndef PC98_EGC - bitPattern = getbits( xshift, width, - mastersrc - + ( tmp1 * paddedByteWidth ) ) ; -#else -#if 0 - bitPattern = getbits( xshift, width, - mastersrc - + ( tmp1 * paddedByteWidth ) ) ; -#else - bitPattern = getbits_x( xshift, width, - mastersrc - + ( tmp1 * paddedByteWidth ), 0 ) ; -#endif -#endif - (int)DestinationRow < h ; - DestinationRow += height ) { -#ifndef PC98_EGC - /* Read To Save */ - tmp2 = *( (VgaMemoryPtr) xDst ) ; -#endif - /* Write Pattern */ -#ifndef PC98_EGC - *( (VgaMemoryPtr) xDst ) = bitPattern >> (x & 07); -#else - *( (VgaMemoryPtr) xDst ) = (bitPattern >> (x & 07)) & bitmask; -#endif - xDst += scr_incr; - } - } - NeedValX = (xshift + 8 - (x & 07)) % width; - x = ( x + 7 ) & ~07 ; -} -else { - NeedValX = xshift ; -} - -if ((byte_cnt = ROW_OFFSET(w))) { /* Fill The Center Of The Box */ - int SavNeedX = NeedValX ; - -#ifndef PC98_EGC - SetVideoGraphics( Bit_MaskIndex, 0xFF ) ; /* Set The Bit Mask */ -#endif - /* - * For Each Line In The Source Pixmap - */ - for ( tmp1 = yshift, SourceRow = 0, dst = SCREENADDRESS( pWin, x, y ) ; - SourceRow < height ; - tmp1++, SourceRow++, dst += BYTES_PER_LINE(pWin) - byte_cnt ) { - register const unsigned char *l_ptr ; - if ( tmp1 >= (int)height ) - tmp1 -= height ; - l_ptr = mastersrc + ( tmp1 * paddedByteWidth ) ; - /* - * For Each Byte Across The Pattern In X - */ - for ( tmp2 = byte_cnt, NeedValX = SavNeedX ; - tmp2-- ; - dst++ ) { - register unsigned bitPattern ; -#ifndef PC98_EGC - register VideoAdapterObject tmp3 ; -#endif - /* - * For Each Time Pattern Repeats In Y - */ - xDst = dst; - for ( DestinationRow = SourceRow, -#ifndef PC98_EGC - bitPattern = getbits( NeedValX, width, l_ptr ) ; -#else -#if 0 - bitPattern = getbits( NeedValX, width, l_ptr ) ; -#else - bitPattern = getbits_x( NeedValX, width, l_ptr, 0 ) ; -#endif -#endif - (int)DestinationRow < h ; - DestinationRow += height ) { -#ifndef PC98_EGC - /* Read To Save */ - tmp3 = *( (VgaMemoryPtr) xDst) ; - (void)tmp3; -#endif - /* Write Pattern */ - *( (VgaMemoryPtr) xDst ) = bitPattern ; - xDst += scr_incr; - } - NeedValX = (NeedValX + 8) % width; - } - } -} - -/* Do Right Edge */ -if ((tmp1 = BIT_OFFSET(w))) { /* x Now Is Byte Aligned */ - /* Set The Bit Mask */ -#ifndef PC98_EGC - SetVideoGraphics( Bit_MaskIndex, SCRLEFT8( 0xFF, ( 8 - tmp1 ) ) ) ; -#else - bitmask = SCRLEFT8( 0xFF, ( 8 - tmp1 ) ); -#endif - /* - * For Each Line In The Source Pixmap - */ - for ( tmp1 = yshift, SourceRow = 0, - dst = SCREENADDRESS( pWin, ( x + w ), y ) ; - SourceRow < height ; - tmp1++, SourceRow++, dst += BYTES_PER_LINE(pWin) ) { - register unsigned bitPattern ; - if ( tmp1 >= (int)height ) - tmp1 -= height ; - /* - * For Each Time Pattern Repeats In The Y Dimension - */ - xDst = dst; - for ( DestinationRow = SourceRow, -#ifndef PC98_EGC - bitPattern = getbits( NeedValX, width, - mastersrc - + ( tmp1 * paddedByteWidth ) ) ; -#else -#if 0 - bitPattern = getbits( NeedValX, width, - mastersrc - + ( tmp1 * paddedByteWidth ) ) ; -#else - bitPattern = getbits_x( NeedValX, width, - mastersrc - + ( tmp1 * paddedByteWidth ), 0 ) ; -#endif -#endif - (int)DestinationRow < h ; - DestinationRow += height ) { -#ifndef PC98_EGC - /* Read To Save */ - tmp2 = *( (VgaMemoryPtr) xDst) ; -#endif - /* Write Pattern */ -#ifndef PC98_EGC - *( (VgaMemoryPtr) xDst ) = bitPattern ; -#else - *( (VgaMemoryPtr) xDst ) = bitPattern & bitmask; -#endif - xDst += scr_incr; - } - } -} - -return ; -} - -#define DO_RECURSE 0x10000 - -static void -vgaSetMonoRegisters -( - DrawablePtr pDrawable, - register unsigned long int plane_mask, - register unsigned long int desiredState -) -{ -IOADDRESS REGBASE = - xf86Screens[pDrawable->pScreen->myNum]->domainIOBase + 0x300; -#ifndef PC98_EGC -/* Setup VGA Registers */ -/* - * Set The Plane-Enable - */ -SetVideoSequencer( Mask_MapIndex, plane_mask ) ; -SetVideoGraphics( Enb_Set_ResetIndex, plane_mask ) ; -/* - * Put Display Into SET-AND (i.e. Write Mode 3 ) - */ -SetVideoGraphics( Graphics_ModeIndex, VGA_WRITE_MODE_3 ) ; -/* - * Set The Color in The Set/Reset Register - */ -SetVideoGraphics( Set_ResetIndex, desiredState & VGA_ALLPLANES ) ; -/* - * Set The Vga's Alu Function - */ -SetVideoGraphics( Data_RotateIndex, desiredState >> 8 ) ; -#else /* PC98_EGC */ -unsigned short ROP_value; -/* Setup VGA Registers */ -/* - * Set The Plane-Enable - */ -outw(EGC_PLANE, ~plane_mask); -switch((desiredState >> 8)&0x18) { -/* EGC MODE.. Cmp Read: Flase, WriteSource=ROP, ReadSource=CPU */ - case VGA_AND_MODE: - if (desiredState & DO_RECURSE) - ROP_value = EGC_AND_INV_MODE; - else - ROP_value = EGC_AND_MODE; - break; - case VGA_OR_MODE: - if (desiredState & DO_RECURSE) - ROP_value = EGC_OR_INV_MODE; - else - ROP_value = EGC_OR_MODE; - break; - case VGA_XOR_MODE: - if (desiredState & DO_RECURSE) - ROP_value = EGC_XOR_INV_MODE; - else - ROP_value = EGC_XOR_MODE; - break; - case VGA_COPY_MODE: - default: - ROP_value = EGC_COPY_MODE; - break; -} -outw(EGC_MODE, ROP_value); -outw(EGC_FGC, desiredState & VGA_ALLPLANES); -#endif - -return ; -} - -static unsigned long -vgaCalcMonoMode -( - int rasterOp, - register unsigned long int color -) -{ -register unsigned int data_rotate_value = VGA_COPY_MODE << 8 ; -register unsigned int invert_existing_data = 0 ; - -/* Test The Raster-Op */ -switch ( rasterOp ) { - case GXclear: /* 0x0 Zero 0 */ - color = 0 ; - break ; - case GXinvert: /* 0xa NOT dst */ - data_rotate_value = VGA_XOR_MODE << 8 ; - case GXset: /* 0xf 1 */ - color = VGA_ALLPLANES ; - break ; - case GXnor: /* 0x8 NOT src AND NOT dst */ - invert_existing_data = DO_RECURSE ; - case GXandInverted: /* 0x4 NOT src AND dst */ - color = ~color ; - case GXand: /* 0x1 src AND dst */ - data_rotate_value = VGA_AND_MODE << 8 ; - case GXcopy: /* 0x3 src */ - break ; - case GXequiv: /* 0x9 NOT src XOR dst */ - color = ~color ; - case GXxor: /* 0x6 src XOR dst */ - data_rotate_value = VGA_XOR_MODE << 8 ; - break ; - case GXandReverse: /* 0x2 src AND NOT dst */ - invert_existing_data = DO_RECURSE ; - data_rotate_value = VGA_AND_MODE << 8 ; - break ; - case GXorReverse: /* 0xb src OR NOT dst */ - invert_existing_data = DO_RECURSE ; - data_rotate_value = VGA_OR_MODE << 8 ; - break ; - case GXnand: /* 0xe NOT src OR NOT dst */ - invert_existing_data = DO_RECURSE ; - case GXorInverted: /* 0xd NOT src OR dst */ - color = ~color ; - case GXor: /* 0x7 src OR dst */ - data_rotate_value = VGA_OR_MODE << 8 ; - break ; - case GXcopyInverted: /* 0xc NOT src */ - color = ~color ; - break ; - case GXnoop: /* 0x5 dst */ - ; /* Shouldn't Get Here !! */ -} - -return ( color & VGA_ALLPLANES ) | data_rotate_value | invert_existing_data ; -} - -static void -vgaDrawMonoImage -( - WindowPtr pWin, /* GJA */ - unsigned char *data, - int x, - int y, - int w, - int h, - unsigned long int fg, - int alu, - unsigned long int planes -) -{ -unsigned long regState ; - -if ( !xf86Screens[((DrawablePtr)pWin)->pScreen->myNum]->vtSema ) { - xf4bppOffDrawMonoImage( pWin, data, x, y, w, h, fg, alu, planes ); - return; -} - -if ( ( alu == GXnoop ) || !( planes &= VGA_ALLPLANES ) ) - return ; - -#ifndef PC98_EGC -if ( ( regState = vgaCalcMonoMode( alu, fg ) ) & DO_RECURSE ) { - vgaDrawMonoImage( pWin, data, x, y, w, h, - VGA_ALLPLANES, GXinvert, planes ) ; - regState &= ~DO_RECURSE ; -} -#else -regState = vgaCalcMonoMode(alu, (char)fg); -#endif - - -vgaSetMonoRegisters( (DrawablePtr)pWin, planes, regState ) ; - -DoMonoSingle( pWin, w, x, y, (const unsigned char *) data, h, - w, ( ( w + 31 ) & ~31 ) >> 3, h, 0, 0 ) ; - - -return ; -} - -void -xf4bppFillStipple( 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 ; -unsigned long regState ; - -if ( !xf86Screens[((DrawablePtr)pWin)->pScreen->myNum]->vtSema ) { - xf4bppOffFillStipple( pWin, pStipple, fg, alu, planes, - x, y, w, h, xSrc, ySrc ); - return; -} - -if ( ( alu == GXnoop ) || !( planes &= VGA_ALLPLANES ) ) - return ; - -#if 1 -if ( ( regState = vgaCalcMonoMode( alu, fg ) ) & DO_RECURSE ) { - xf4bppFillStipple( pWin, pStipple, VGA_ALLPLANES, GXinvert, planes, - x, y, w, h, xSrc, ySrc ) ; - regState &= ~DO_RECURSE ; -} -#else -regState = vgaCalcMonoMode(alu, (char)fg); -#endif - - -vgaSetMonoRegisters( (DrawablePtr)pWin, planes, regState ) ; - -/* Figure Bit Offsets & Source Address */ -width = pStipple->drawable.width ; -if ( ( xshift = ( x - xSrc ) ) < 0 ) - xshift = width - ( ( - xshift ) % width ) ; -else - xshift %= width ; -if ( xshift == (int)width ) xshift = 0; - -height = pStipple->drawable.height ; -if ( ( yshift = ( y - ySrc ) ) < 0 ) - yshift = height - ( ( - yshift ) % height ) ; -else - yshift %= height ; -if ( yshift == (int)height ) yshift = 0; - - (* ( (h > (int)height) ? DoMonoMany : DoMonoSingle ) ) ( - pWin, w, x, y, - (const unsigned char *) pStipple->devPrivate.ptr, - h, - width, - ( ( width + 31 ) & ((unsigned)(~31)) ) >> 3, - height, - xshift, yshift - ) ; - -return ; -} |