238 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			238 lines
		
	
	
		
			5.7 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 "ppcGCstr.h"
 | 
						|
 | 
						|
/* xf4bppGetReducedColorRrop( pGC, drawableDepth, returnLoc )
 | 
						|
 * An attempt to do "strength reduction" on color raster-ops
 | 
						|
 * P. Shupak 1/88
 | 
						|
 */
 | 
						|
 | 
						|
static void 
 | 
						|
ppcReduceGeneral
 | 
						|
(
 | 
						|
	register int		alu,
 | 
						|
	register unsigned long	pm,
 | 
						|
	register unsigned long	fg,
 | 
						|
	register unsigned long	bg,
 | 
						|
	register int		fillStyle,
 | 
						|
	int			drawableDepth,
 | 
						|
	ppcReducedRrop		*returnLoc
 | 
						|
)
 | 
						|
{
 | 
						|
 | 
						|
if ( ( alu == GXnoop )
 | 
						|
  || !( pm &= ( ( 1 << drawableDepth ) - 1 ) ) ) {
 | 
						|
	returnLoc->alu = GXnoop ;
 | 
						|
	return ;
 | 
						|
}
 | 
						|
 | 
						|
#ifdef DELETE_THIS
 | 
						|
switch ( fillStyle ) {
 | 
						|
	case FillTiled:
 | 
						|
		switch ( alu ) {
 | 
						|
			case GXclear:		/* 0x0 Zero 0 */
 | 
						|
			case GXinvert:		/* 0xa NOT dst */
 | 
						|
			case GXset:		/* 0xf 1 */
 | 
						|
				fillStyle = FillSolid ;
 | 
						|
			default: /* We Can't Do Much Here */
 | 
						|
				break ;
 | 
						|
		}
 | 
						|
		break ;
 | 
						|
	case FillOpaqueStippled:
 | 
						|
		if ( ( fg & pm ) != ( bg & pm ) ) { /* else FillSolid */
 | 
						|
			switch ( alu ) {
 | 
						|
				case GXclear:	/* 0x0 Zero 0 */
 | 
						|
				case GXset:	/* 0xf 1 */
 | 
						|
				case GXinvert:	/* 0xa NOT dst */
 | 
						|
					fillStyle = FillSolid ;
 | 
						|
					break ;
 | 
						|
				case GXnor:	/* 0x8 NOT src AND NOT dst */
 | 
						|
				case GXnand:	/* 0xe NOT src OR NOT dst */
 | 
						|
				case GXcopy:	/* 0x3 src */
 | 
						|
					break ;
 | 
						|
				case GXandReverse: /* 0x2 src AND NOT dst */
 | 
						|
					fg = ~fg ;
 | 
						|
					bg = ~bg ;
 | 
						|
					alu = GXnor ;
 | 
						|
					break ;
 | 
						|
				case GXandInverted: /* 0x4 NOT src AND dst */
 | 
						|
					fg = ~fg ;
 | 
						|
					bg = ~bg ;
 | 
						|
					alu = GXand ; /* Fall Through */
 | 
						|
				case GXand:	/* 0x1 src AND dst */
 | 
						|
					pm &= ~( fg & bg ) ;
 | 
						|
					if ( ( bg & pm ) == pm ) {
 | 
						|
						fillStyle = FillStippled ;
 | 
						|
						alu = GXclear ;
 | 
						|
					}
 | 
						|
					break ;
 | 
						|
				case GXequiv:	/* 0x9 NOT src XOR dst */
 | 
						|
					fg = ~fg ;
 | 
						|
					bg = ~bg ;
 | 
						|
					alu = GXxor ; /* Fall Through */
 | 
						|
				case GXxor:	/* 0x6 src XOR dst */
 | 
						|
					pm &= ( fg | bg ) ;
 | 
						|
					if ( !( bg & pm ) ) {
 | 
						|
						fillStyle = FillStippled ;
 | 
						|
						alu = GXinvert ;
 | 
						|
					}
 | 
						|
					break ;
 | 
						|
				case GXorReverse:	/* 0xb src OR NOT dst */
 | 
						|
					fg = ~fg ;
 | 
						|
					bg = ~bg ;
 | 
						|
					alu = GXnand ;
 | 
						|
					break ;
 | 
						|
				case GXcopyInverted:	/* 0xc NOT src */
 | 
						|
					fg = ~fg ;
 | 
						|
					bg = ~bg ;
 | 
						|
					alu = GXcopy ;
 | 
						|
					break ;
 | 
						|
				case GXorInverted:	/* 0xd NOT src OR dst */
 | 
						|
					fg = ~fg ;
 | 
						|
					bg = ~bg ;
 | 
						|
					alu = GXor ; /* Fall Through */
 | 
						|
				case GXor:	/* 0x7 src OR dst */
 | 
						|
					pm &= ( fg | bg ) ;
 | 
						|
					if ( !( bg & pm ) ) {
 | 
						|
						fillStyle = FillStippled ;
 | 
						|
						alu = GXset ;
 | 
						|
					}
 | 
						|
					break ;
 | 
						|
				default:
 | 
						|
					ErrorF(
 | 
						|
			 "xf4bppGetReducedColorRrop: Unknown Alu Raster-Op" ) ;
 | 
						|
					break ;
 | 
						|
			}
 | 
						|
			break ; /* Don't Fall Through */
 | 
						|
		}
 | 
						|
		else
 | 
						|
			fillStyle = FillSolid ;
 | 
						|
			/* Fall Through */
 | 
						|
	case FillStippled:
 | 
						|
	case FillSolid:
 | 
						|
		switch ( alu ) {
 | 
						|
			case GXclear:		/* 0x0 Zero 0 */
 | 
						|
			case GXset:		/* 0xf 1 */
 | 
						|
			case GXinvert:		/* 0xa NOT dst */
 | 
						|
				break ;
 | 
						|
			case GXand:		/* 0x1 src AND dst */
 | 
						|
				pm &= ~fg ;
 | 
						|
				alu = GXclear ;
 | 
						|
				break ;
 | 
						|
			case GXandReverse:	/* 0x2 src AND NOT dst */
 | 
						|
				fg = ~fg ;
 | 
						|
				alu = GXnor ; /* Fall Through */
 | 
						|
			case GXnor:		/* 0x8 NOT src AND NOT dst */
 | 
						|
				if ( !( fg & pm ) )
 | 
						|
					alu = GXclear ;
 | 
						|
				else if ( ( fg & pm ) == pm )
 | 
						|
					alu = GXinvert ;
 | 
						|
				break ;
 | 
						|
			case GXandInverted:	/* 0x4 NOT src AND dst */
 | 
						|
				pm &= fg ;
 | 
						|
				alu = GXclear ;
 | 
						|
				break ;
 | 
						|
			case GXxor:		/* 0x6 src XOR dst */
 | 
						|
				pm &= fg ;
 | 
						|
				alu = GXinvert ;
 | 
						|
				break ;
 | 
						|
			case GXor:		/* 0x7 src OR dst */
 | 
						|
				pm &= fg ;
 | 
						|
				alu = GXset ;
 | 
						|
				break ;
 | 
						|
			case GXequiv:		/* 0x9 NOT src XOR dst */
 | 
						|
				pm &= ~fg ;
 | 
						|
				alu = GXinvert ;
 | 
						|
				break ;
 | 
						|
			case GXorReverse:	/* 0xb src OR NOT dst */
 | 
						|
				fg = ~fg ;
 | 
						|
				alu = GXnand ; /* Fall Through */
 | 
						|
			case GXnand:		/* 0xe NOT src OR NOT dst */
 | 
						|
				if ( !( fg & pm ) )
 | 
						|
					alu = GXset ;
 | 
						|
				else if ( ( fg & pm ) == pm )
 | 
						|
					alu = GXinvert ;
 | 
						|
				break ;
 | 
						|
			case GXcopyInverted:	/* 0xc NOT src */
 | 
						|
				fg = ~fg ;
 | 
						|
				alu = GXcopy ; /* Fall Through */
 | 
						|
			case GXcopy:		/* 0x3 src */
 | 
						|
				if ( !( fg & pm ) )
 | 
						|
					alu = GXclear ;
 | 
						|
				else if ( ( fg & pm ) == pm )
 | 
						|
					alu = GXset ;
 | 
						|
				break ;
 | 
						|
			case GXorInverted:	/* 0xd NOT src OR dst */
 | 
						|
				pm &= ~fg ;
 | 
						|
				alu = GXset ;
 | 
						|
				break ;
 | 
						|
			default:
 | 
						|
				ErrorF(
 | 
						|
			 "xf4bppGetReducedColorRrop: Unknown Alu Raster-Op" ) ;
 | 
						|
				break ;
 | 
						|
		}
 | 
						|
		break;
 | 
						|
	default:
 | 
						|
		ErrorF("xf4bppGetReducedColorRrop: Bad Fillstyle\n");
 | 
						|
		break;
 | 
						|
}
 | 
						|
#endif
 | 
						|
 | 
						|
/* Final Test On Restricted Plane Mask */
 | 
						|
if ( !pm )
 | 
						|
	alu = GXnoop ;
 | 
						|
 | 
						|
/* Set Actual Returned Values */
 | 
						|
returnLoc->planemask = pm ;
 | 
						|
returnLoc->fgPixel   = fg ;
 | 
						|
returnLoc->bgPixel   = bg ;
 | 
						|
returnLoc->alu       = alu ;
 | 
						|
returnLoc->fillStyle = fillStyle ;
 | 
						|
 | 
						|
return ;
 | 
						|
}
 | 
						|
 | 
						|
void 
 | 
						|
xf4bppGetReducedColorRrop( pGC, drawableDepth, returnLoc )
 | 
						|
GC		*pGC ;
 | 
						|
int		drawableDepth ;
 | 
						|
ppcReducedRrop	*returnLoc ;
 | 
						|
{
 | 
						|
 | 
						|
ppcReduceGeneral( pGC->alu,
 | 
						|
		  pGC->planemask,
 | 
						|
		  pGC->fgPixel,
 | 
						|
		  pGC->bgPixel,
 | 
						|
 		  pGC->fillStyle,
 | 
						|
		  drawableDepth,
 | 
						|
		  returnLoc ) ;
 | 
						|
 | 
						|
return ;
 | 
						|
}
 |