#ifdef HAVE_DIX_CONFIG_H
#include <dix-config.h>
#endif
#include <stdlib.h>
#include <X11/X.h>
#include <X11/Xmd.h>
#include <X11/Xproto.h>
#include "mfb.h"
#include "dixfontstr.h"
#include <X11/fonts/fontstruct.h>
#include "gcstruct.h"
#include "windowstr.h"
#include "pixmapstr.h"
#include "scrnintstr.h"
#include "region.h"
#include "mistruct.h"
#include "migc.h"
#include "maskbits.h"
static GCFuncs mfbFuncs = {
mfbValidateGC,
miChangeGC,
miCopyGC,
miDestroyGC,
miChangeClip,
miDestroyClip,
miCopyClip
};
static GCOps whiteTECopyOps = {
mfbWhiteSolidFS,
mfbSetSpans,
mfbPutImage,
mfbCopyArea,
mfbCopyPlane,
mfbPolyPoint,
mfbLineSS,
mfbSegmentSS,
miPolyRectangle,
mfbZeroPolyArcSS,
mfbFillPolyWhite,
mfbPolyFillRect,
mfbPolyFillArcSolid,
miPolyText8,
miPolyText16,
miImageText8,
miImageText16,
mfbTEGlyphBltWhite,
mfbPolyGlyphBltWhite,
mfbSolidPP
};
static GCOps blackTECopyOps = {
mfbBlackSolidFS,
mfbSetSpans,
mfbPutImage,
mfbCopyArea,
mfbCopyPlane,
mfbPolyPoint,
mfbLineSS,
mfbSegmentSS,
miPolyRectangle,
mfbZeroPolyArcSS,
mfbFillPolyBlack,
mfbPolyFillRect,
mfbPolyFillArcSolid,
miPolyText8,
miPolyText16,
miImageText8,
miImageText16,
mfbTEGlyphBltBlack,
mfbPolyGlyphBltBlack,
mfbSolidPP
};
static GCOps whiteTEInvertOps = {
mfbInvertSolidFS,
mfbSetSpans,
mfbPutImage,
miCopyArea,
miCopyPlane,
mfbPolyPoint,
mfbLineSS,
mfbSegmentSS,
miPolyRectangle,
miZeroPolyArc,
mfbFillPolyInvert,
mfbPolyFillRect,
mfbPolyFillArcSolid,
miPolyText8,
miPolyText16,
miImageText8,
miImageText16,
mfbTEGlyphBltWhite,
mfbPolyGlyphBltInvert,
mfbSolidPP
};
static GCOps blackTEInvertOps = {
mfbInvertSolidFS,
mfbSetSpans,
mfbPutImage,
mfbCopyArea,
mfbCopyPlane,
mfbPolyPoint,
mfbLineSS,
mfbSegmentSS,
miPolyRectangle,
miZeroPolyArc,
mfbFillPolyInvert,
mfbPolyFillRect,
mfbPolyFillArcSolid,
miPolyText8,
miPolyText16,
miImageText8,
miImageText16,
mfbTEGlyphBltBlack,
mfbPolyGlyphBltInvert,
mfbSolidPP
};
static GCOps whiteCopyOps = {
mfbWhiteSolidFS,
mfbSetSpans,
mfbPutImage,
mfbCopyArea,
mfbCopyPlane,
mfbPolyPoint,
mfbLineSS,
mfbSegmentSS,
miPolyRectangle,
mfbZeroPolyArcSS,
mfbFillPolyWhite,
mfbPolyFillRect,
mfbPolyFillArcSolid,
miPolyText8,
miPolyText16,
miImageText8,
miImageText16,
mfbImageGlyphBltWhite,
mfbPolyGlyphBltWhite,
mfbSolidPP
};
static GCOps blackCopyOps = {
mfbBlackSolidFS,
mfbSetSpans,
mfbPutImage,
mfbCopyArea,
mfbCopyPlane,
mfbPolyPoint,
mfbLineSS,
mfbSegmentSS,
miPolyRectangle,
mfbZeroPolyArcSS,
mfbFillPolyBlack,
mfbPolyFillRect,
mfbPolyFillArcSolid,
miPolyText8,
miPolyText16,
miImageText8,
miImageText16,
mfbImageGlyphBltBlack,
mfbPolyGlyphBltBlack,
mfbSolidPP
};
static GCOps whiteInvertOps = {
mfbInvertSolidFS,
mfbSetSpans,
mfbPutImage,
mfbCopyArea,
mfbCopyPlane,
mfbPolyPoint,
mfbLineSS,
mfbSegmentSS,
miPolyRectangle,
miZeroPolyArc,
mfbFillPolyInvert,
mfbPolyFillRect,
mfbPolyFillArcSolid,
miPolyText8,
miPolyText16,
miImageText8,
miImageText16,
mfbImageGlyphBltWhite,
mfbPolyGlyphBltInvert,
mfbSolidPP
};
static GCOps blackInvertOps = {
mfbInvertSolidFS,
mfbSetSpans,
mfbPutImage,
mfbCopyArea,
mfbCopyPlane,
mfbPolyPoint,
mfbLineSS,
mfbSegmentSS,
miPolyRectangle,
miZeroPolyArc,
mfbFillPolyInvert,
mfbPolyFillRect,
mfbPolyFillArcSolid,
miPolyText8,
miPolyText16,
miImageText8,
miImageText16,
mfbImageGlyphBltBlack,
mfbPolyGlyphBltInvert,
mfbSolidPP
};
static GCOps whiteWhiteCopyOps = {
mfbWhiteSolidFS,
mfbSetSpans,
mfbPutImage,
mfbCopyArea,
mfbCopyPlane,
mfbPolyPoint,
mfbLineSS,
mfbSegmentSS,
miPolyRectangle,
mfbZeroPolyArcSS,
mfbFillPolyWhite,
mfbPolyFillRect,
mfbPolyFillArcSolid,
miPolyText8,
miPolyText16,
miImageText8,
miImageText16,
miImageGlyphBlt,
mfbPolyGlyphBltWhite,
mfbSolidPP
};
static GCOps blackBlackCopyOps = {
mfbBlackSolidFS,
mfbSetSpans,
mfbPutImage,
mfbCopyArea,
mfbCopyPlane,
mfbPolyPoint,
mfbLineSS,
mfbSegmentSS,
miPolyRectangle,
mfbZeroPolyArcSS,
mfbFillPolyBlack,
mfbPolyFillRect,
mfbPolyFillArcSolid,
miPolyText8,
miPolyText16,
miImageText8,
miImageText16,
miImageGlyphBlt,
mfbPolyGlyphBltBlack,
mfbSolidPP
};
static GCOps fgEqBgInvertOps = {
mfbInvertSolidFS,
mfbSetSpans,
mfbPutImage,
mfbCopyArea,
mfbCopyPlane,
mfbPolyPoint,
mfbLineSS,
mfbSegmentSS,
miPolyRectangle,
miZeroPolyArc,
mfbFillPolyInvert,
mfbPolyFillRect,
mfbPolyFillArcSolid,
miPolyText8,
miPolyText16,
miImageText8,
miImageText16,
miImageGlyphBlt,
mfbPolyGlyphBltInvert,
mfbSolidPP
};
struct commonOps {
int fg, bg;
int rrop;
int terminalFont;
GCOps *ops;
void (*fillArea)(
DrawablePtr ,
int ,
BoxPtr ,
int ,
PixmapPtr );
};
static struct commonOps mfbCommonOps[] = {
{ 1, 0, RROP_WHITE, 1, &whiteTECopyOps, mfbSolidWhiteArea },
{ 0, 1, RROP_BLACK, 1, &blackTECopyOps, mfbSolidBlackArea },
{ 1, 0, RROP_INVERT, 1, &whiteTEInvertOps, mfbSolidInvertArea },
{ 0, 1, RROP_INVERT, 1, &blackTEInvertOps, mfbSolidInvertArea },
{ 1, 0, RROP_WHITE, 0, &whiteCopyOps, mfbSolidWhiteArea },
{ 0, 1, RROP_BLACK, 0, &blackCopyOps, mfbSolidBlackArea },
{ 1, 0, RROP_INVERT, 0, &whiteInvertOps, mfbSolidInvertArea },
{ 0, 1, RROP_INVERT, 0, &blackInvertOps, mfbSolidInvertArea },
{ 1, 1, RROP_WHITE, 0, &whiteWhiteCopyOps, mfbSolidWhiteArea },
{ 0, 0, RROP_BLACK, 0, &blackBlackCopyOps, mfbSolidBlackArea },
{ 1, 1, RROP_INVERT, 0, &fgEqBgInvertOps, mfbSolidInvertArea },
{ 0, 0, RROP_INVERT, 0, &fgEqBgInvertOps, mfbSolidInvertArea },
};
#define numberCommonOps (sizeof (mfbCommonOps) / sizeof (mfbCommonOps[0]))
static GCOps *
matchCommon (
GCPtr pGC)
{
int i;
struct commonOps *cop;
mfbPrivGC *priv;
if (pGC->lineWidth != 0)
return 0;
if (pGC->lineStyle != LineSolid)
return 0;
if (pGC->fillStyle != FillSolid)
return 0;
if (!pGC->font ||
FONTMAXBOUNDS(pGC->font,rightSideBearing) -
FONTMINBOUNDS(pGC->font,leftSideBearing) > 32 ||
FONTMINBOUNDS(pGC->font,characterWidth) < 0)
return 0;
priv = (mfbPrivGC *) pGC->devPrivates[mfbGCPrivateIndex].ptr;
for (i = 0; i < numberCommonOps; i++) {
cop = &mfbCommonOps[i];
if ((pGC->fgPixel & 1) != cop->fg)
continue;
if ((pGC->bgPixel & 1) != cop->bg)
continue;
if (priv->rop != cop->rrop)
continue;
if (cop->terminalFont && !TERMINALFONT(pGC->font))
continue;
priv->FillArea = cop->fillArea;
return cop->ops;
}
return 0;
}
Bool
mfbCreateGC(pGC)
register GCPtr pGC;
{
mfbPrivGC *pPriv;
pGC->clientClip = NULL;
pGC->clientClipType = CT_NONE;
pGC->ops = &whiteCopyOps;
pGC->funcs = &mfbFuncs;
pGC->miTranslate = 1;
pPriv = (mfbPrivGC *)(pGC->devPrivates[mfbGCPrivateIndex].ptr);
pPriv->rop = mfbReduceRop(pGC->alu, pGC->fgPixel);
pGC->fExpose = TRUE;
pGC->pRotatedPixmap = NullPixmap;
pGC->freeCompClip = FALSE;
pPriv->FillArea = mfbSolidInvertArea;
return TRUE;
}
static void
mfbPolyGlyphBltNoop(
DrawablePtr pDrawable,
GCPtr pGC,
int x,
int y,
unsigned int nglyph,
CharInfoPtr * ppci,
pointer pglyphBase)
{
}
static void
mfbNoopFS(
DrawablePtr pDrawable,
GCPtr pGC,
int nInit,
DDXPointPtr pptInit,
int * pwidthInit,
int fSorted)
{
}
static void
mfbFillPolyNoop(
DrawablePtr pDrawable,
GCPtr pGC,
int shape,
int mode,
int count,
DDXPointPtr ptsIn)
{
}
void
mfbValidateGC(pGC, changes, pDrawable)
register GCPtr pGC;
unsigned long changes;
DrawablePtr pDrawable;
{
register mfbPrivGCPtr devPriv;
int mask;
int index;
int xrot, yrot;
int rrop;
int new_rotate, new_rrop, new_line, new_text, new_fill;
DDXPointRec oldOrg;
oldOrg = pGC->lastWinOrg;
pGC->lastWinOrg.x = pDrawable->x;
pGC->lastWinOrg.y = pDrawable->y;
new_rotate = (oldOrg.x != pGC->lastWinOrg.x) ||
(oldOrg.y != pGC->lastWinOrg.y);
devPriv = ((mfbPrivGCPtr) (pGC->devPrivates[mfbGCPrivateIndex].ptr));
if ((changes & (GCClipXOrigin|GCClipYOrigin|GCClipMask|GCSubwindowMode)) ||
(pDrawable->serialNumber != (pGC->serialNumber & DRAWABLE_SERIAL_BITS))
)
{
miComputeCompositeClip(pGC, pDrawable);
}
new_rrop = FALSE;
new_line = FALSE;
new_text = FALSE;
new_fill = FALSE;
mask = changes;
while (mask)
{
index = lowbit (mask);
mask &= ~index;
switch (index)
{
case GCFunction:
case GCForeground:
new_rrop = TRUE;
break;
case GCPlaneMask:
break;
case GCBackground:
new_rrop = TRUE;
break;
case GCLineStyle:
case GCLineWidth:
case GCJoinStyle:
new_line = TRUE;
break;
case GCCapStyle:
break;
case GCFillStyle:
new_fill = TRUE;
break;
case GCFillRule:
break;
case GCTile:
if(pGC->tileIsPixel)
break;
new_rotate = TRUE;
new_fill = TRUE;
break;
case GCStipple:
if(pGC->stipple == (PixmapPtr)NULL)
break;
new_rotate = TRUE;
new_fill = TRUE;
break;
case GCTileStipXOrigin:
new_rotate = TRUE;
break;
case GCTileStipYOrigin:
new_rotate = TRUE;
break;
case GCFont:
new_text = TRUE;
break;
case GCSubwindowMode:
break;
case GCGraphicsExposures:
break;
case GCClipXOrigin:
break;
case GCClipYOrigin:
break;
case GCClipMask:
break;
case GCDashOffset:
break;
case GCDashList:
break;
case GCArcMode:
break;
default:
break;
}
}
if(new_rotate || new_fill)
{
Bool new_pix = FALSE;
xrot = pGC->patOrg.x;
yrot = pGC->patOrg.y;
xrot += pDrawable->x;
yrot += pDrawable->y;
switch (pGC->fillStyle)
{
case FillTiled:
if (!pGC->tileIsPixel && (pGC->tile.pixmap->drawable.width <= PPW) &&
!(pGC->tile.pixmap->drawable.width & (pGC->tile.pixmap->drawable.width - 1)))
{
mfbCopyRotatePixmap(pGC->tile.pixmap,
&pGC->pRotatedPixmap, xrot, yrot);
new_pix = TRUE;
}
break;
case FillStippled:
case FillOpaqueStippled:
if (pGC->stipple && (pGC->stipple->drawable.width <= PPW) &&
!(pGC->stipple->drawable.width & (pGC->stipple->drawable.width - 1)))
{
mfbCopyRotatePixmap(pGC->stipple,
&pGC->pRotatedPixmap, xrot, yrot);
new_pix = TRUE;
}
}
if (!new_pix && pGC->pRotatedPixmap)
{
(*pDrawable->pScreen->DestroyPixmap)(pGC->pRotatedPixmap);
pGC->pRotatedPixmap = (PixmapPtr)NULL;
}
}
if (!changes)
return;
if (new_rrop || new_fill)
{
rrop = mfbReduceRop(pGC->alu, pGC->fgPixel);
devPriv->rop = rrop;
new_fill = TRUE;
if (pGC->fillStyle == FillTiled)
devPriv->ropFillArea = pGC->alu;
else
devPriv->ropFillArea = rrop;
if (pGC->fillStyle == FillOpaqueStippled)
{
if ((pGC->fgPixel & 1) != (pGC->bgPixel & 1))
{
if (pGC->fgPixel & 1)
devPriv->ropOpStip = pGC->alu;
else
devPriv->ropOpStip = InverseAlu[pGC->alu];
}
else
devPriv->ropOpStip = rrop;
devPriv->ropFillArea = devPriv->ropOpStip;
}
}
else
rrop = devPriv->rop;
if (new_line || new_fill || new_text)
{
GCOps *newops;
if ((newops = matchCommon (pGC)))
{
if (pGC->ops->devPrivate.val)
miDestroyGCOps (pGC->ops);
pGC->ops = newops;
new_line = new_fill = new_text = 0;
}
else
{
if (!pGC->ops->devPrivate.val)
{
pGC->ops = miCreateGCOps (pGC->ops);
pGC->ops->devPrivate.val = 1;
}
}
}
if (new_line || new_fill)
{
if (pGC->lineWidth == 0)
{
if ((pGC->lineStyle == LineSolid) && (pGC->fillStyle == FillSolid)
&& ((rrop == RROP_WHITE) || (rrop == RROP_BLACK)))
pGC->ops->PolyArc = mfbZeroPolyArcSS;
else
pGC->ops->PolyArc = miZeroPolyArc;
}
else
pGC->ops->PolyArc = miPolyArc;
if (pGC->lineStyle == LineSolid)
{
if(pGC->lineWidth == 0)
{
if (pGC->fillStyle == FillSolid)
{
pGC->ops->PolySegment = mfbSegmentSS;
pGC->ops->Polylines = mfbLineSS;
}
else
{
pGC->ops->PolySegment = miPolySegment;
pGC->ops->Polylines = miZeroLine;
}
}
else
{
pGC->ops->PolySegment = miPolySegment;
pGC->ops->Polylines = miWideLine;
}
}
else
{
if(pGC->lineWidth == 0 && pGC->fillStyle == FillSolid)
{
pGC->ops->Polylines = mfbLineSD;
pGC->ops->PolySegment = mfbSegmentSD;
}
else
{
pGC->ops->Polylines = miWideDash;
pGC->ops->PolySegment = miPolySegment;
}
}
}
if (new_text || new_fill)
{
if ((pGC->font) &&
(FONTMAXBOUNDS(pGC->font,rightSideBearing) -
FONTMINBOUNDS(pGC->font,leftSideBearing) > 32 ||
FONTMINBOUNDS(pGC->font,characterWidth) < 0))
{
pGC->ops->PolyGlyphBlt = miPolyGlyphBlt;
pGC->ops->ImageGlyphBlt = miImageGlyphBlt;
}
else
{
if ((pGC->font) &&
TERMINALFONT(pGC->font) &&
((pGC->fgPixel & 1) != (pGC->bgPixel & 1)))
{
if (pGC->fgPixel & 1)
pGC->ops->ImageGlyphBlt = mfbTEGlyphBltWhite;
else
pGC->ops->ImageGlyphBlt = mfbTEGlyphBltBlack;
}
else
{
if (pGC->fgPixel & 1)
pGC->ops->ImageGlyphBlt = mfbImageGlyphBltWhite;
else
pGC->ops->ImageGlyphBlt = mfbImageGlyphBltBlack;
}
if (pGC->fillStyle == FillSolid ||
(pGC->fillStyle == FillOpaqueStippled &&
(pGC->fgPixel & 1) == (pGC->bgPixel & 1)
)
)
{
if (rrop == RROP_WHITE)
pGC->ops->PolyGlyphBlt = mfbPolyGlyphBltWhite;
else if (rrop == RROP_BLACK)
pGC->ops->PolyGlyphBlt = mfbPolyGlyphBltBlack;
else if (rrop == RROP_INVERT)
pGC->ops->PolyGlyphBlt = mfbPolyGlyphBltInvert;
else
pGC->ops->PolyGlyphBlt = mfbPolyGlyphBltNoop;
}
else
{
pGC->ops->PolyGlyphBlt = miPolyGlyphBlt;
}
}
}
if (new_fill)
{
pGC->ops->PushPixels = mfbPushPixels;
pGC->ops->FillPolygon = miFillPolygon;
if ((pGC->fillStyle == FillSolid) ||
((pGC->fillStyle == FillOpaqueStippled) &&
((pGC->fgPixel & 1) == (pGC->bgPixel & 1))))
{
pGC->ops->PushPixels = mfbSolidPP;
switch(devPriv->rop)
{
case RROP_WHITE:
pGC->ops->FillSpans = mfbWhiteSolidFS;
pGC->ops->FillPolygon = mfbFillPolyWhite;
break;
case RROP_BLACK:
pGC->ops->FillSpans = mfbBlackSolidFS;
pGC->ops->FillPolygon = mfbFillPolyBlack;
break;
case RROP_INVERT:
pGC->ops->FillSpans = mfbInvertSolidFS;
pGC->ops->FillPolygon = mfbFillPolyInvert;
break;
case RROP_NOP:
pGC->ops->FillSpans = mfbNoopFS;
pGC->ops->FillPolygon = mfbFillPolyNoop;
break;
}
}
else if (((pGC->fillStyle == FillTiled) ||
(pGC->fillStyle == FillOpaqueStippled)) &&
!pGC->pRotatedPixmap)
{
pGC->ops->FillSpans = mfbUnnaturalTileFS;
}
else if ((pGC->fillStyle == FillStippled) && !pGC->pRotatedPixmap)
{
pGC->ops->FillSpans = mfbUnnaturalStippleFS;
}
else if (pGC->fillStyle == FillStippled)
{
switch(devPriv->rop)
{
case RROP_WHITE:
pGC->ops->FillSpans = mfbWhiteStippleFS;
break;
case RROP_BLACK:
pGC->ops->FillSpans = mfbBlackStippleFS;
break;
case RROP_INVERT:
pGC->ops->FillSpans = mfbInvertStippleFS;
break;
case RROP_NOP:
pGC->ops->FillSpans = mfbNoopFS;
break;
}
}
else
{
pGC->ops->FillSpans = mfbTileFS;
}
if (pGC->fillStyle == FillSolid)
pGC->ops->PolyFillArc = mfbPolyFillArcSolid;
else
pGC->ops->PolyFillArc = miPolyFillArc;
if ((((pGC->fillStyle == FillTiled) ||
(pGC->fillStyle == FillStippled)) &&
!pGC->pRotatedPixmap) ||
((pGC->fillStyle == FillOpaqueStippled) &&
((pGC->fgPixel & 1) != (pGC->bgPixel & 1)))
)
{
pGC->ops->PolyFillRect = miPolyFillRect;
}
else
{
pGC->ops->PolyFillRect = mfbPolyFillRect;
if ((pGC->fillStyle == FillSolid) ||
((pGC->fillStyle == FillOpaqueStippled) &&
((pGC->fgPixel & 1) == (pGC->bgPixel & 1))))
{
switch(devPriv->rop)
{
case RROP_WHITE:
devPriv->FillArea = mfbSolidWhiteArea;
break;
case RROP_BLACK:
devPriv->FillArea = mfbSolidBlackArea;
break;
case RROP_INVERT:
devPriv->FillArea = mfbSolidInvertArea;
break;
case RROP_NOP:
devPriv->FillArea = (mfbFillAreaProcPtr)NoopDDA;
break;
}
}
else if (pGC->fillStyle == FillStippled)
{
switch(devPriv->rop)
{
case RROP_WHITE:
devPriv->FillArea = mfbStippleWhiteArea;
break;
case RROP_BLACK:
devPriv->FillArea = mfbStippleBlackArea;
break;
case RROP_INVERT:
devPriv->FillArea = mfbStippleInvertArea;
break;
case RROP_NOP:
devPriv->FillArea = (mfbFillAreaProcPtr)NoopDDA;
break;
}
}
else
{
switch (pGC->alu)
{
case GXcopy:
devPriv->FillArea = mfbTileAreaPPWCopy;
break;
default:
devPriv->FillArea = mfbTileAreaPPWGeneral;
break;
}
}
}
}
}
int InverseAlu[16] = {
GXclear,
GXandInverted,
GXnor,
GXcopyInverted,
GXand,
GXnoop,
GXequiv,
GXorInverted,
GXandReverse,
GXxor,
GXinvert,
GXnand,
GXcopy,
GXor,
GXorReverse,
GXset
};
int mfbGetInverseAlu(i)
int i;
{
return InverseAlu[i];
}
int
mfbReduceRop(alu, src)
register int alu;
register Pixel src;
{
int rop = 0;
if ((src & 1) == 0)
{
switch(alu)
{
case GXclear:
rop = RROP_BLACK;
break;
case GXand:
rop = RROP_BLACK;
break;
case GXandReverse:
rop = RROP_BLACK;
break;
case GXcopy:
rop = RROP_BLACK;
break;
case GXandInverted:
rop = RROP_NOP;
break;
case GXnoop:
rop = RROP_NOP;
break;
case GXxor:
rop = RROP_NOP;
break;
case GXor:
rop = RROP_NOP;
break;
case GXnor:
rop = RROP_INVERT;
break;
case GXequiv:
rop = RROP_INVERT;
break;
case GXinvert:
rop = RROP_INVERT;
break;
case GXorReverse:
rop = RROP_INVERT;
break;
case GXcopyInverted:
rop = RROP_WHITE;
break;
case GXorInverted:
rop = RROP_WHITE;
break;
case GXnand:
rop = RROP_WHITE;
break;
case GXset:
rop = RROP_WHITE;
break;
}
}
else
{
switch(alu)
{
case GXclear:
rop = RROP_BLACK;
break;
case GXand:
rop = RROP_NOP;
break;
case GXandReverse:
rop = RROP_INVERT;
break;
case GXcopy:
rop = RROP_WHITE;
break;
case GXandInverted:
rop = RROP_BLACK;
break;
case GXnoop:
rop = RROP_NOP;
break;
case GXxor:
rop = RROP_INVERT;
break;
case GXor:
rop = RROP_WHITE;
break;
case GXnor:
rop = RROP_BLACK;
break;
case GXequiv:
rop = RROP_NOP;
break;
case GXinvert:
rop = RROP_INVERT;
break;
case GXorReverse:
rop = RROP_WHITE;
break;
case GXcopyInverted:
rop = RROP_BLACK;
break;
case GXorInverted:
rop = RROP_NOP;
break;
case GXnand:
rop = RROP_INVERT;
break;
case GXset:
rop = RROP_WHITE;
break;
}
}
return rop;
}