xaaOffscreen.c revision 706f2543
1
2/*
3   Copyright (c) 1999 -  The XFree86 Project Inc.
4
5   Written by Mark Vojkovich
6
7*/
8
9#ifdef HAVE_XORG_CONFIG_H
10#include <xorg-config.h>
11#endif
12
13#include "misc.h"
14#include "xf86.h"
15#include "xf86_OSproc.h"
16
17#include <X11/X.h>
18#include "scrnintstr.h"
19#include "pixmapstr.h"
20#include "windowstr.h"
21#include "xf86str.h"
22#include "mi.h"
23#include "miline.h"
24#include "xaa.h"
25#include "xaalocal.h"
26#include "xaawrap.h"
27#include "xf86fbman.h"
28#include "servermd.h"
29
30void
31XAAMoveOutOffscreenPixmaps(ScreenPtr pScreen)
32{
33    XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_SCREEN(pScreen);
34    PixmapLinkPtr pLink = infoRec->OffscreenPixmaps;
35    XAAPixmapPtr pPriv;
36
37    while(pLink) {
38	pPriv = XAA_GET_PIXMAP_PRIVATE(pLink->pPix);
39	pLink->area = pPriv->offscreenArea;
40	XAAMoveOutOffscreenPixmap(pLink->pPix);
41	pLink = pLink->next;
42    }
43}
44
45
46
47void
48XAAMoveInOffscreenPixmaps(ScreenPtr pScreen)
49{
50    XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_SCREEN(pScreen);
51    PixmapLinkPtr pLink = infoRec->OffscreenPixmaps;
52    PixmapPtr pPix, pScreenPix, tmpPix;
53    pointer data;
54    XAAPixmapPtr pPriv;
55    GCPtr pGC;
56    FBAreaPtr area;
57
58    pScreenPix = (*pScreen->GetScreenPixmap)(pScreen);
59
60    while(pLink) {
61	pPix = pLink->pPix;
62    	pPriv = XAA_GET_PIXMAP_PRIVATE(pPix);
63	area = pLink->area;
64
65	data = pPix->devPrivate.ptr;
66	tmpPix = GetScratchPixmapHeader(pScreen,
67		pPix->drawable.width, pPix->drawable.height,
68		pPix->drawable.depth, pPix->drawable.bitsPerPixel,
69		pPix->devKind, data);
70
71	pPriv->freeData = FALSE;
72
73	pPix->drawable.x = area->box.x1;
74	pPix->drawable.y = area->box.y1;
75	pPix->devKind = pScreenPix->devKind;
76	pPix->devPrivate.ptr = pScreenPix->devPrivate.ptr;
77	pPix->drawable.bitsPerPixel = infoRec->pScrn->bitsPerPixel;
78	pPix->drawable.serialNumber = NEXT_SERIAL_NUMBER;
79
80	if(!tmpPix) {
81	    pPriv->offscreenArea = area;
82	    free(data);
83	    pLink = pLink->next;
84	    continue;
85	}
86
87	pGC = GetScratchGC(pPix->drawable.depth, pScreen);
88	ValidateGC((DrawablePtr)pPix, pGC);
89
90	(*pGC->ops->CopyArea)((DrawablePtr)tmpPix, (DrawablePtr)pPix, pGC,
91		0, 0, pPix->drawable.width, pPix->drawable.height, 0, 0);
92
93	free(data);
94	tmpPix->devPrivate.ptr = NULL;
95
96	FreeScratchGC(pGC);
97	FreeScratchPixmapHeader(tmpPix);
98
99	pPriv->offscreenArea = area;
100	pLink->area = NULL;
101	pLink = pLink->next;
102    }
103}
104
105
106void
107XAARemoveAreaCallback(FBAreaPtr area)
108{
109    XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_SCREEN(area->pScreen);
110    PixmapPtr pPix = (PixmapPtr)area->devPrivate.ptr;
111    XAAPixmapPtr pPriv = XAA_GET_PIXMAP_PRIVATE(pPix);
112
113    XAAMoveOutOffscreenPixmap(pPix);
114
115    pPriv->flags &= ~OFFSCREEN;
116
117    DELIST_OFFSCREEN_PIXMAP(pPix);
118}
119
120void
121XAAMoveOutOffscreenPixmap(PixmapPtr pPix)
122{
123    ScreenPtr pScreen = pPix->drawable.pScreen;
124    XAAPixmapPtr pPriv = XAA_GET_PIXMAP_PRIVATE(pPix);
125    int width, height, devKind, bitsPerPixel;
126    PixmapPtr tmpPix;
127    unsigned char *data;
128    GCPtr pGC;
129
130    width = pPix->drawable.width;
131    height = pPix->drawable.height;
132    bitsPerPixel = pPix->drawable.bitsPerPixel;
133
134    devKind = BitmapBytePad(width * bitsPerPixel);
135    if(!(data = malloc(devKind * height)))
136	FatalError("Out of memory\n");
137
138    tmpPix = GetScratchPixmapHeader(pScreen, width, height,
139		pPix->drawable.depth, bitsPerPixel, devKind, data);
140    if(!tmpPix) {
141	free(data);
142	FatalError("Out of memory\n");
143    }
144
145    pGC = GetScratchGC(pPix->drawable.depth, pScreen);
146    ValidateGC((DrawablePtr)tmpPix, pGC);
147
148    (*pGC->ops->CopyArea)((DrawablePtr)pPix, (DrawablePtr)tmpPix,
149		pGC, 0, 0, width, height, 0, 0);
150
151    FreeScratchGC(pGC);
152    FreeScratchPixmapHeader(tmpPix);
153
154    pPix->drawable.x = 0;
155    pPix->drawable.y = 0;
156    pPix->devKind = devKind;
157    pPix->devPrivate.ptr = data;
158    pPix->drawable.serialNumber = NEXT_SERIAL_NUMBER;
159
160    pPriv->offscreenArea = NULL;
161    pPriv->freeData = TRUE;
162}
163