106 lines
2.2 KiB
C
106 lines
2.2 KiB
C
|
|
||
|
#define PSZ 8
|
||
|
#ifdef HAVE_XORG_CONFIG_H
|
||
|
#include <xorg-config.h>
|
||
|
#endif
|
||
|
|
||
|
#include "cfb.h"
|
||
|
#undef PSZ
|
||
|
#include "cfb32.h"
|
||
|
#include "cfb8_32.h"
|
||
|
#include <X11/X.h>
|
||
|
#include "mibstore.h"
|
||
|
#include "regionstr.h"
|
||
|
#include "scrnintstr.h"
|
||
|
#include "pixmapstr.h"
|
||
|
#include "windowstr.h"
|
||
|
|
||
|
void
|
||
|
cfb8_32SaveAreas(
|
||
|
PixmapPtr pPixmap,
|
||
|
RegionPtr prgnSave,
|
||
|
int xorg,
|
||
|
int yorg,
|
||
|
WindowPtr pWin
|
||
|
){
|
||
|
DDXPointPtr pPt;
|
||
|
DDXPointPtr pPtsInit;
|
||
|
BoxPtr pBox;
|
||
|
int i;
|
||
|
ScreenPtr pScreen = pPixmap->drawable.pScreen;
|
||
|
PixmapPtr pScrPix;
|
||
|
|
||
|
if(pPixmap->drawable.bitsPerPixel == 32) {
|
||
|
cfb32SaveAreas(pPixmap, prgnSave, xorg, yorg, pWin);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
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++;
|
||
|
}
|
||
|
|
||
|
pScrPix = (PixmapPtr) pScreen->devPrivate;
|
||
|
|
||
|
cfbDoBitblt32To8((DrawablePtr) pScrPix, (DrawablePtr)pPixmap,
|
||
|
GXcopy, prgnSave, pPtsInit, ~0L);
|
||
|
|
||
|
DEALLOCATE_LOCAL (pPtsInit);
|
||
|
}
|
||
|
|
||
|
|
||
|
void
|
||
|
cfb8_32RestoreAreas(
|
||
|
PixmapPtr pPixmap,
|
||
|
RegionPtr prgnRestore,
|
||
|
int xorg,
|
||
|
int yorg,
|
||
|
WindowPtr pWin
|
||
|
){
|
||
|
DDXPointPtr pPt;
|
||
|
DDXPointPtr pPtsInit;
|
||
|
BoxPtr pBox;
|
||
|
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++;
|
||
|
}
|
||
|
|
||
|
pScrPix = (PixmapPtr) pScreen->devPrivate;
|
||
|
|
||
|
if(pPixmap->drawable.bitsPerPixel == 32) {
|
||
|
if(pWin->drawable.depth == 24)
|
||
|
cfb32DoBitbltCopy((DrawablePtr)pPixmap, (DrawablePtr) pScrPix,
|
||
|
GXcopy, prgnRestore, pPtsInit, 0x00ffffff);
|
||
|
else
|
||
|
cfb32DoBitbltCopy((DrawablePtr)pPixmap, (DrawablePtr) pScrPix,
|
||
|
GXcopy, prgnRestore, pPtsInit, ~0);
|
||
|
} else {
|
||
|
cfbDoBitblt8To32((DrawablePtr)pPixmap, (DrawablePtr) pScrPix,
|
||
|
GXcopy, prgnRestore, pPtsInit, ~0L);
|
||
|
}
|
||
|
|
||
|
DEALLOCATE_LOCAL (pPtsInit);
|
||
|
}
|