xserver-multidpi/hw/xfree86/xf4bpp/ppcCReduce.c
2006-07-21 17:56:00 -04:00

240 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.
*
*/
/* $XConsortium: ppcCReduce.c /main/3 1996/02/21 17:57:17 kaleb $ */
#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 ;
}