907 lines
32 KiB
C
907 lines
32 KiB
C
/*
|
|
Copyright (c) 1999 - The XFree86 Project Inc.
|
|
|
|
Written by Mark Vojkovich
|
|
*/
|
|
|
|
#ifdef HAVE_XORG_CONFIG_H
|
|
#include <xorg-config.h>
|
|
#endif
|
|
|
|
#include "misc.h"
|
|
#include "xf86.h"
|
|
#include "xf86_OSproc.h"
|
|
|
|
#include <X11/X.h>
|
|
#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 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 DevPrivateKeyRec XAAOverlayKeyRec;
|
|
|
|
#define XAAOverlayKey (&XAAOverlayKeyRec)
|
|
|
|
#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 (!dixRegisterPrivateKey(&XAAOverlayKeyRec, PRIVATE_SCREEN, 0))
|
|
return FALSE;
|
|
|
|
if (!(pOverPriv = malloc(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->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 = pScreen->root;
|
|
|
|
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;
|
|
|
|
RegionNull(&rgnDst);
|
|
|
|
dx = ptOldOrg.x - pWin->drawable.x;
|
|
dy = ptOldOrg.y - pWin->drawable.y;
|
|
RegionTranslate(prgnSrc, -dx, -dy);
|
|
RegionIntersect(&rgnDst, &pWin->borderClip, prgnSrc);
|
|
|
|
nbox = RegionNumRects(&rgnDst);
|
|
if (nbox && (pptSrc = (DDXPointPtr) malloc(nbox * sizeof(DDXPointRec)))) {
|
|
|
|
pbox = RegionRects(&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);
|
|
}
|
|
|
|
free(pptSrc);
|
|
}
|
|
|
|
RegionUninit(&rgnDst);
|
|
|
|
if (pWin->drawable.depth == 8) {
|
|
RegionNull(&rgnDst);
|
|
miSegregateChildren(pWin, &rgnDst, pScrn->depth);
|
|
if (RegionNotEmpty(&rgnDst)) {
|
|
RegionIntersect(&rgnDst, &rgnDst, prgnSrc);
|
|
nbox = RegionNumRects(&rgnDst);
|
|
if (nbox &&
|
|
(pptSrc = (DDXPointPtr) malloc(nbox * sizeof(DDXPointRec)))) {
|
|
|
|
pbox = RegionRects(&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);
|
|
free(pptSrc);
|
|
}
|
|
}
|
|
RegionUninit(&rgnDst);
|
|
}
|
|
}
|
|
|
|
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 (RegionNumRects(pReg) && infoRec->FillSolidRects) {
|
|
XAAOverlayPtr pOverPriv = GET_OVERLAY_PRIV(pScreen);
|
|
|
|
SWITCH_DEPTH(8);
|
|
(*infoRec->FillSolidRects) (infoRec->pScrn,
|
|
infoRec->pScrn->colorKey, GXcopy, ~0,
|
|
RegionNumRects(pReg),
|
|
RegionRects(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);
|
|
}
|