/* Copyright (c) 1999 - The XFree86 Project Inc. Written by Mark Vojkovich */ #ifdef HAVE_XORG_CONFIG_H #include #endif #include "misc.h" #include "xf86.h" #include "xf86_OSproc.h" #include #include "scrnintstr.h" #include "pixmapstr.h" #include "windowstr.h" #include "xf86str.h" #include "mi.h" #include "miline.h" #include "xaa.h" #include "xaalocal.h" #include "xaawrap.h" #include "servermd.h" /* Screen funcs */ static void XAAOverCopyWindow(WindowPtr, DDXPointRec, RegionPtr); static void XAAOverPaintWindow(WindowPtr, RegionPtr, int); static void XAAOverWindowExposures(WindowPtr, RegionPtr, RegionPtr); static int XAAOverStippledFillChooser(GCPtr); static int XAAOverOpaqueStippledFillChooser(GCPtr); static int XAAOverTiledFillChooser(GCPtr); /* GC funcs */ static RegionPtr XAAOverCopyArea(DrawablePtr, DrawablePtr, GC *, int, int, int, int, int, int); static RegionPtr XAAOverCopyPlane(DrawablePtr, DrawablePtr, GCPtr, int, int, int, int, int, int, unsigned long); static void XAAOverPushPixelsSolid(GCPtr, PixmapPtr, DrawablePtr, int, int, int, int); static void XAAOverPolyFillRectSolid(DrawablePtr, GCPtr, int, xRectangle*); static void XAAOverPolyFillRectStippled(DrawablePtr, GCPtr, int, xRectangle*); static void XAAOverPolyFillRectOpaqueStippled(DrawablePtr, GCPtr, int, xRectangle*); static void XAAOverPolyFillRectTiled(DrawablePtr, GCPtr, int, xRectangle*); static void XAAOverFillSpansSolid(DrawablePtr, GCPtr, int, DDXPointPtr, int*, int); static void XAAOverFillSpansStippled(DrawablePtr, GCPtr, int, DDXPointPtr, int*, int); static void XAAOverFillSpansOpaqueStippled(DrawablePtr, GCPtr, int, DDXPointPtr, int*, int); static void XAAOverFillSpansTiled(DrawablePtr, GCPtr, int, DDXPointPtr, int*, int); static int XAAOverPolyText8TE(DrawablePtr, GCPtr, int, int, int, char *); static int XAAOverPolyText16TE(DrawablePtr, GCPtr, int, int, int, unsigned short*); static void XAAOverImageText8TE(DrawablePtr, GCPtr, int, int, int, char*); static void XAAOverImageText16TE(DrawablePtr, GCPtr, int, int, int, unsigned short*); static void XAAOverImageGlyphBltTE(DrawablePtr, GCPtr, int, int, unsigned int, CharInfoPtr*, pointer); static void XAAOverPolyGlyphBltTE(DrawablePtr, GCPtr, int, int, unsigned int, CharInfoPtr*, pointer); static int XAAOverPolyText8NonTE(DrawablePtr, GCPtr, int, int, int, char*); static int XAAOverPolyText16NonTE(DrawablePtr, GCPtr, int, int, int, unsigned short*); static void XAAOverImageText8NonTE(DrawablePtr, GCPtr, int, int, int, char*); static void XAAOverImageText16NonTE(DrawablePtr, GCPtr, int, int, int, unsigned short*); static void XAAOverImageGlyphBltNonTE(DrawablePtr, GCPtr, int, int, unsigned int, CharInfoPtr *, pointer); static void XAAOverPolyGlyphBltNonTE(DrawablePtr, GCPtr, int, int, unsigned int, CharInfoPtr *, pointer); static void XAAOverPolyRectangleThinSolid(DrawablePtr, GCPtr, int, xRectangle*); static void XAAOverPolylinesWideSolid(DrawablePtr, GCPtr, int, int, DDXPointPtr); static void XAAOverPolylinesThinSolid(DrawablePtr, GCPtr, int, int, DDXPointPtr); static void XAAOverPolySegmentThinSolid(DrawablePtr, GCPtr, int, xSegment*); static void XAAOverPolylinesThinDashed(DrawablePtr, GCPtr, int, int, DDXPointPtr); static void XAAOverPolySegmentThinDashed(DrawablePtr, GCPtr, int, xSegment*); static void XAAOverFillPolygonSolid(DrawablePtr, GCPtr, int, int, int, DDXPointPtr); static void XAAOverFillPolygonStippled(DrawablePtr, GCPtr, int, int, int, DDXPointPtr); static void XAAOverFillPolygonOpaqueStippled(DrawablePtr, GCPtr, int, int, int, DDXPointPtr); static void XAAOverFillPolygonTiled(DrawablePtr, GCPtr, int, int, int, DDXPointPtr); static void XAAOverPolyFillArcSolid(DrawablePtr, GCPtr, int, xArc*); static void XAAOverPutImage(DrawablePtr, GCPtr, int, int, int, int, int, int, int, char*); typedef struct { ScrnInfoPtr pScrn; DepthChangeFuncPtr callback; int currentDepth; /* GC funcs */ RegionPtr (*CopyArea)(DrawablePtr, DrawablePtr, GC *, int, int, int, int, int, int); RegionPtr (*CopyPlane)(DrawablePtr, DrawablePtr, GCPtr, int, int, int, int, int, int, unsigned long); void (*PushPixelsSolid)(GCPtr, PixmapPtr, DrawablePtr, int, int, int, int); void (*PolyFillRectSolid)(DrawablePtr, GCPtr, int, xRectangle*); void (*PolyFillRectStippled)(DrawablePtr, GCPtr, int, xRectangle*); void (*PolyFillRectOpaqueStippled)(DrawablePtr, GCPtr, int, xRectangle*); void (*PolyFillRectTiled)(DrawablePtr, GCPtr, int, xRectangle*); void (*FillSpansSolid)(DrawablePtr, GCPtr, int, DDXPointPtr, int*, int); void (*FillSpansStippled)(DrawablePtr, GCPtr, int, DDXPointPtr, int*, int); void (*FillSpansOpaqueStippled)(DrawablePtr,GCPtr,int,DDXPointPtr,int*,int); void (*FillSpansTiled)(DrawablePtr, GCPtr, int, DDXPointPtr, int*, int); int (*PolyText8TE)(DrawablePtr, GCPtr, int, int, int, char *); int (*PolyText16TE)(DrawablePtr, GCPtr, int, int, int, unsigned short*); void (*ImageText8TE)(DrawablePtr, GCPtr, int, int, int, char*); void (*ImageText16TE)(DrawablePtr, GCPtr, int, int, int, unsigned short*); void (*ImageGlyphBltTE)(DrawablePtr, GCPtr, int, int, unsigned int, CharInfoPtr*, pointer); void (*PolyGlyphBltTE)(DrawablePtr, GCPtr, int, int, unsigned int, CharInfoPtr*, pointer); int (*PolyText8NonTE)(DrawablePtr, GCPtr, int, int, int, char*); int (*PolyText16NonTE)(DrawablePtr, GCPtr, int, int, int, unsigned short*); void (*ImageText8NonTE)(DrawablePtr, GCPtr, int, int, int, char*); void (*ImageText16NonTE)(DrawablePtr, GCPtr, int, int, int, unsigned short*); void (*ImageGlyphBltNonTE)(DrawablePtr, GCPtr, int, int, unsigned int, CharInfoPtr *, pointer); void (*PolyGlyphBltNonTE)(DrawablePtr, GCPtr, int, int, unsigned int, CharInfoPtr *, pointer); void (*PolyRectangleThinSolid)(DrawablePtr, GCPtr, int, xRectangle*); void (*PolylinesWideSolid)(DrawablePtr, GCPtr, int, int, DDXPointPtr); void (*PolylinesThinSolid)(DrawablePtr, GCPtr, int, int, DDXPointPtr); void (*PolySegmentThinSolid)(DrawablePtr, GCPtr, int, xSegment*); void (*PolylinesThinDashed)(DrawablePtr, GCPtr, int, int, DDXPointPtr); void (*PolySegmentThinDashed)(DrawablePtr, GCPtr, int, xSegment*); void (*FillPolygonSolid)(DrawablePtr, GCPtr, int, int, int, DDXPointPtr); void (*FillPolygonStippled)(DrawablePtr, GCPtr, int, int, int, DDXPointPtr); void (*FillPolygonOpaqueStippled)(DrawablePtr, GCPtr, int, int, int, DDXPointPtr); void (*FillPolygonTiled)(DrawablePtr, GCPtr, int, int, int, DDXPointPtr); void (*PolyFillArcSolid)(DrawablePtr, GCPtr, int, xArc*); void (*PutImage)(DrawablePtr, GCPtr, int, int, int, int, int, int, int, char*); int (*StippledFillChooser)(GCPtr); int (*OpaqueStippledFillChooser)(GCPtr); int (*TiledFillChooser)(GCPtr); } XAAOverlayRec, *XAAOverlayPtr; static DevPrivateKey XAAOverlayKey = &XAAOverlayKey; #define GET_OVERLAY_PRIV(pScreen) \ (XAAOverlayPtr)dixLookupPrivate(&(pScreen)->devPrivates, XAAOverlayKey) #define SWITCH_DEPTH(d) \ if(pOverPriv->currentDepth != d) { \ (*pOverPriv->callback)(pOverPriv->pScrn, d); \ pOverPriv->currentDepth = d; \ } Bool XAAInitDualFramebufferOverlay( ScreenPtr pScreen, DepthChangeFuncPtr callback ){ ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_SCREEN(pScreen); XAAOverlayPtr pOverPriv; if(!(pOverPriv = xalloc(sizeof(XAAOverlayRec)))) return FALSE; dixSetPrivate(&pScreen->devPrivates, XAAOverlayKey, pOverPriv); pOverPriv->pScrn = pScrn; pOverPriv->callback = callback; pOverPriv->currentDepth = -1; /* Overwrite key screen functions. The XAA core will clean up */ pScreen->CopyWindow = XAAOverCopyWindow; pScreen->PaintWindowBackground = XAAOverPaintWindow; pScreen->PaintWindowBorder = XAAOverPaintWindow; pScreen->WindowExposures = XAAOverWindowExposures; pOverPriv->StippledFillChooser = infoRec->StippledFillChooser; pOverPriv->OpaqueStippledFillChooser = infoRec->OpaqueStippledFillChooser; pOverPriv->TiledFillChooser = infoRec->TiledFillChooser; infoRec->StippledFillChooser = XAAOverStippledFillChooser; infoRec->OpaqueStippledFillChooser = XAAOverOpaqueStippledFillChooser; infoRec->TiledFillChooser = XAAOverTiledFillChooser; /* wrap all XAA GC rendering */ pOverPriv->CopyArea = infoRec->CopyArea; pOverPriv->CopyPlane = infoRec->CopyPlane; pOverPriv->PushPixelsSolid = infoRec->PushPixelsSolid; pOverPriv->PolyFillRectSolid = infoRec->PolyFillRectSolid; pOverPriv->PolyFillRectStippled = infoRec->PolyFillRectStippled; pOverPriv->PolyFillRectOpaqueStippled = infoRec->PolyFillRectOpaqueStippled; pOverPriv->PolyFillRectTiled = infoRec->PolyFillRectTiled; pOverPriv->FillSpansSolid = infoRec->FillSpansSolid; pOverPriv->FillSpansStippled = infoRec->FillSpansStippled; pOverPriv->FillSpansOpaqueStippled = infoRec->FillSpansOpaqueStippled; pOverPriv->FillSpansTiled = infoRec->FillSpansTiled; pOverPriv->PolyText8TE = infoRec->PolyText8TE; pOverPriv->PolyText16TE = infoRec->PolyText16TE; pOverPriv->ImageText8TE = infoRec->ImageText8TE; pOverPriv->ImageText16TE = infoRec->ImageText16TE; pOverPriv->ImageGlyphBltTE = infoRec->ImageGlyphBltTE; pOverPriv->PolyGlyphBltTE = infoRec->PolyGlyphBltTE; pOverPriv->PolyText8NonTE = infoRec->PolyText8NonTE; pOverPriv->PolyText16NonTE = infoRec->PolyText16NonTE; pOverPriv->ImageText8NonTE = infoRec->ImageText8NonTE; pOverPriv->ImageText16NonTE = infoRec->ImageText16NonTE; pOverPriv->ImageGlyphBltNonTE = infoRec->ImageGlyphBltNonTE; pOverPriv->PolyGlyphBltNonTE = infoRec->PolyGlyphBltNonTE; pOverPriv->PolyRectangleThinSolid = infoRec->PolyRectangleThinSolid; pOverPriv->PolylinesWideSolid = infoRec->PolylinesWideSolid; pOverPriv->PolylinesThinSolid = infoRec->PolylinesThinSolid; pOverPriv->PolySegmentThinSolid = infoRec->PolySegmentThinSolid; pOverPriv->PolylinesThinDashed = infoRec->PolylinesThinDashed; pOverPriv->PolySegmentThinDashed = infoRec->PolySegmentThinDashed; pOverPriv->FillPolygonSolid = infoRec->FillPolygonSolid; pOverPriv->FillPolygonStippled = infoRec->FillPolygonStippled; pOverPriv->FillPolygonOpaqueStippled = infoRec->FillPolygonOpaqueStippled; pOverPriv->FillPolygonTiled = infoRec->FillPolygonTiled; pOverPriv->PolyFillArcSolid = infoRec->PolyFillArcSolid; pOverPriv->PutImage = infoRec->PutImage; if(infoRec->CopyArea) infoRec->CopyArea = XAAOverCopyArea; if(infoRec->CopyPlane) infoRec->CopyPlane = XAAOverCopyPlane; if(infoRec->PushPixelsSolid) infoRec->PushPixelsSolid = XAAOverPushPixelsSolid; if(infoRec->PolyFillRectSolid) infoRec->PolyFillRectSolid = XAAOverPolyFillRectSolid; if(infoRec->PolyFillRectStippled) infoRec->PolyFillRectStippled = XAAOverPolyFillRectStippled; if(infoRec->PolyFillRectOpaqueStippled) infoRec->PolyFillRectOpaqueStippled = XAAOverPolyFillRectOpaqueStippled; if(infoRec->PolyFillRectTiled) infoRec->PolyFillRectTiled = XAAOverPolyFillRectTiled; if(infoRec->FillSpansSolid) infoRec->FillSpansSolid = XAAOverFillSpansSolid; if(infoRec->FillSpansStippled) infoRec->FillSpansStippled = XAAOverFillSpansStippled; if(infoRec->FillSpansOpaqueStippled) infoRec->FillSpansOpaqueStippled = XAAOverFillSpansOpaqueStippled; if(infoRec->FillSpansTiled) infoRec->FillSpansTiled = XAAOverFillSpansTiled; if(infoRec->PolyText8TE) infoRec->PolyText8TE = XAAOverPolyText8TE; if(infoRec->PolyText16TE) infoRec->PolyText16TE = XAAOverPolyText16TE; if(infoRec->ImageText8TE) infoRec->ImageText8TE = XAAOverImageText8TE; if(infoRec->ImageText16TE) infoRec->ImageText16TE = XAAOverImageText16TE; if(infoRec->ImageGlyphBltTE) infoRec->ImageGlyphBltTE = XAAOverImageGlyphBltTE; if(infoRec->PolyGlyphBltTE) infoRec->PolyGlyphBltTE = XAAOverPolyGlyphBltTE; if(infoRec->PolyText8NonTE) infoRec->PolyText8NonTE = XAAOverPolyText8NonTE; if(infoRec->PolyText16NonTE) infoRec->PolyText16NonTE = XAAOverPolyText16NonTE; if(infoRec->ImageText8NonTE) infoRec->ImageText8NonTE = XAAOverImageText8NonTE; if(infoRec->ImageText16NonTE) infoRec->ImageText16NonTE = XAAOverImageText16NonTE; if(infoRec->ImageGlyphBltNonTE) infoRec->ImageGlyphBltNonTE = XAAOverImageGlyphBltNonTE; if(infoRec->PolyGlyphBltNonTE) infoRec->PolyGlyphBltNonTE = XAAOverPolyGlyphBltNonTE; if(infoRec->PolyRectangleThinSolid) infoRec->PolyRectangleThinSolid = XAAOverPolyRectangleThinSolid; if(infoRec->PolylinesWideSolid) infoRec->PolylinesWideSolid = XAAOverPolylinesWideSolid; if(infoRec->PolylinesThinSolid) infoRec->PolylinesThinSolid = XAAOverPolylinesThinSolid; if(infoRec->PolySegmentThinSolid) infoRec->PolySegmentThinSolid = XAAOverPolySegmentThinSolid; if(infoRec->PolylinesThinDashed) infoRec->PolylinesThinDashed = XAAOverPolylinesThinDashed; if(infoRec->PolySegmentThinDashed) infoRec->PolySegmentThinDashed = XAAOverPolySegmentThinDashed; if(infoRec->FillPolygonSolid) infoRec->FillPolygonSolid = XAAOverFillPolygonSolid; if(infoRec->FillPolygonStippled) infoRec->FillPolygonStippled = XAAOverFillPolygonStippled; if(infoRec->FillPolygonOpaqueStippled) infoRec->FillPolygonOpaqueStippled = XAAOverFillPolygonOpaqueStippled; if(infoRec->FillPolygonTiled) infoRec->FillPolygonTiled = XAAOverFillPolygonTiled; if(infoRec->PolyFillArcSolid) infoRec->PolyFillArcSolid = XAAOverPolyFillArcSolid; if(infoRec->PutImage) infoRec->PutImage = XAAOverPutImage; return TRUE; } /*********************** Screen functions ************************/ void XAAOverCopyWindow( WindowPtr pWin, DDXPointRec ptOldOrg, RegionPtr prgnSrc ){ ScreenPtr pScreen = pWin->drawable.pScreen; XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_SCREEN(pScreen); XAAOverlayPtr pOverPriv = GET_OVERLAY_PRIV(pScreen); ScrnInfoPtr pScrn = infoRec->pScrn; DDXPointPtr ppt, pptSrc; RegionRec rgnDst; BoxPtr pbox; int i, nbox, dx, dy; WindowPtr pRoot = WindowTable[pScreen->myNum]; if (!pScrn->vtSema || !infoRec->ScreenToScreenBitBlt) { XAA_SCREEN_PROLOGUE (pScreen, CopyWindow); if(pScrn->vtSema && infoRec->NeedToSync) { (*infoRec->Sync)(pScrn); infoRec->NeedToSync = FALSE; } (*pScreen->CopyWindow) (pWin, ptOldOrg, prgnSrc); XAA_SCREEN_EPILOGUE (pScreen, CopyWindow, XAAOverCopyWindow); return; } infoRec->ScratchGC.alu = GXcopy; infoRec->ScratchGC.planemask = ~0; REGION_NULL(pScreen, &rgnDst); dx = ptOldOrg.x - pWin->drawable.x; dy = ptOldOrg.y - pWin->drawable.y; REGION_TRANSLATE(pScreen, prgnSrc, -dx, -dy); REGION_INTERSECT(pScreen, &rgnDst, &pWin->borderClip, prgnSrc); nbox = REGION_NUM_RECTS(&rgnDst); if(nbox && (pptSrc = (DDXPointPtr )ALLOCATE_LOCAL(nbox * sizeof(DDXPointRec)))) { pbox = REGION_RECTS(&rgnDst); for (i = nbox, ppt = pptSrc; i--; ppt++, pbox++) { ppt->x = pbox->x1 + dx; ppt->y = pbox->y1 + dy; } SWITCH_DEPTH(8); XAADoBitBlt((DrawablePtr)pRoot, (DrawablePtr)pRoot, &(infoRec->ScratchGC), &rgnDst, pptSrc); if(pWin->drawable.bitsPerPixel != 8) { SWITCH_DEPTH(pScrn->depth); XAADoBitBlt((DrawablePtr)pRoot, (DrawablePtr)pRoot, &(infoRec->ScratchGC), &rgnDst, pptSrc); } DEALLOCATE_LOCAL(pptSrc); } REGION_UNINIT(pScreen, &rgnDst); if(pWin->drawable.depth == 8) { REGION_NULL(pScreen, &rgnDst); miSegregateChildren(pWin, &rgnDst, pScrn->depth); if(REGION_NOTEMPTY(pScreen, &rgnDst)) { REGION_INTERSECT(pScreen, &rgnDst, &rgnDst, prgnSrc); nbox = REGION_NUM_RECTS(&rgnDst); if(nbox && (pptSrc = (DDXPointPtr )ALLOCATE_LOCAL(nbox * sizeof(DDXPointRec)))){ pbox = REGION_RECTS(&rgnDst); for (i = nbox, ppt = pptSrc; i--; ppt++, pbox++) { ppt->x = pbox->x1 + dx; ppt->y = pbox->y1 + dy; } SWITCH_DEPTH(pScrn->depth); XAADoBitBlt((DrawablePtr)pRoot, (DrawablePtr)pRoot, &(infoRec->ScratchGC), &rgnDst, pptSrc); DEALLOCATE_LOCAL(pptSrc); } } REGION_UNINIT(pScreen, &rgnDst); } } static void XAAOverPaintWindow( WindowPtr pWin, RegionPtr pRegion, int what ){ ScreenPtr pScreen = pWin->drawable.pScreen; XAAOverlayPtr pOverPriv = GET_OVERLAY_PRIV(pScreen); XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_SCREEN(pScreen); ScrnInfoPtr pScrn = infoRec->pScrn; if(pScrn->vtSema) { if(what == PW_BACKGROUND) { SWITCH_DEPTH(pWin->drawable.depth); (*infoRec->PaintWindowBackground)(pWin, pRegion, what); return; } else { if(pWin->drawable.bitsPerPixel == 8) { SWITCH_DEPTH(8); (*infoRec->PaintWindowBorder)(pWin, pRegion, what); return; } else if (infoRec->FillSolidRects) { SWITCH_DEPTH(8); (*infoRec->FillSolidRects)(pScrn, pScrn->colorKey, GXcopy, ~0, REGION_NUM_RECTS(pRegion), REGION_RECTS(pRegion)); SWITCH_DEPTH(pWin->drawable.depth); (*infoRec->PaintWindowBorder)(pWin, pRegion, what); return; } } if(infoRec->NeedToSync) { (*infoRec->Sync)(infoRec->pScrn); infoRec->NeedToSync = FALSE; } } if(what == PW_BACKGROUND) { XAA_SCREEN_PROLOGUE (pScreen, PaintWindowBackground); (*pScreen->PaintWindowBackground) (pWin, pRegion, what); XAA_SCREEN_EPILOGUE(pScreen, PaintWindowBackground, XAAOverPaintWindow); } else { XAA_SCREEN_PROLOGUE (pScreen, PaintWindowBorder); (*pScreen->PaintWindowBorder) (pWin, pRegion, what); XAA_SCREEN_EPILOGUE(pScreen, PaintWindowBorder, XAAOverPaintWindow); } } void XAAOverWindowExposures( WindowPtr pWin, RegionPtr pReg, RegionPtr pOtherReg ){ ScreenPtr pScreen = pWin->drawable.pScreen; XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_SCREEN(pScreen); if((pWin->drawable.bitsPerPixel != 8) && infoRec->pScrn->vtSema) { if(REGION_NUM_RECTS(pReg) && infoRec->FillSolidRects) { XAAOverlayPtr pOverPriv = GET_OVERLAY_PRIV(pScreen); SWITCH_DEPTH(8); (*infoRec->FillSolidRects)(infoRec->pScrn, infoRec->pScrn->colorKey, GXcopy, ~0, REGION_NUM_RECTS(pReg), REGION_RECTS(pReg)); miWindowExposures(pWin, pReg, pOtherReg); return; } else if(infoRec->NeedToSync) { (*infoRec->Sync)(infoRec->pScrn); infoRec->NeedToSync = FALSE; } } XAA_SCREEN_PROLOGUE (pScreen, WindowExposures); (*pScreen->WindowExposures) (pWin, pReg, pOtherReg); XAA_SCREEN_EPILOGUE(pScreen, WindowExposures, XAAOverWindowExposures); } /********************* Choosers *************************/ static int XAAOverStippledFillChooser(GCPtr pGC) { XAAOverlayPtr pOverPriv = GET_OVERLAY_PRIV(pGC->pScreen); int ret; ret = (*pOverPriv->StippledFillChooser)(pGC); if((pGC->depth == 8) && ((ret == DO_COLOR_8x8) || (ret == DO_CACHE_BLT))) { ret = 0; } return ret; } static int XAAOverOpaqueStippledFillChooser(GCPtr pGC) { XAAOverlayPtr pOverPriv = GET_OVERLAY_PRIV(pGC->pScreen); int ret; ret = (*pOverPriv->OpaqueStippledFillChooser)(pGC); if((pGC->depth == 8) && ((ret == DO_COLOR_8x8) || (ret == DO_CACHE_BLT))) { ret = 0; } return ret; } static int XAAOverTiledFillChooser(GCPtr pGC) { XAAOverlayPtr pOverPriv = GET_OVERLAY_PRIV(pGC->pScreen); int ret; ret = (*pOverPriv->TiledFillChooser)(pGC); if((pGC->depth == 8) && ((ret == DO_COLOR_8x8) || (ret == DO_CACHE_BLT))) { ret = 0; } return ret; } /**************************** GC Functions **************************/ static RegionPtr XAAOverCopyArea( DrawablePtr pSrc, DrawablePtr pDst, GC *pGC, int srcx, int srcy, int width, int height, int dstx, int dsty ){ XAAOverlayPtr pOverPriv = GET_OVERLAY_PRIV(pGC->pScreen); SWITCH_DEPTH(pGC->depth); return (*pOverPriv->CopyArea)(pSrc, pDst, pGC, srcx, srcy, width, height, dstx, dsty); } static RegionPtr XAAOverCopyPlane( DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC, int srcx, int srcy, int width, int height, int dstx, int dsty, unsigned long bitPlane ){ XAAOverlayPtr pOverPriv = GET_OVERLAY_PRIV(pGC->pScreen); SWITCH_DEPTH(pGC->depth); return (*pOverPriv->CopyPlane)(pSrc, pDst, pGC, srcx, srcy, width, height, dstx, dsty, bitPlane); } static void XAAOverPushPixelsSolid( GCPtr pGC, PixmapPtr pBitMap, DrawablePtr pDraw, int dx, int dy, int xOrg, int yOrg ){ XAAOverlayPtr pOverPriv = GET_OVERLAY_PRIV(pGC->pScreen); SWITCH_DEPTH(pGC->depth); (*pOverPriv->PushPixelsSolid)(pGC, pBitMap, pDraw, dx, dy, xOrg, yOrg); } static void XAAOverPolyFillRectSolid( DrawablePtr pDraw, GCPtr pGC, int nrectFill, xRectangle *prectInit ){ XAAOverlayPtr pOverPriv = GET_OVERLAY_PRIV(pGC->pScreen); SWITCH_DEPTH(pGC->depth); (*pOverPriv->PolyFillRectSolid)(pDraw, pGC, nrectFill, prectInit); } static void XAAOverPolyFillRectStippled( DrawablePtr pDraw, GCPtr pGC, int nrectFill, xRectangle *prectInit ){ XAAOverlayPtr pOverPriv = GET_OVERLAY_PRIV(pGC->pScreen); SWITCH_DEPTH(pGC->depth); (*pOverPriv->PolyFillRectStippled)(pDraw, pGC, nrectFill, prectInit); } static void XAAOverPolyFillRectOpaqueStippled( DrawablePtr pDraw, GCPtr pGC, int nrectFill, xRectangle *prectInit ){ XAAOverlayPtr pOverPriv = GET_OVERLAY_PRIV(pGC->pScreen); SWITCH_DEPTH(pGC->depth); (*pOverPriv->PolyFillRectOpaqueStippled)(pDraw, pGC, nrectFill, prectInit); } static void XAAOverPolyFillRectTiled( DrawablePtr pDraw, GCPtr pGC, int nrectFill, xRectangle *prectInit ){ XAAOverlayPtr pOverPriv = GET_OVERLAY_PRIV(pGC->pScreen); SWITCH_DEPTH(pGC->depth); (*pOverPriv->PolyFillRectTiled)(pDraw, pGC, nrectFill, prectInit); } static void XAAOverFillSpansSolid( DrawablePtr pDraw, GCPtr pGC, int nInit, DDXPointPtr ppt, int *pwidth, int fSorted ){ XAAOverlayPtr pOverPriv = GET_OVERLAY_PRIV(pGC->pScreen); SWITCH_DEPTH(pGC->depth); (*pOverPriv->FillSpansSolid)( pDraw, pGC, nInit, ppt, pwidth, fSorted); } static void XAAOverFillSpansStippled( DrawablePtr pDraw, GCPtr pGC, int nInit, DDXPointPtr ppt, int *pwidth, int fSorted ){ XAAOverlayPtr pOverPriv = GET_OVERLAY_PRIV(pGC->pScreen); SWITCH_DEPTH(pGC->depth); (*pOverPriv->FillSpansStippled)(pDraw, pGC, nInit, ppt, pwidth, fSorted); } static void XAAOverFillSpansOpaqueStippled( DrawablePtr pDraw, GCPtr pGC, int nInit, DDXPointPtr ppt, int *pwidth, int fSorted ){ XAAOverlayPtr pOverPriv = GET_OVERLAY_PRIV(pGC->pScreen); SWITCH_DEPTH(pGC->depth); (*pOverPriv->FillSpansOpaqueStippled)( pDraw, pGC, nInit, ppt, pwidth, fSorted); } static void XAAOverFillSpansTiled( DrawablePtr pDraw, GCPtr pGC, int nInit, DDXPointPtr ppt, int *pwidth, int fSorted ){ XAAOverlayPtr pOverPriv = GET_OVERLAY_PRIV(pGC->pScreen); SWITCH_DEPTH(pGC->depth); (*pOverPriv->FillSpansTiled)(pDraw, pGC, nInit, ppt, pwidth, fSorted); } static int XAAOverPolyText8TE( DrawablePtr pDraw, GCPtr pGC, int x, int y, int count, char *chars ){ XAAOverlayPtr pOverPriv = GET_OVERLAY_PRIV(pGC->pScreen); SWITCH_DEPTH(pGC->depth); return (*pOverPriv->PolyText8TE)(pDraw, pGC, x, y, count, chars); } static int XAAOverPolyText16TE( DrawablePtr pDraw, GCPtr pGC, int x, int y, int count, unsigned short *chars ){ XAAOverlayPtr pOverPriv = GET_OVERLAY_PRIV(pGC->pScreen); SWITCH_DEPTH(pGC->depth); return (*pOverPriv->PolyText16TE)(pDraw, pGC, x, y, count, chars); } static void XAAOverImageText8TE( DrawablePtr pDraw, GCPtr pGC, int x, int y, int count, char *chars ){ XAAOverlayPtr pOverPriv = GET_OVERLAY_PRIV(pGC->pScreen); SWITCH_DEPTH(pGC->depth); (*pOverPriv->ImageText8TE)(pDraw, pGC, x, y, count, chars); } static void XAAOverImageText16TE( DrawablePtr pDraw, GCPtr pGC, int x, int y, int count, unsigned short *chars ){ XAAOverlayPtr pOverPriv = GET_OVERLAY_PRIV(pGC->pScreen); SWITCH_DEPTH(pGC->depth); (*pOverPriv->ImageText16TE)(pDraw, pGC, x, y, count, chars); } static void XAAOverImageGlyphBltTE( DrawablePtr pDraw, GCPtr pGC, int xInit, int yInit, unsigned int nglyph, CharInfoPtr *ppci, pointer pglyphBase ){ XAAOverlayPtr pOverPriv = GET_OVERLAY_PRIV(pGC->pScreen); SWITCH_DEPTH(pGC->depth); (*pOverPriv->ImageGlyphBltTE)( pDraw, pGC, xInit, yInit, nglyph, ppci, pglyphBase); } static void XAAOverPolyGlyphBltTE( DrawablePtr pDraw, GCPtr pGC, int xInit, int yInit, unsigned int nglyph, CharInfoPtr *ppci, pointer pglyphBase ){ XAAOverlayPtr pOverPriv = GET_OVERLAY_PRIV(pGC->pScreen); SWITCH_DEPTH(pGC->depth); (*pOverPriv->PolyGlyphBltTE)( pDraw, pGC, xInit, yInit, nglyph, ppci, pglyphBase); } static int XAAOverPolyText8NonTE( DrawablePtr pDraw, GCPtr pGC, int x, int y, int count, char *chars ){ XAAOverlayPtr pOverPriv = GET_OVERLAY_PRIV(pGC->pScreen); SWITCH_DEPTH(pGC->depth); return (*pOverPriv->PolyText8NonTE)(pDraw, pGC, x, y, count, chars); } static int XAAOverPolyText16NonTE( DrawablePtr pDraw, GCPtr pGC, int x, int y, int count, unsigned short *chars ){ XAAOverlayPtr pOverPriv = GET_OVERLAY_PRIV(pGC->pScreen); SWITCH_DEPTH(pGC->depth); return (*pOverPriv->PolyText16NonTE)(pDraw, pGC, x, y, count, chars); } static void XAAOverImageText8NonTE( DrawablePtr pDraw, GCPtr pGC, int x, int y, int count, char *chars ){ XAAOverlayPtr pOverPriv = GET_OVERLAY_PRIV(pGC->pScreen); SWITCH_DEPTH(pGC->depth); (*pOverPriv->ImageText8NonTE)(pDraw, pGC, x, y, count, chars); } static void XAAOverImageText16NonTE( DrawablePtr pDraw, GCPtr pGC, int x, int y, int count, unsigned short *chars ){ XAAOverlayPtr pOverPriv = GET_OVERLAY_PRIV(pGC->pScreen); SWITCH_DEPTH(pGC->depth); (*pOverPriv->ImageText16NonTE)(pDraw, pGC, x, y, count, chars); } static void XAAOverImageGlyphBltNonTE( DrawablePtr pDraw, GCPtr pGC, int xInit, int yInit, unsigned int nglyph, CharInfoPtr *ppci, pointer pglyphBase ){ XAAOverlayPtr pOverPriv = GET_OVERLAY_PRIV(pGC->pScreen); SWITCH_DEPTH(pGC->depth); (*pOverPriv->ImageGlyphBltNonTE)( pDraw, pGC, xInit, yInit, nglyph, ppci, pglyphBase); } static void XAAOverPolyGlyphBltNonTE( DrawablePtr pDraw, GCPtr pGC, int xInit, int yInit, unsigned int nglyph, CharInfoPtr *ppci, pointer pglyphBase ){ XAAOverlayPtr pOverPriv = GET_OVERLAY_PRIV(pGC->pScreen); SWITCH_DEPTH(pGC->depth); (*pOverPriv->PolyGlyphBltNonTE)( pDraw, pGC, xInit, yInit, nglyph, ppci, pglyphBase); } static void XAAOverPolyRectangleThinSolid( DrawablePtr pDraw, GCPtr pGC, int nRectsInit, xRectangle *pRectsInit ){ XAAOverlayPtr pOverPriv = GET_OVERLAY_PRIV(pGC->pScreen); SWITCH_DEPTH(pGC->depth); (*pOverPriv->PolyRectangleThinSolid)(pDraw, pGC, nRectsInit, pRectsInit); } static void XAAOverPolylinesWideSolid( DrawablePtr pDraw, GCPtr pGC, int mode, int npt, DDXPointPtr pPts ){ XAAOverlayPtr pOverPriv = GET_OVERLAY_PRIV(pGC->pScreen); SWITCH_DEPTH(pGC->depth); (*pOverPriv->PolylinesWideSolid)(pDraw, pGC, mode, npt, pPts); } static void XAAOverPolylinesThinSolid( DrawablePtr pDraw, GCPtr pGC, int mode, int npt, DDXPointPtr pPts ){ XAAOverlayPtr pOverPriv = GET_OVERLAY_PRIV(pGC->pScreen); SWITCH_DEPTH(pGC->depth); (*pOverPriv->PolylinesThinSolid)(pDraw, pGC, mode, npt, pPts); } static void XAAOverPolySegmentThinSolid( DrawablePtr pDraw, GCPtr pGC, int nseg, xSegment *pSeg ){ XAAOverlayPtr pOverPriv = GET_OVERLAY_PRIV(pGC->pScreen); SWITCH_DEPTH(pGC->depth); (*pOverPriv->PolySegmentThinSolid)(pDraw, pGC, nseg, pSeg); } static void XAAOverPolylinesThinDashed( DrawablePtr pDraw, GCPtr pGC, int mode, int npt, DDXPointPtr pPts ){ XAAOverlayPtr pOverPriv = GET_OVERLAY_PRIV(pGC->pScreen); SWITCH_DEPTH(pGC->depth); (*pOverPriv->PolylinesThinDashed)(pDraw, pGC, mode, npt, pPts); } static void XAAOverPolySegmentThinDashed( DrawablePtr pDraw, GCPtr pGC, int nseg, xSegment *pSeg ){ XAAOverlayPtr pOverPriv = GET_OVERLAY_PRIV(pGC->pScreen); SWITCH_DEPTH(pGC->depth); (*pOverPriv->PolySegmentThinDashed)(pDraw, pGC, nseg, pSeg); } static void XAAOverFillPolygonSolid( DrawablePtr pDraw, GCPtr pGC, int shape, int mode, int count, DDXPointPtr ptsIn ){ XAAOverlayPtr pOverPriv = GET_OVERLAY_PRIV(pGC->pScreen); SWITCH_DEPTH(pGC->depth); (*pOverPriv->FillPolygonSolid)(pDraw, pGC, shape, mode, count, ptsIn); } static void XAAOverFillPolygonStippled( DrawablePtr pDraw, GCPtr pGC, int shape, int mode, int count, DDXPointPtr ptsIn ){ XAAOverlayPtr pOverPriv = GET_OVERLAY_PRIV(pGC->pScreen); SWITCH_DEPTH(pGC->depth); (*pOverPriv->FillPolygonStippled)(pDraw, pGC, shape, mode, count, ptsIn); } static void XAAOverFillPolygonOpaqueStippled( DrawablePtr pDraw, GCPtr pGC, int shape, int mode, int count, DDXPointPtr ptsIn ){ XAAOverlayPtr pOverPriv = GET_OVERLAY_PRIV(pGC->pScreen); SWITCH_DEPTH(pGC->depth); (*pOverPriv->FillPolygonOpaqueStippled)( pDraw, pGC, shape, mode, count, ptsIn); } static void XAAOverFillPolygonTiled( DrawablePtr pDraw, GCPtr pGC, int shape, int mode, int count, DDXPointPtr ptsIn ){ XAAOverlayPtr pOverPriv = GET_OVERLAY_PRIV(pGC->pScreen); SWITCH_DEPTH(pGC->depth); (*pOverPriv->FillPolygonTiled)(pDraw, pGC, shape, mode, count, ptsIn); } static void XAAOverPolyFillArcSolid( DrawablePtr pDraw, GCPtr pGC, int narcs, xArc *parcs ){ XAAOverlayPtr pOverPriv = GET_OVERLAY_PRIV(pGC->pScreen); SWITCH_DEPTH(pGC->depth); (*pOverPriv->PolyFillArcSolid)(pDraw, pGC, narcs, parcs); } static void XAAOverPutImage( DrawablePtr pDraw, GCPtr pGC, int depth, int x, int y, int w, int h, int leftPad, int format, char *pImage ){ XAAOverlayPtr pOverPriv = GET_OVERLAY_PRIV(pGC->pScreen); SWITCH_DEPTH(pGC->depth); (*pOverPriv->PutImage)(pDraw, pGC, depth, x, y, w, h, leftPad, format, pImage); }