1706f2543Smrg
2706f2543Smrg/*
3706f2543Smrg   Copyright (c) 1999 -  The XFree86 Project Inc.
4706f2543Smrg
5706f2543Smrg   Written by Mark Vojkovich
6706f2543Smrg
7706f2543Smrg*/
8706f2543Smrg
9706f2543Smrg#ifdef HAVE_XORG_CONFIG_H
10706f2543Smrg#include <xorg-config.h>
11706f2543Smrg#endif
12706f2543Smrg
13706f2543Smrg#include "misc.h"
14706f2543Smrg#include "xf86.h"
15706f2543Smrg#include "xf86_OSproc.h"
16706f2543Smrg
17706f2543Smrg#include <X11/X.h>
18706f2543Smrg#include "scrnintstr.h"
19706f2543Smrg#include "pixmapstr.h"
20706f2543Smrg#include "windowstr.h"
21706f2543Smrg#include "xf86str.h"
22706f2543Smrg#include "mi.h"
23706f2543Smrg#include "miline.h"
24706f2543Smrg#include "xaa.h"
25706f2543Smrg#include "xaalocal.h"
26706f2543Smrg#include "xaawrap.h"
27706f2543Smrg#include "xf86fbman.h"
28706f2543Smrg#include "servermd.h"
29706f2543Smrg
30706f2543Smrgvoid
31706f2543SmrgXAAMoveOutOffscreenPixmaps(ScreenPtr pScreen)
32706f2543Smrg{
33706f2543Smrg    XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_SCREEN(pScreen);
34706f2543Smrg    PixmapLinkPtr pLink = infoRec->OffscreenPixmaps;
35706f2543Smrg    XAAPixmapPtr pPriv;
36706f2543Smrg
37706f2543Smrg    while(pLink) {
38706f2543Smrg	pPriv = XAA_GET_PIXMAP_PRIVATE(pLink->pPix);
39706f2543Smrg	pLink->area = pPriv->offscreenArea;
40706f2543Smrg	XAAMoveOutOffscreenPixmap(pLink->pPix);
41706f2543Smrg	pLink = pLink->next;
42706f2543Smrg    }
43706f2543Smrg}
44706f2543Smrg
45706f2543Smrg
46706f2543Smrg
47706f2543Smrgvoid
48706f2543SmrgXAAMoveInOffscreenPixmaps(ScreenPtr pScreen)
49706f2543Smrg{
50706f2543Smrg    XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_SCREEN(pScreen);
51706f2543Smrg    PixmapLinkPtr pLink = infoRec->OffscreenPixmaps;
52706f2543Smrg    PixmapPtr pPix, pScreenPix, tmpPix;
53706f2543Smrg    pointer data;
54706f2543Smrg    XAAPixmapPtr pPriv;
55706f2543Smrg    GCPtr pGC;
56706f2543Smrg    FBAreaPtr area;
57706f2543Smrg
58706f2543Smrg    pScreenPix = (*pScreen->GetScreenPixmap)(pScreen);
59706f2543Smrg
60706f2543Smrg    while(pLink) {
61706f2543Smrg	pPix = pLink->pPix;
62706f2543Smrg    	pPriv = XAA_GET_PIXMAP_PRIVATE(pPix);
63706f2543Smrg	area = pLink->area;
64706f2543Smrg
65706f2543Smrg	data = pPix->devPrivate.ptr;
66706f2543Smrg	tmpPix = GetScratchPixmapHeader(pScreen,
67706f2543Smrg		pPix->drawable.width, pPix->drawable.height,
68706f2543Smrg		pPix->drawable.depth, pPix->drawable.bitsPerPixel,
69706f2543Smrg		pPix->devKind, data);
70706f2543Smrg
71706f2543Smrg	pPriv->freeData = FALSE;
72706f2543Smrg
73706f2543Smrg	pPix->drawable.x = area->box.x1;
74706f2543Smrg	pPix->drawable.y = area->box.y1;
75706f2543Smrg	pPix->devKind = pScreenPix->devKind;
76706f2543Smrg	pPix->devPrivate.ptr = pScreenPix->devPrivate.ptr;
77706f2543Smrg	pPix->drawable.bitsPerPixel = infoRec->pScrn->bitsPerPixel;
78706f2543Smrg	pPix->drawable.serialNumber = NEXT_SERIAL_NUMBER;
79706f2543Smrg
80706f2543Smrg	if(!tmpPix) {
81706f2543Smrg	    pPriv->offscreenArea = area;
82706f2543Smrg	    free(data);
83706f2543Smrg	    pLink = pLink->next;
84706f2543Smrg	    continue;
85706f2543Smrg	}
86706f2543Smrg
87706f2543Smrg	pGC = GetScratchGC(pPix->drawable.depth, pScreen);
88706f2543Smrg	ValidateGC((DrawablePtr)pPix, pGC);
89706f2543Smrg
90706f2543Smrg	(*pGC->ops->CopyArea)((DrawablePtr)tmpPix, (DrawablePtr)pPix, pGC,
91706f2543Smrg		0, 0, pPix->drawable.width, pPix->drawable.height, 0, 0);
92706f2543Smrg
93706f2543Smrg	free(data);
94706f2543Smrg	tmpPix->devPrivate.ptr = NULL;
95706f2543Smrg
96706f2543Smrg	FreeScratchGC(pGC);
97706f2543Smrg	FreeScratchPixmapHeader(tmpPix);
98706f2543Smrg
99706f2543Smrg	pPriv->offscreenArea = area;
100706f2543Smrg	pLink->area = NULL;
101706f2543Smrg	pLink = pLink->next;
102706f2543Smrg    }
103706f2543Smrg}
104706f2543Smrg
105706f2543Smrg
106706f2543Smrgvoid
107706f2543SmrgXAARemoveAreaCallback(FBAreaPtr area)
108706f2543Smrg{
109706f2543Smrg    XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_SCREEN(area->pScreen);
110706f2543Smrg    PixmapPtr pPix = (PixmapPtr)area->devPrivate.ptr;
111706f2543Smrg    XAAPixmapPtr pPriv = XAA_GET_PIXMAP_PRIVATE(pPix);
112706f2543Smrg
113706f2543Smrg    XAAMoveOutOffscreenPixmap(pPix);
114706f2543Smrg
115706f2543Smrg    pPriv->flags &= ~OFFSCREEN;
116706f2543Smrg
117706f2543Smrg    DELIST_OFFSCREEN_PIXMAP(pPix);
118706f2543Smrg}
119706f2543Smrg
120706f2543Smrgvoid
121706f2543SmrgXAAMoveOutOffscreenPixmap(PixmapPtr pPix)
122706f2543Smrg{
123706f2543Smrg    ScreenPtr pScreen = pPix->drawable.pScreen;
124706f2543Smrg    XAAPixmapPtr pPriv = XAA_GET_PIXMAP_PRIVATE(pPix);
125706f2543Smrg    int width, height, devKind, bitsPerPixel;
126706f2543Smrg    PixmapPtr tmpPix;
127706f2543Smrg    unsigned char *data;
128706f2543Smrg    GCPtr pGC;
129706f2543Smrg
130706f2543Smrg    width = pPix->drawable.width;
131706f2543Smrg    height = pPix->drawable.height;
132706f2543Smrg    bitsPerPixel = pPix->drawable.bitsPerPixel;
133706f2543Smrg
134706f2543Smrg    devKind = BitmapBytePad(width * bitsPerPixel);
135706f2543Smrg    if(!(data = malloc(devKind * height)))
136706f2543Smrg	FatalError("Out of memory\n");
137706f2543Smrg
138706f2543Smrg    tmpPix = GetScratchPixmapHeader(pScreen, width, height,
139706f2543Smrg		pPix->drawable.depth, bitsPerPixel, devKind, data);
140706f2543Smrg    if(!tmpPix) {
141706f2543Smrg	free(data);
142706f2543Smrg	FatalError("Out of memory\n");
143706f2543Smrg    }
144706f2543Smrg
145706f2543Smrg    pGC = GetScratchGC(pPix->drawable.depth, pScreen);
146706f2543Smrg    ValidateGC((DrawablePtr)tmpPix, pGC);
147706f2543Smrg
148706f2543Smrg    (*pGC->ops->CopyArea)((DrawablePtr)pPix, (DrawablePtr)tmpPix,
149706f2543Smrg		pGC, 0, 0, width, height, 0, 0);
150706f2543Smrg
151706f2543Smrg    FreeScratchGC(pGC);
152706f2543Smrg    FreeScratchPixmapHeader(tmpPix);
153706f2543Smrg
154706f2543Smrg    pPix->drawable.x = 0;
155706f2543Smrg    pPix->drawable.y = 0;
156706f2543Smrg    pPix->devKind = devKind;
157706f2543Smrg    pPix->devPrivate.ptr = data;
158706f2543Smrg    pPix->drawable.serialNumber = NEXT_SERIAL_NUMBER;
159706f2543Smrg
160706f2543Smrg    pPriv->offscreenArea = NULL;
161706f2543Smrg    pPriv->freeData = TRUE;
162706f2543Smrg}
163