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 ;
 | |
| }
 |