1/*
2   Copyright (c) 1999 - The XFree86 Project Inc.
3
4   Written by Mark Vojkovich
5*/
6
7
8#ifdef HAVE_XORG_CONFIG_H
9#include <xorg-config.h>
10#endif
11
12#include "misc.h"
13#include "xf86.h"
14#include "xf86_OSproc.h"
15
16#include <X11/X.h>
17#include "scrnintstr.h"
18#include "pixmapstr.h"
19#include "windowstr.h"
20#include "xf86str.h"
21#include "mi.h"
22#include "miline.h"
23#include "xaa.h"
24#include "xaalocal.h"
25#include "xaawrap.h"
26#include "servermd.h"
27
28/* Screen funcs */
29
30static void XAAOverCopyWindow(WindowPtr, DDXPointRec, RegionPtr);
31static void XAAOverWindowExposures(WindowPtr, RegionPtr, RegionPtr);
32
33static int XAAOverStippledFillChooser(GCPtr);
34static int XAAOverOpaqueStippledFillChooser(GCPtr);
35static int XAAOverTiledFillChooser(GCPtr);
36
37/* GC funcs */
38
39static RegionPtr XAAOverCopyArea(DrawablePtr, DrawablePtr, GC *,
40			int, int, int, int, int, int);
41static RegionPtr XAAOverCopyPlane(DrawablePtr, DrawablePtr, GCPtr,
42			int, int, int, int, int, int, unsigned long);
43static void XAAOverPushPixelsSolid(GCPtr, PixmapPtr, DrawablePtr, int,
44			int, int, int);
45static void XAAOverPolyFillRectSolid(DrawablePtr, GCPtr, int, xRectangle*);
46static void XAAOverPolyFillRectStippled(DrawablePtr, GCPtr, int, xRectangle*);
47static void XAAOverPolyFillRectOpaqueStippled(DrawablePtr, GCPtr,
48			int, xRectangle*);
49static void XAAOverPolyFillRectTiled(DrawablePtr, GCPtr, int, xRectangle*);
50static void XAAOverFillSpansSolid(DrawablePtr, GCPtr, int, DDXPointPtr,
51			int*, int);
52static void XAAOverFillSpansStippled(DrawablePtr, GCPtr, int, DDXPointPtr,
53			int*, int);
54static void XAAOverFillSpansOpaqueStippled(DrawablePtr, GCPtr, int,
55			DDXPointPtr, int*, int);
56static void XAAOverFillSpansTiled(DrawablePtr, GCPtr, int, DDXPointPtr,
57			int*, int);
58static int XAAOverPolyText8TE(DrawablePtr, GCPtr, int, int, int, char *);
59static int XAAOverPolyText16TE(DrawablePtr, GCPtr, int, int, int,
60			unsigned short*);
61static void XAAOverImageText8TE(DrawablePtr, GCPtr, int, int, int, char*);
62static void XAAOverImageText16TE(DrawablePtr, GCPtr, int, int, int,
63			unsigned short*);
64static void XAAOverImageGlyphBltTE(DrawablePtr, GCPtr, int, int,
65			unsigned int, CharInfoPtr*, pointer);
66static void XAAOverPolyGlyphBltTE(DrawablePtr, GCPtr, int, int,
67			unsigned int, CharInfoPtr*, pointer);
68static int XAAOverPolyText8NonTE(DrawablePtr, GCPtr, int, int, int, char*);
69static int XAAOverPolyText16NonTE(DrawablePtr, GCPtr, int, int, int,
70			unsigned short*);
71static void XAAOverImageText8NonTE(DrawablePtr, GCPtr, int, int, int, char*);
72static void XAAOverImageText16NonTE(DrawablePtr, GCPtr, int, int, int,
73			unsigned short*);
74static void XAAOverImageGlyphBltNonTE(DrawablePtr, GCPtr, int, int,
75			unsigned int, CharInfoPtr *, pointer);
76static void XAAOverPolyGlyphBltNonTE(DrawablePtr, GCPtr, int, int,
77			unsigned int, CharInfoPtr *, pointer);
78static void XAAOverPolyRectangleThinSolid(DrawablePtr, GCPtr, int, xRectangle*);
79static void XAAOverPolylinesWideSolid(DrawablePtr, GCPtr, int, int,
80			DDXPointPtr);
81static void XAAOverPolylinesThinSolid(DrawablePtr, GCPtr, int, int,
82			DDXPointPtr);
83static void XAAOverPolySegmentThinSolid(DrawablePtr, GCPtr, int, xSegment*);
84static void XAAOverPolylinesThinDashed(DrawablePtr, GCPtr, int, int,
85			DDXPointPtr);
86static void XAAOverPolySegmentThinDashed(DrawablePtr, GCPtr, int, xSegment*);
87static void XAAOverFillPolygonSolid(DrawablePtr, GCPtr, int, int, int,
88			DDXPointPtr);
89static void XAAOverFillPolygonStippled(DrawablePtr, GCPtr, int, int, int,
90			DDXPointPtr);
91static void XAAOverFillPolygonOpaqueStippled(DrawablePtr, GCPtr, int, int, int,
92			DDXPointPtr);
93static void XAAOverFillPolygonTiled(DrawablePtr, GCPtr, int, int, int,
94			DDXPointPtr);
95static void XAAOverPolyFillArcSolid(DrawablePtr, GCPtr, int, xArc*);
96static void XAAOverPutImage(DrawablePtr, GCPtr, int, int, int, int, int,
97			int, int, char*);
98
99
100typedef struct {
101   ScrnInfoPtr		pScrn;
102   DepthChangeFuncPtr	callback;
103   int			currentDepth;
104/* GC funcs */
105   RegionPtr (*CopyArea)(DrawablePtr, DrawablePtr, GC *,
106			int, int, int, int, int, int);
107   RegionPtr (*CopyPlane)(DrawablePtr, DrawablePtr, GCPtr,
108			int, int, int, int, int, int, unsigned long);
109   void (*PushPixelsSolid)(GCPtr, PixmapPtr, DrawablePtr, int, int, int, int);
110   void (*PolyFillRectSolid)(DrawablePtr, GCPtr, int, xRectangle*);
111   void (*PolyFillRectStippled)(DrawablePtr, GCPtr, int, xRectangle*);
112   void (*PolyFillRectOpaqueStippled)(DrawablePtr, GCPtr, int, xRectangle*);
113   void (*PolyFillRectTiled)(DrawablePtr, GCPtr, int, xRectangle*);
114   void (*FillSpansSolid)(DrawablePtr, GCPtr, int, DDXPointPtr, int*, int);
115   void (*FillSpansStippled)(DrawablePtr, GCPtr, int, DDXPointPtr, int*, int);
116   void (*FillSpansOpaqueStippled)(DrawablePtr,GCPtr,int,DDXPointPtr,int*,int);
117   void (*FillSpansTiled)(DrawablePtr, GCPtr, int, DDXPointPtr, int*, int);
118   int (*PolyText8TE)(DrawablePtr, GCPtr, int, int, int, char *);
119   int (*PolyText16TE)(DrawablePtr, GCPtr, int, int, int, unsigned short*);
120   void (*ImageText8TE)(DrawablePtr, GCPtr, int, int, int, char*);
121   void (*ImageText16TE)(DrawablePtr, GCPtr, int, int, int, unsigned short*);
122   void (*ImageGlyphBltTE)(DrawablePtr, GCPtr, int, int, unsigned int,
123			CharInfoPtr*, pointer);
124   void (*PolyGlyphBltTE)(DrawablePtr, GCPtr, int, int, unsigned int,
125			CharInfoPtr*, pointer);
126   int (*PolyText8NonTE)(DrawablePtr, GCPtr, int, int, int, char*);
127   int (*PolyText16NonTE)(DrawablePtr, GCPtr, int, int, int, unsigned short*);
128   void (*ImageText8NonTE)(DrawablePtr, GCPtr, int, int, int, char*);
129   void (*ImageText16NonTE)(DrawablePtr, GCPtr, int, int, int, unsigned short*);
130   void (*ImageGlyphBltNonTE)(DrawablePtr, GCPtr, int, int, unsigned int,
131			CharInfoPtr *, pointer);
132   void (*PolyGlyphBltNonTE)(DrawablePtr, GCPtr, int, int, unsigned int,
133			CharInfoPtr *, pointer);
134   void (*PolyRectangleThinSolid)(DrawablePtr, GCPtr, int, xRectangle*);
135   void (*PolylinesWideSolid)(DrawablePtr, GCPtr, int, int, DDXPointPtr);
136
137   void (*PolylinesThinSolid)(DrawablePtr, GCPtr, int, int, DDXPointPtr);
138   void (*PolySegmentThinSolid)(DrawablePtr, GCPtr, int, xSegment*);
139   void (*PolylinesThinDashed)(DrawablePtr, GCPtr, int, int, DDXPointPtr);
140   void (*PolySegmentThinDashed)(DrawablePtr, GCPtr, int, xSegment*);
141   void (*FillPolygonSolid)(DrawablePtr, GCPtr, int, int, int, DDXPointPtr);
142   void (*FillPolygonStippled)(DrawablePtr, GCPtr, int, int, int, DDXPointPtr);
143   void (*FillPolygonOpaqueStippled)(DrawablePtr, GCPtr, int, int, int,
144			DDXPointPtr);
145   void (*FillPolygonTiled)(DrawablePtr, GCPtr, int, int, int, DDXPointPtr);
146   void (*PolyFillArcSolid)(DrawablePtr, GCPtr, int, xArc*);
147   void (*PutImage)(DrawablePtr, GCPtr, int, int, int, int, int, int,
148			int, char*);
149   int (*StippledFillChooser)(GCPtr);
150   int (*OpaqueStippledFillChooser)(GCPtr);
151   int (*TiledFillChooser)(GCPtr);
152} XAAOverlayRec, *XAAOverlayPtr;
153
154static DevPrivateKeyRec XAAOverlayKeyRec;
155#define XAAOverlayKey (&XAAOverlayKeyRec)
156
157#define GET_OVERLAY_PRIV(pScreen) \
158    (XAAOverlayPtr)dixLookupPrivate(&(pScreen)->devPrivates, XAAOverlayKey)
159
160#define SWITCH_DEPTH(d) \
161   if(pOverPriv->currentDepth != d) { \
162	(*pOverPriv->callback)(pOverPriv->pScrn, d); \
163	pOverPriv->currentDepth = d; \
164   }
165
166
167Bool
168XAAInitDualFramebufferOverlay(
169    ScreenPtr pScreen,
170    DepthChangeFuncPtr callback
171){
172    ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
173    XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_SCREEN(pScreen);
174    XAAOverlayPtr pOverPriv;
175
176    if (!dixRegisterPrivateKey(&XAAOverlayKeyRec, PRIVATE_SCREEN, 0))
177	return FALSE;
178
179    if(!(pOverPriv = malloc(sizeof(XAAOverlayRec))))
180	return FALSE;
181
182    dixSetPrivate(&pScreen->devPrivates, XAAOverlayKey, pOverPriv);
183
184    pOverPriv->pScrn = pScrn;
185    pOverPriv->callback = callback;
186    pOverPriv->currentDepth = -1;
187
188    /* Overwrite key screen functions.  The XAA core will clean up */
189
190    pScreen->CopyWindow = XAAOverCopyWindow;
191    pScreen->WindowExposures = XAAOverWindowExposures;
192
193    pOverPriv->StippledFillChooser = infoRec->StippledFillChooser;
194    pOverPriv->OpaqueStippledFillChooser = infoRec->OpaqueStippledFillChooser;
195    pOverPriv->TiledFillChooser = infoRec->TiledFillChooser;
196
197    infoRec->StippledFillChooser = XAAOverStippledFillChooser;
198    infoRec->OpaqueStippledFillChooser = XAAOverOpaqueStippledFillChooser;
199    infoRec->TiledFillChooser = XAAOverTiledFillChooser;
200
201    /* wrap all XAA GC rendering */
202
203    pOverPriv->CopyArea = infoRec->CopyArea;
204    pOverPriv->CopyPlane = infoRec->CopyPlane;
205    pOverPriv->PushPixelsSolid = infoRec->PushPixelsSolid;
206    pOverPriv->PolyFillRectSolid = infoRec->PolyFillRectSolid;
207    pOverPriv->PolyFillRectStippled = infoRec->PolyFillRectStippled;
208    pOverPriv->PolyFillRectOpaqueStippled = infoRec->PolyFillRectOpaqueStippled;
209    pOverPriv->PolyFillRectTiled = infoRec->PolyFillRectTiled;
210    pOverPriv->FillSpansSolid = infoRec->FillSpansSolid;
211    pOverPriv->FillSpansStippled = infoRec->FillSpansStippled;
212    pOverPriv->FillSpansOpaqueStippled = infoRec->FillSpansOpaqueStippled;
213    pOverPriv->FillSpansTiled = infoRec->FillSpansTiled;
214    pOverPriv->PolyText8TE = infoRec->PolyText8TE;
215    pOverPriv->PolyText16TE = infoRec->PolyText16TE;
216    pOverPriv->ImageText8TE = infoRec->ImageText8TE;
217    pOverPriv->ImageText16TE = infoRec->ImageText16TE;
218    pOverPriv->ImageGlyphBltTE = infoRec->ImageGlyphBltTE;
219    pOverPriv->PolyGlyphBltTE = infoRec->PolyGlyphBltTE;
220    pOverPriv->PolyText8NonTE = infoRec->PolyText8NonTE;
221    pOverPriv->PolyText16NonTE = infoRec->PolyText16NonTE;
222    pOverPriv->ImageText8NonTE = infoRec->ImageText8NonTE;
223    pOverPriv->ImageText16NonTE = infoRec->ImageText16NonTE;
224    pOverPriv->ImageGlyphBltNonTE = infoRec->ImageGlyphBltNonTE;
225    pOverPriv->PolyGlyphBltNonTE = infoRec->PolyGlyphBltNonTE;
226    pOverPriv->PolyRectangleThinSolid = infoRec->PolyRectangleThinSolid;
227    pOverPriv->PolylinesWideSolid = infoRec->PolylinesWideSolid;
228    pOverPriv->PolylinesThinSolid = infoRec->PolylinesThinSolid;
229    pOverPriv->PolySegmentThinSolid = infoRec->PolySegmentThinSolid;
230    pOverPriv->PolylinesThinDashed = infoRec->PolylinesThinDashed;
231    pOverPriv->PolySegmentThinDashed = infoRec->PolySegmentThinDashed;
232    pOverPriv->FillPolygonSolid = infoRec->FillPolygonSolid;
233    pOverPriv->FillPolygonStippled = infoRec->FillPolygonStippled;
234    pOverPriv->FillPolygonOpaqueStippled = infoRec->FillPolygonOpaqueStippled;
235    pOverPriv->FillPolygonTiled = infoRec->FillPolygonTiled;
236    pOverPriv->PolyFillArcSolid = infoRec->PolyFillArcSolid;
237    pOverPriv->PutImage = infoRec->PutImage;
238
239
240    if(infoRec->CopyArea)
241	infoRec->CopyArea = XAAOverCopyArea;
242    if(infoRec->CopyPlane)
243	infoRec->CopyPlane = XAAOverCopyPlane;
244    if(infoRec->PushPixelsSolid)
245	infoRec->PushPixelsSolid = XAAOverPushPixelsSolid;
246    if(infoRec->PolyFillRectSolid)
247	infoRec->PolyFillRectSolid = XAAOverPolyFillRectSolid;
248    if(infoRec->PolyFillRectStippled)
249	infoRec->PolyFillRectStippled = XAAOverPolyFillRectStippled;
250    if(infoRec->PolyFillRectOpaqueStippled)
251	infoRec->PolyFillRectOpaqueStippled = XAAOverPolyFillRectOpaqueStippled;
252    if(infoRec->PolyFillRectTiled)
253	infoRec->PolyFillRectTiled = XAAOverPolyFillRectTiled;
254    if(infoRec->FillSpansSolid)
255	infoRec->FillSpansSolid = XAAOverFillSpansSolid;
256    if(infoRec->FillSpansStippled)
257	infoRec->FillSpansStippled = XAAOverFillSpansStippled;
258    if(infoRec->FillSpansOpaqueStippled)
259	infoRec->FillSpansOpaqueStippled = XAAOverFillSpansOpaqueStippled;
260    if(infoRec->FillSpansTiled)
261	infoRec->FillSpansTiled = XAAOverFillSpansTiled;
262    if(infoRec->PolyText8TE)
263	infoRec->PolyText8TE = XAAOverPolyText8TE;
264    if(infoRec->PolyText16TE)
265	infoRec->PolyText16TE = XAAOverPolyText16TE;
266    if(infoRec->ImageText8TE)
267	infoRec->ImageText8TE = XAAOverImageText8TE;
268    if(infoRec->ImageText16TE)
269	infoRec->ImageText16TE = XAAOverImageText16TE;
270    if(infoRec->ImageGlyphBltTE)
271	infoRec->ImageGlyphBltTE = XAAOverImageGlyphBltTE;
272    if(infoRec->PolyGlyphBltTE)
273	infoRec->PolyGlyphBltTE = XAAOverPolyGlyphBltTE;
274    if(infoRec->PolyText8NonTE)
275	infoRec->PolyText8NonTE = XAAOverPolyText8NonTE;
276    if(infoRec->PolyText16NonTE)
277	infoRec->PolyText16NonTE = XAAOverPolyText16NonTE;
278    if(infoRec->ImageText8NonTE)
279	infoRec->ImageText8NonTE = XAAOverImageText8NonTE;
280    if(infoRec->ImageText16NonTE)
281	infoRec->ImageText16NonTE = XAAOverImageText16NonTE;
282    if(infoRec->ImageGlyphBltNonTE)
283	infoRec->ImageGlyphBltNonTE = XAAOverImageGlyphBltNonTE;
284    if(infoRec->PolyGlyphBltNonTE)
285	infoRec->PolyGlyphBltNonTE = XAAOverPolyGlyphBltNonTE;
286    if(infoRec->PolyRectangleThinSolid)
287	infoRec->PolyRectangleThinSolid = XAAOverPolyRectangleThinSolid;
288    if(infoRec->PolylinesWideSolid)
289	infoRec->PolylinesWideSolid = XAAOverPolylinesWideSolid;
290    if(infoRec->PolylinesThinSolid)
291	infoRec->PolylinesThinSolid = XAAOverPolylinesThinSolid;
292    if(infoRec->PolySegmentThinSolid)
293	infoRec->PolySegmentThinSolid = XAAOverPolySegmentThinSolid;
294    if(infoRec->PolylinesThinDashed)
295	infoRec->PolylinesThinDashed = XAAOverPolylinesThinDashed;
296    if(infoRec->PolySegmentThinDashed)
297	infoRec->PolySegmentThinDashed = XAAOverPolySegmentThinDashed;
298    if(infoRec->FillPolygonSolid)
299	infoRec->FillPolygonSolid = XAAOverFillPolygonSolid;
300    if(infoRec->FillPolygonStippled)
301	infoRec->FillPolygonStippled = XAAOverFillPolygonStippled;
302    if(infoRec->FillPolygonOpaqueStippled)
303	infoRec->FillPolygonOpaqueStippled = XAAOverFillPolygonOpaqueStippled;
304    if(infoRec->FillPolygonTiled)
305	infoRec->FillPolygonTiled = XAAOverFillPolygonTiled;
306    if(infoRec->PolyFillArcSolid)
307	infoRec->PolyFillArcSolid = XAAOverPolyFillArcSolid;
308    if(infoRec->PutImage)
309	infoRec->PutImage = XAAOverPutImage;
310
311    return TRUE;
312}
313
314/***********************  Screen functions ************************/
315
316void
317XAAOverCopyWindow(
318    WindowPtr pWin,
319    DDXPointRec ptOldOrg,
320    RegionPtr prgnSrc
321){
322    ScreenPtr pScreen = pWin->drawable.pScreen;
323    XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_SCREEN(pScreen);
324    XAAOverlayPtr pOverPriv = GET_OVERLAY_PRIV(pScreen);
325    ScrnInfoPtr pScrn = infoRec->pScrn;
326    DDXPointPtr ppt, pptSrc;
327    RegionRec rgnDst;
328    BoxPtr pbox;
329    int i, nbox, dx, dy;
330    WindowPtr pRoot = pScreen->root;
331
332
333    if (!pScrn->vtSema || !infoRec->ScreenToScreenBitBlt) {
334	XAA_SCREEN_PROLOGUE (pScreen, CopyWindow);
335	if(pScrn->vtSema && infoRec->NeedToSync) {
336	    (*infoRec->Sync)(pScrn);
337	    infoRec->NeedToSync = FALSE;
338	}
339        (*pScreen->CopyWindow) (pWin, ptOldOrg, prgnSrc);
340	XAA_SCREEN_EPILOGUE (pScreen, CopyWindow, XAAOverCopyWindow);
341    	return;
342    }
343
344    infoRec->ScratchGC.alu = GXcopy;
345    infoRec->ScratchGC.planemask = ~0;
346
347    RegionNull(&rgnDst);
348
349    dx = ptOldOrg.x - pWin->drawable.x;
350    dy = ptOldOrg.y - pWin->drawable.y;
351    RegionTranslate(prgnSrc, -dx, -dy);
352    RegionIntersect(&rgnDst, &pWin->borderClip, prgnSrc);
353
354    nbox = RegionNumRects(&rgnDst);
355    if(nbox &&
356	(pptSrc = (DDXPointPtr )malloc(nbox * sizeof(DDXPointRec)))) {
357
358	pbox = RegionRects(&rgnDst);
359	for (i = nbox, ppt = pptSrc; i--; ppt++, pbox++) {
360	    ppt->x = pbox->x1 + dx;
361	    ppt->y = pbox->y1 + dy;
362	}
363
364	SWITCH_DEPTH(8);
365	XAADoBitBlt((DrawablePtr)pRoot, (DrawablePtr)pRoot,
366        		&(infoRec->ScratchGC), &rgnDst, pptSrc);
367
368	if(pWin->drawable.bitsPerPixel != 8) {
369	    SWITCH_DEPTH(pScrn->depth);
370	    XAADoBitBlt((DrawablePtr)pRoot, (DrawablePtr)pRoot,
371        		&(infoRec->ScratchGC), &rgnDst, pptSrc);
372	}
373
374	free(pptSrc);
375    }
376
377    RegionUninit(&rgnDst);
378
379    if(pWin->drawable.depth == 8) {
380      RegionNull(&rgnDst);
381      miSegregateChildren(pWin, &rgnDst, pScrn->depth);
382      if(RegionNotEmpty(&rgnDst)) {
383	RegionIntersect(&rgnDst, &rgnDst, prgnSrc);
384	nbox = RegionNumRects(&rgnDst);
385	if(nbox &&
386	  (pptSrc = (DDXPointPtr )malloc(nbox * sizeof(DDXPointRec)))){
387
388	    pbox = RegionRects(&rgnDst);
389	    for (i = nbox, ppt = pptSrc; i--; ppt++, pbox++) {
390		ppt->x = pbox->x1 + dx;
391		ppt->y = pbox->y1 + dy;
392	    }
393
394	    SWITCH_DEPTH(pScrn->depth);
395	    XAADoBitBlt((DrawablePtr)pRoot, (DrawablePtr)pRoot,
396        		&(infoRec->ScratchGC), &rgnDst, pptSrc);
397	    free(pptSrc);
398	}
399      }
400      RegionUninit(&rgnDst);
401    }
402}
403
404
405void
406XAAOverWindowExposures(
407   WindowPtr pWin,
408   RegionPtr pReg,
409   RegionPtr pOtherReg
410){
411    ScreenPtr pScreen = pWin->drawable.pScreen;
412    XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_SCREEN(pScreen);
413
414    if((pWin->drawable.bitsPerPixel != 8) && infoRec->pScrn->vtSema) {
415	if(RegionNumRects(pReg) && infoRec->FillSolidRects) {
416	    XAAOverlayPtr pOverPriv = GET_OVERLAY_PRIV(pScreen);
417
418	    SWITCH_DEPTH(8);
419	    (*infoRec->FillSolidRects)(infoRec->pScrn,
420		infoRec->pScrn->colorKey, GXcopy, ~0,
421			RegionNumRects(pReg), RegionRects(pReg));
422	    miWindowExposures(pWin, pReg, pOtherReg);
423	    return;
424	} else if(infoRec->NeedToSync) {
425            (*infoRec->Sync)(infoRec->pScrn);
426            infoRec->NeedToSync = FALSE;
427	}
428    }
429
430    XAA_SCREEN_PROLOGUE (pScreen, WindowExposures);
431    (*pScreen->WindowExposures) (pWin, pReg, pOtherReg);
432    XAA_SCREEN_EPILOGUE(pScreen, WindowExposures, XAAOverWindowExposures);
433}
434
435/*********************  Choosers *************************/
436
437static int
438XAAOverStippledFillChooser(GCPtr pGC)
439{
440    XAAOverlayPtr pOverPriv = GET_OVERLAY_PRIV(pGC->pScreen);
441    int ret;
442
443    ret = (*pOverPriv->StippledFillChooser)(pGC);
444
445    if((pGC->depth == 8) &&
446	((ret == DO_COLOR_8x8) || (ret == DO_CACHE_BLT))) {
447	ret = 0;
448    }
449
450    return ret;
451}
452
453static int
454XAAOverOpaqueStippledFillChooser(GCPtr pGC)
455{
456    XAAOverlayPtr pOverPriv = GET_OVERLAY_PRIV(pGC->pScreen);
457    int ret;
458
459    ret = (*pOverPriv->OpaqueStippledFillChooser)(pGC);
460
461    if((pGC->depth == 8) &&
462	((ret == DO_COLOR_8x8) || (ret == DO_CACHE_BLT))) {
463	ret = 0;
464    }
465
466    return ret;
467}
468
469static int
470XAAOverTiledFillChooser(GCPtr pGC)
471{
472    XAAOverlayPtr pOverPriv = GET_OVERLAY_PRIV(pGC->pScreen);
473    int ret;
474
475    ret = (*pOverPriv->TiledFillChooser)(pGC);
476
477    if((pGC->depth == 8) &&
478	((ret == DO_COLOR_8x8) || (ret == DO_CACHE_BLT))) {
479	ret = 0;
480    }
481
482    return ret;
483}
484
485
486/**************************** GC Functions **************************/
487
488static RegionPtr
489XAAOverCopyArea(
490   DrawablePtr pSrc,
491   DrawablePtr pDst,
492   GC *pGC,
493   int srcx, int srcy,
494   int width, int height,
495   int dstx, int dsty
496){
497    XAAOverlayPtr pOverPriv = GET_OVERLAY_PRIV(pGC->pScreen);
498
499    SWITCH_DEPTH(pGC->depth);
500
501    return (*pOverPriv->CopyArea)(pSrc, pDst,
502		pGC, srcx, srcy, width, height, dstx, dsty);
503}
504
505static RegionPtr
506XAAOverCopyPlane(
507   DrawablePtr pSrc,
508   DrawablePtr pDst,
509   GCPtr pGC,
510   int srcx, int srcy,
511   int width, int height,
512   int dstx, int dsty,
513   unsigned long bitPlane
514){
515    XAAOverlayPtr pOverPriv = GET_OVERLAY_PRIV(pGC->pScreen);
516
517    SWITCH_DEPTH(pGC->depth);
518
519    return (*pOverPriv->CopyPlane)(pSrc, pDst,
520	       pGC, srcx, srcy, width, height, dstx, dsty, bitPlane);
521
522}
523
524static void
525XAAOverPushPixelsSolid(
526   GCPtr pGC,
527   PixmapPtr pBitMap,
528   DrawablePtr pDraw,
529   int dx, int dy,
530   int xOrg, int yOrg
531){
532    XAAOverlayPtr pOverPriv = GET_OVERLAY_PRIV(pGC->pScreen);
533
534    SWITCH_DEPTH(pGC->depth);
535
536    (*pOverPriv->PushPixelsSolid)(pGC, pBitMap, pDraw, dx, dy, xOrg, yOrg);
537}
538
539
540
541static void
542XAAOverPolyFillRectSolid(
543   DrawablePtr pDraw,
544   GCPtr pGC,
545   int nrectFill,
546   xRectangle *prectInit
547){
548    XAAOverlayPtr pOverPriv = GET_OVERLAY_PRIV(pGC->pScreen);
549
550    SWITCH_DEPTH(pGC->depth);
551
552    (*pOverPriv->PolyFillRectSolid)(pDraw, pGC, nrectFill, prectInit);
553}
554
555static void
556XAAOverPolyFillRectStippled(
557   DrawablePtr pDraw,
558   GCPtr pGC,
559   int nrectFill,
560   xRectangle *prectInit
561){
562    XAAOverlayPtr pOverPriv = GET_OVERLAY_PRIV(pGC->pScreen);
563
564    SWITCH_DEPTH(pGC->depth);
565
566    (*pOverPriv->PolyFillRectStippled)(pDraw, pGC, nrectFill, prectInit);
567}
568
569
570static void
571XAAOverPolyFillRectOpaqueStippled(
572   DrawablePtr pDraw,
573   GCPtr pGC,
574   int nrectFill,
575   xRectangle *prectInit
576){
577    XAAOverlayPtr pOverPriv = GET_OVERLAY_PRIV(pGC->pScreen);
578
579    SWITCH_DEPTH(pGC->depth);
580
581    (*pOverPriv->PolyFillRectOpaqueStippled)(pDraw, pGC, nrectFill, prectInit);
582}
583
584static void
585XAAOverPolyFillRectTiled(
586   DrawablePtr pDraw,
587   GCPtr pGC,
588   int nrectFill,
589   xRectangle *prectInit
590){
591    XAAOverlayPtr pOverPriv = GET_OVERLAY_PRIV(pGC->pScreen);
592
593    SWITCH_DEPTH(pGC->depth);
594
595    (*pOverPriv->PolyFillRectTiled)(pDraw, pGC, nrectFill, prectInit);
596}
597
598
599static void
600XAAOverFillSpansSolid(
601   DrawablePtr	pDraw,
602   GCPtr	pGC,
603   int		nInit,
604   DDXPointPtr 	ppt,
605   int		*pwidth,
606   int		fSorted
607){
608    XAAOverlayPtr pOverPriv = GET_OVERLAY_PRIV(pGC->pScreen);
609
610    SWITCH_DEPTH(pGC->depth);
611
612    (*pOverPriv->FillSpansSolid)(
613		pDraw, pGC, nInit, ppt, pwidth, fSorted);
614}
615
616
617static void
618XAAOverFillSpansStippled(
619   DrawablePtr	pDraw,
620   GCPtr	pGC,
621   int		nInit,
622   DDXPointPtr 	ppt,
623   int		*pwidth,
624   int		fSorted
625){
626    XAAOverlayPtr pOverPriv = GET_OVERLAY_PRIV(pGC->pScreen);
627
628    SWITCH_DEPTH(pGC->depth);
629
630    (*pOverPriv->FillSpansStippled)(pDraw, pGC, nInit, ppt, pwidth, fSorted);
631}
632
633static void
634XAAOverFillSpansOpaqueStippled(
635   DrawablePtr	pDraw,
636   GCPtr	pGC,
637   int		nInit,
638   DDXPointPtr 	ppt,
639   int		*pwidth,
640   int		fSorted
641){
642    XAAOverlayPtr pOverPriv = GET_OVERLAY_PRIV(pGC->pScreen);
643
644    SWITCH_DEPTH(pGC->depth);
645
646    (*pOverPriv->FillSpansOpaqueStippled)(
647		pDraw, pGC, nInit, ppt, pwidth, fSorted);
648}
649
650
651static void
652XAAOverFillSpansTiled(
653   DrawablePtr	pDraw,
654   GCPtr	pGC,
655   int		nInit,
656   DDXPointPtr 	ppt,
657   int		*pwidth,
658   int		fSorted
659){
660    XAAOverlayPtr pOverPriv = GET_OVERLAY_PRIV(pGC->pScreen);
661
662    SWITCH_DEPTH(pGC->depth);
663
664    (*pOverPriv->FillSpansTiled)(pDraw, pGC, nInit, ppt, pwidth, fSorted);
665}
666
667static int
668XAAOverPolyText8TE(
669   DrawablePtr pDraw,
670   GCPtr pGC,
671   int x, int y,
672   int count,
673   char *chars
674){
675    XAAOverlayPtr pOverPriv = GET_OVERLAY_PRIV(pGC->pScreen);
676
677    SWITCH_DEPTH(pGC->depth);
678
679    return (*pOverPriv->PolyText8TE)(pDraw, pGC, x, y, count, chars);
680}
681
682
683static int
684XAAOverPolyText16TE(
685   DrawablePtr pDraw,
686   GCPtr pGC,
687   int x, int y,
688   int count,
689   unsigned short *chars
690){
691    XAAOverlayPtr pOverPriv = GET_OVERLAY_PRIV(pGC->pScreen);
692
693    SWITCH_DEPTH(pGC->depth);
694
695    return (*pOverPriv->PolyText16TE)(pDraw, pGC, x, y, count, chars);
696}
697
698
699static void
700XAAOverImageText8TE(
701   DrawablePtr pDraw,
702   GCPtr pGC,
703   int x, int y,
704   int count,
705   char *chars
706){
707    XAAOverlayPtr pOverPriv = GET_OVERLAY_PRIV(pGC->pScreen);
708
709    SWITCH_DEPTH(pGC->depth);
710
711    (*pOverPriv->ImageText8TE)(pDraw, pGC, x, y, count, chars);
712}
713
714
715static void
716XAAOverImageText16TE(
717   DrawablePtr pDraw,
718   GCPtr pGC,
719   int x, int y,
720   int count,
721   unsigned short *chars
722){
723    XAAOverlayPtr pOverPriv = GET_OVERLAY_PRIV(pGC->pScreen);
724
725    SWITCH_DEPTH(pGC->depth);
726
727    (*pOverPriv->ImageText16TE)(pDraw, pGC, x, y, count, chars);
728}
729
730static void
731XAAOverImageGlyphBltTE(
732   DrawablePtr pDraw,
733   GCPtr pGC,
734   int xInit, int yInit,
735   unsigned int nglyph,
736   CharInfoPtr *ppci,
737   pointer pglyphBase
738){
739    XAAOverlayPtr pOverPriv = GET_OVERLAY_PRIV(pGC->pScreen);
740
741    SWITCH_DEPTH(pGC->depth);
742
743    (*pOverPriv->ImageGlyphBltTE)(
744	pDraw, pGC, xInit, yInit, nglyph, ppci, pglyphBase);
745}
746
747static void
748XAAOverPolyGlyphBltTE(
749   DrawablePtr pDraw,
750   GCPtr pGC,
751   int xInit, int yInit,
752   unsigned int nglyph,
753   CharInfoPtr *ppci,
754   pointer pglyphBase
755){
756    XAAOverlayPtr pOverPriv = GET_OVERLAY_PRIV(pGC->pScreen);
757
758    SWITCH_DEPTH(pGC->depth);
759
760    (*pOverPriv->PolyGlyphBltTE)(
761	pDraw, pGC, xInit, yInit, nglyph, ppci, pglyphBase);
762}
763
764static int
765XAAOverPolyText8NonTE(
766   DrawablePtr pDraw,
767   GCPtr pGC,
768   int x, int y,
769   int count,
770   char *chars
771){
772    XAAOverlayPtr pOverPriv = GET_OVERLAY_PRIV(pGC->pScreen);
773
774    SWITCH_DEPTH(pGC->depth);
775
776    return (*pOverPriv->PolyText8NonTE)(pDraw, pGC, x, y, count, chars);
777}
778
779
780static int
781XAAOverPolyText16NonTE(
782   DrawablePtr pDraw,
783   GCPtr pGC,
784   int x, int y,
785   int count,
786   unsigned short *chars
787){
788    XAAOverlayPtr pOverPriv = GET_OVERLAY_PRIV(pGC->pScreen);
789
790    SWITCH_DEPTH(pGC->depth);
791
792    return (*pOverPriv->PolyText16NonTE)(pDraw, pGC, x, y, count, chars);
793}
794
795static void
796XAAOverImageText8NonTE(
797   DrawablePtr pDraw,
798   GCPtr pGC,
799   int x, int y,
800   int count,
801   char *chars
802){
803    XAAOverlayPtr pOverPriv = GET_OVERLAY_PRIV(pGC->pScreen);
804
805    SWITCH_DEPTH(pGC->depth);
806
807    (*pOverPriv->ImageText8NonTE)(pDraw, pGC, x, y, count, chars);
808}
809
810static void
811XAAOverImageText16NonTE(
812   DrawablePtr pDraw,
813   GCPtr pGC,
814   int x, int y,
815   int count,
816   unsigned short *chars
817){
818    XAAOverlayPtr pOverPriv = GET_OVERLAY_PRIV(pGC->pScreen);
819
820    SWITCH_DEPTH(pGC->depth);
821
822    (*pOverPriv->ImageText16NonTE)(pDraw, pGC, x, y, count, chars);
823}
824
825
826static void
827XAAOverImageGlyphBltNonTE(
828   DrawablePtr pDraw,
829   GCPtr pGC,
830   int xInit, int yInit,
831   unsigned int nglyph,
832   CharInfoPtr *ppci,
833   pointer pglyphBase
834){
835    XAAOverlayPtr pOverPriv = GET_OVERLAY_PRIV(pGC->pScreen);
836
837    SWITCH_DEPTH(pGC->depth);
838
839    (*pOverPriv->ImageGlyphBltNonTE)(
840		pDraw, pGC, xInit, yInit, nglyph, ppci, pglyphBase);
841}
842
843static void
844XAAOverPolyGlyphBltNonTE(
845   DrawablePtr pDraw,
846   GCPtr pGC,
847   int xInit, int yInit,
848   unsigned int nglyph,
849   CharInfoPtr *ppci,
850   pointer pglyphBase
851){
852    XAAOverlayPtr pOverPriv = GET_OVERLAY_PRIV(pGC->pScreen);
853
854    SWITCH_DEPTH(pGC->depth);
855
856    (*pOverPriv->PolyGlyphBltNonTE)(
857		pDraw, pGC, xInit, yInit, nglyph, ppci, pglyphBase);
858}
859
860static void
861XAAOverPolyRectangleThinSolid(
862   DrawablePtr  pDraw,
863   GCPtr        pGC,
864   int	    	nRectsInit,
865   xRectangle  *pRectsInit
866){
867    XAAOverlayPtr pOverPriv = GET_OVERLAY_PRIV(pGC->pScreen);
868
869    SWITCH_DEPTH(pGC->depth);
870
871    (*pOverPriv->PolyRectangleThinSolid)(pDraw, pGC, nRectsInit, pRectsInit);
872}
873
874
875
876static void
877XAAOverPolylinesWideSolid(
878   DrawablePtr	pDraw,
879   GCPtr	pGC,
880   int		mode,
881   int 		npt,
882   DDXPointPtr pPts
883){
884    XAAOverlayPtr pOverPriv = GET_OVERLAY_PRIV(pGC->pScreen);
885
886    SWITCH_DEPTH(pGC->depth);
887
888    (*pOverPriv->PolylinesWideSolid)(pDraw, pGC, mode, npt, pPts);
889}
890
891
892static void
893XAAOverPolylinesThinSolid(
894   DrawablePtr	pDraw,
895   GCPtr	pGC,
896   int		mode,
897   int 		npt,
898   DDXPointPtr pPts
899){
900    XAAOverlayPtr pOverPriv = GET_OVERLAY_PRIV(pGC->pScreen);
901
902    SWITCH_DEPTH(pGC->depth);
903
904    (*pOverPriv->PolylinesThinSolid)(pDraw, pGC, mode, npt, pPts);
905}
906
907static void
908XAAOverPolySegmentThinSolid(
909   DrawablePtr	pDraw,
910   GCPtr	pGC,
911   int		nseg,
912   xSegment	*pSeg
913){
914    XAAOverlayPtr pOverPriv = GET_OVERLAY_PRIV(pGC->pScreen);
915
916    SWITCH_DEPTH(pGC->depth);
917
918    (*pOverPriv->PolySegmentThinSolid)(pDraw, pGC, nseg, pSeg);
919}
920
921static void
922XAAOverPolylinesThinDashed(
923   DrawablePtr	pDraw,
924   GCPtr	pGC,
925   int		mode,
926   int 		npt,
927   DDXPointPtr pPts
928){
929    XAAOverlayPtr pOverPriv = GET_OVERLAY_PRIV(pGC->pScreen);
930
931    SWITCH_DEPTH(pGC->depth);
932
933    (*pOverPriv->PolylinesThinDashed)(pDraw, pGC, mode, npt, pPts);
934}
935
936static void
937XAAOverPolySegmentThinDashed(
938   DrawablePtr	pDraw,
939   GCPtr	pGC,
940   int		nseg,
941   xSegment	*pSeg
942){
943    XAAOverlayPtr pOverPriv = GET_OVERLAY_PRIV(pGC->pScreen);
944
945    SWITCH_DEPTH(pGC->depth);
946
947    (*pOverPriv->PolySegmentThinDashed)(pDraw, pGC, nseg, pSeg);
948}
949
950
951static void
952XAAOverFillPolygonSolid(
953   DrawablePtr	pDraw,
954   GCPtr	pGC,
955   int		shape,
956   int		mode,
957   int		count,
958   DDXPointPtr	ptsIn
959){
960    XAAOverlayPtr pOverPriv = GET_OVERLAY_PRIV(pGC->pScreen);
961
962    SWITCH_DEPTH(pGC->depth);
963
964    (*pOverPriv->FillPolygonSolid)(pDraw, pGC, shape, mode, count, ptsIn);
965}
966
967static void
968XAAOverFillPolygonStippled(
969   DrawablePtr	pDraw,
970   GCPtr	pGC,
971   int		shape,
972   int		mode,
973   int		count,
974   DDXPointPtr	ptsIn
975){
976    XAAOverlayPtr pOverPriv = GET_OVERLAY_PRIV(pGC->pScreen);
977
978    SWITCH_DEPTH(pGC->depth);
979
980    (*pOverPriv->FillPolygonStippled)(pDraw, pGC, shape, mode, count, ptsIn);
981}
982
983
984static void
985XAAOverFillPolygonOpaqueStippled(
986   DrawablePtr	pDraw,
987   GCPtr	pGC,
988   int		shape,
989   int		mode,
990   int		count,
991   DDXPointPtr	ptsIn
992){
993    XAAOverlayPtr pOverPriv = GET_OVERLAY_PRIV(pGC->pScreen);
994
995    SWITCH_DEPTH(pGC->depth);
996
997    (*pOverPriv->FillPolygonOpaqueStippled)(
998			pDraw, pGC, shape, mode, count, ptsIn);
999}
1000
1001static void
1002XAAOverFillPolygonTiled(
1003   DrawablePtr	pDraw,
1004   GCPtr	pGC,
1005   int		shape,
1006   int		mode,
1007   int		count,
1008   DDXPointPtr	ptsIn
1009){
1010    XAAOverlayPtr pOverPriv = GET_OVERLAY_PRIV(pGC->pScreen);
1011
1012    SWITCH_DEPTH(pGC->depth);
1013
1014    (*pOverPriv->FillPolygonTiled)(pDraw, pGC, shape, mode, count, ptsIn);
1015}
1016
1017
1018static void
1019XAAOverPolyFillArcSolid(
1020   DrawablePtr	pDraw,
1021   GCPtr	pGC,
1022   int		narcs,
1023   xArc		*parcs
1024){
1025    XAAOverlayPtr pOverPriv = GET_OVERLAY_PRIV(pGC->pScreen);
1026
1027    SWITCH_DEPTH(pGC->depth);
1028
1029    (*pOverPriv->PolyFillArcSolid)(pDraw, pGC, narcs, parcs);
1030}
1031
1032
1033static void
1034XAAOverPutImage(
1035   DrawablePtr	pDraw,
1036   GCPtr	pGC,
1037   int		depth,
1038   int		x,
1039   int		y,
1040   int		w,
1041   int		h,
1042   int		leftPad,
1043   int		format,
1044   char		*pImage
1045){
1046    XAAOverlayPtr pOverPriv = GET_OVERLAY_PRIV(pGC->pScreen);
1047
1048    SWITCH_DEPTH(pGC->depth);
1049
1050    (*pOverPriv->PutImage)(pDraw, pGC, depth, x, y, w, h,
1051				leftPad, format, pImage);
1052}
1053
1054