677 lines
16 KiB
C
677 lines
16 KiB
C
|
/*
|
||
|
* 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 ;
|
||
|
}
|
||
|
|
||
|
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 ;
|
||
|
}
|