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