home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The World of Computer Software
/
World_Of_Computer_Software-02-385-Vol-1of3.iso
/
x
/
xibm.zip
/
ppc
/
ppcCReduce.c
< prev
next >
Wrap
C/C++ Source or Header
|
1989-11-14
|
7KB
|
259 lines
/*
* 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.
*
*/
/* $Header: /andrew/X11/R3src/tape/server/ddx/ibm/ppc/RCS/ppcCReduce.c,v 9.1 88/10/24 03:59:37 paul Exp $ */
/* $Source: /andrew/X11/R3src/tape/server/ddx/ibm/ppc/RCS/ppcCReduce.c,v $ */
#ifndef lint
static char *rcsid = "$Header: /andrew/X11/R3src/tape/server/ddx/ibm/ppc/RCS/ppcCReduce.c,v 9.1 88/10/24 03:59:37 paul Exp $";
#endif
#include "X.h"
#include "misc.h"
#include "gcstruct.h"
#include "pixmapstr.h"
#include "colormapst.h"
#include "ppc.h"
/* ppcGetReducedColorRrop( pGC, drawableDepth, returnLoc )
* An attempt to do "strength reduction" on color raster-ops
* P. Shupak 1/88
*/
void
ppcReduceGeneral( alu, pm, fg, bg, fillStyle, drawableDepth, returnLoc )
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 ;
}
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(
"ppcGetReducedColorRrop: 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(
"ppcGetReducedColorRrop: Unknown Alu Raster-Op" ) ;
break ;
}
break;
default:
ErrorF("ppcGetReducedColorRrop: Bad Fillstyle\n");
break;
}
/* 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
ppcReduceColorRrop( initialLoc, drawableDepth, returnLoc )
ppcReducedRrop *initialLoc ;
int drawableDepth ;
ppcReducedRrop *returnLoc ;
{
ppcReduceGeneral( initialLoc->alu,
initialLoc->planemask,
initialLoc->fgPixel,
initialLoc->bgPixel,
initialLoc->fillStyle,
drawableDepth,
returnLoc ) ;
return ;
}
void
ppcGetReducedColorRrop( pGC, drawableDepth, returnLoc )
GC *pGC ;
int drawableDepth ;
ppcReducedRrop *returnLoc ;
{
ppcReduceGeneral( pGC->alu,
pGC->planemask,
pGC->fgPixel,
pGC->bgPixel,
pGC->fillStyle,
drawableDepth,
returnLoc ) ;
return ;
}