/* $XFree86$ */ /*- * iplbstore.c -- * Functions required by the backing-store implementation in MI. * * Copyright (c) 1987 by the Regents of the University of California * * Permission to use, copy, modify, and distribute this * software and its documentation for any purpose and without * fee is hereby granted, provided that the above copyright * notice appear in all copies. The University of California * makes no representations about the suitability of this * software for any purpose. It is provided "as is" without * express or implied warranty. * * */ #ifndef lint static char rcsid[] = "$XConsortium: iplbstore.c,v 5.8 93/12/13 17:21:51 dpw Exp $ SPRITE (Berkeley)"; #endif /* Modified nov 94 by Martin Schaller (Martin_Schaller@maus.r.de) for use with interleaved planes */ #include "ipl.h" #include "X.h" #include "mibstore.h" #include "regionstr.h" #include "scrnintstr.h" #include "pixmapstr.h" #include "windowstr.h" /*- *----------------------------------------------------------------------- * iplSaveAreas -- * Function called by miSaveAreas to actually fetch the areas to be * saved into the backing pixmap. This is very simple to do, since * iplDoBitblt is designed for this very thing. The region to save is * already destination-relative and we're given the offset to the * window origin, so we have only to create an array of points of the * u.l. corners of the boxes in the region translated to the screen * coordinate system and fetch the screen pixmap out of its devPrivate * field.... * * Results: * None. * * Side Effects: * Data are copied from the screen into the pixmap. * *----------------------------------------------------------------------- */ void iplSaveAreas(pPixmap, prgnSave, xorg, yorg, pWin) PixmapPtr pPixmap; /* Backing pixmap */ RegionPtr prgnSave; /* Region to save (pixmap-relative) */ int xorg; /* X origin of region */ int yorg; /* Y origin of region */ WindowPtr pWin; { register DDXPointPtr pPt; DDXPointPtr pPtsInit; register BoxPtr pBox; register int i; ScreenPtr pScreen = pPixmap->drawable.pScreen; PixmapPtr pScrPix; i = REGION_NUM_RECTS(prgnSave); pPtsInit = (DDXPointPtr)ALLOCATE_LOCAL(i * sizeof(DDXPointRec)); if (!pPtsInit) return; pBox = REGION_RECTS(prgnSave); pPt = pPtsInit; while (--i >= 0) { pPt->x = pBox->x1 + xorg; pPt->y = pBox->y1 + yorg; pPt++; pBox++; } #ifdef CFB_NEED_SCREEN_PRIVATE pScrPix = (PixmapPtr) pScreen->devPrivates[iplScreenPrivateIndex].ptr; #else pScrPix = (PixmapPtr) pScreen->devPrivate; #endif iplDoBitbltCopy((DrawablePtr) pScrPix, (DrawablePtr)pPixmap, GXcopy, prgnSave, pPtsInit, ~0L); DEALLOCATE_LOCAL (pPtsInit); } /*- *----------------------------------------------------------------------- * iplRestoreAreas -- * Function called by miRestoreAreas to actually fetch the areas to be * restored from the backing pixmap. This is very simple to do, since * iplDoBitblt is designed for this very thing. The region to restore is * already destination-relative and we're given the offset to the * window origin, so we have only to create an array of points of the * u.l. corners of the boxes in the region translated to the pixmap * coordinate system and fetch the screen pixmap out of its devPrivate * field.... * * Results: * None. * * Side Effects: * Data are copied from the pixmap into the screen. * *----------------------------------------------------------------------- */ void iplRestoreAreas(pPixmap, prgnRestore, xorg, yorg, pWin) PixmapPtr pPixmap; /* Backing pixmap */ RegionPtr prgnRestore; /* Region to restore (screen-relative)*/ int xorg; /* X origin of window */ int yorg; /* Y origin of window */ WindowPtr pWin; { register DDXPointPtr pPt; DDXPointPtr pPtsInit; register BoxPtr pBox; register int i; ScreenPtr pScreen = pPixmap->drawable.pScreen; PixmapPtr pScrPix; i = REGION_NUM_RECTS(prgnRestore); pPtsInit = (DDXPointPtr)ALLOCATE_LOCAL(i*sizeof(DDXPointRec)); if (!pPtsInit) return; pBox = REGION_RECTS(prgnRestore); pPt = pPtsInit; while (--i >= 0) { pPt->x = pBox->x1 - xorg; pPt->y = pBox->y1 - yorg; pPt++; pBox++; } #ifdef CFB_NEED_SCREEN_PRIVATE pScrPix = (PixmapPtr) pScreen->devPrivates[iplScreenPrivateIndex].ptr; #else pScrPix = (PixmapPtr) pScreen->devPrivate; #endif iplDoBitbltCopy((DrawablePtr)pPixmap, (DrawablePtr) pScrPix, GXcopy, prgnRestore, pPtsInit, ~0L); DEALLOCATE_LOCAL (pPtsInit); }