428261197a
Tested by ajacoutot@, krw@, shadchin@ and jasper@ on various configurations including multihead with both zaphod and xrandr.
1054 lines
28 KiB
C
1054 lines
28 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);
|
|
}
|
|
|