/* $XFree86: xc/programs/Xserver/hw/xfree86/xaa/xaaROP.c,v 1.2 2000/09/28 20:48:01 mvojkovi Exp $ */ #include "X.h" #include "misc.h" #include "xf86.h" #include "xf86_ansic.h" #include "xf86_OSproc.h" #include "scrnintstr.h" #include "xf86str.h" #include "xaarop.h" #include "xaa.h" #include "xaalocal.h" int XAACopyROP[16] = { ROP_0, /* GXclear */ ROP_DSa, /* GXand */ ROP_SDna, /* GXandReverse */ ROP_S, /* GXcopy */ ROP_DSna, /* GXandInverted */ ROP_D, /* GXnoop */ ROP_DSx, /* GXxor */ ROP_DSo, /* GXor */ ROP_DSon, /* GXnor */ ROP_DSxn, /* GXequiv */ ROP_Dn, /* GXinvert*/ ROP_SDno, /* GXorReverse */ ROP_Sn, /* GXcopyInverted */ ROP_DSno, /* GXorInverted */ ROP_DSan, /* GXnand */ ROP_1 /* GXset */ }; int XAACopyROP_PM[16] = { ROP_0, /* not used */ ROP_DSPnoa, ROP_DPSnaon, ROP_DPSDxax, ROP_DPSana, ROP_D, /* not used */ ROP_DPSax, ROP_DPSao, ROP_DPSaon, ROP_DPSaxn, ROP_Dn, /* not used */ ROP_DPSanan, ROP_PSDPxox, /* is that correct ? */ ROP_DPSnao, ROP_DSPnoan, ROP_1 /* not used */ }; int XAAPatternROP[16]= { ROP_0, ROP_DPa, ROP_PDna, ROP_P, ROP_DPna, ROP_D, ROP_DPx, ROP_DPo, ROP_DPon, ROP_PDxn, ROP_Dn, ROP_PDno, ROP_Pn, ROP_DPno, ROP_DPan, ROP_1 }; int XAAPatternROP_PM[16] = { ROP_DPna, ROP_DPSnoa, ROP_DSPnaon, ROP_DSPDxax, ROP_DPSana, ROP_D, ROP_DPSax, ROP_DPSao, ROP_DPSaon, ROP_DPSaxn, ROP_DPx, ROP_DPSanan, ROP_SPDSxox, /* is that correct ? */ ROP_DSPnao, ROP_DPSnoan, ROP_DPo }; int XAAHelpPatternROP(ScrnInfoPtr pScrn, int *fg, int *bg, int pm, int *rop) { XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_SCRNINFOPTR(pScrn); int ret = 0; pm &= infoRec->FullPlanemasks[pScrn->depth - 1]; if(pm == infoRec->FullPlanemasks[pScrn->depth - 1]) { if(!NO_SRC_ROP(*rop)) ret |= ROP_PAT; *rop = XAAPatternROP[*rop]; } else { switch(*rop) { case GXnoop: break; case GXset: case GXclear: case GXinvert: ret |= ROP_PAT; *fg = pm; if(*bg != -1) *bg = pm; break; default: ret |= ROP_PAT | ROP_SRC; break; } *rop = XAAPatternROP_PM[*rop]; } return ret; } int XAAHelpSolidROP(ScrnInfoPtr pScrn, int *fg, int pm, int *rop) { XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_SCRNINFOPTR(pScrn); int ret = 0; pm &= infoRec->FullPlanemasks[pScrn->depth - 1]; if(pm == infoRec->FullPlanemasks[pScrn->depth - 1]) { if(!NO_SRC_ROP(*rop)) ret |= ROP_PAT; *rop = XAAPatternROP[*rop]; } else { switch(*rop) { case GXnoop: break; case GXset: case GXclear: case GXinvert: ret |= ROP_PAT; *fg = pm; break; default: ret |= ROP_PAT | ROP_SRC; break; } *rop = XAAPatternROP_PM[*rop]; } return ret; }