178 lines
4.1 KiB
C
178 lines
4.1 KiB
C
/*
|
|
Copyright (C) 1999. The XFree86 Project Inc.
|
|
|
|
Written by Mark Vojkovich (mvojkovi@ucsd.edu)
|
|
*/
|
|
|
|
/* $XFree86: xc/programs/Xserver/hw/xfree86/xf8_16bpp/cfbwindow.c,v 1.4tsi Exp $ */
|
|
|
|
#include "X.h"
|
|
#include "scrnintstr.h"
|
|
#include "windowstr.h"
|
|
#define PSZ 8
|
|
#include "cfb.h"
|
|
#undef PSZ
|
|
#include "cfb16.h"
|
|
#include "cfb8_16.h"
|
|
#include "mistruct.h"
|
|
#include "regionstr.h"
|
|
#include "cfbmskbits.h"
|
|
#include "xf86.h"
|
|
|
|
/* We don't bother with cfb's fastBackground/Border so we don't
|
|
need to use the Window privates */
|
|
|
|
|
|
Bool
|
|
cfb8_16CreateWindow(WindowPtr pWin)
|
|
{
|
|
cfbPrivWin *pPrivWin = cfbGetWindowPrivate(pWin);
|
|
|
|
pPrivWin->pRotatedBorder = NullPixmap;
|
|
pPrivWin->pRotatedBackground = NullPixmap;
|
|
pPrivWin->fastBackground = FALSE;
|
|
pPrivWin->fastBorder = FALSE;
|
|
pPrivWin->oldRotate.x = 0;
|
|
pPrivWin->oldRotate.y = 0;
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
Bool
|
|
cfb8_16DestroyWindow(WindowPtr pWin)
|
|
{
|
|
return TRUE;
|
|
}
|
|
|
|
Bool
|
|
cfb8_16PositionWindow(
|
|
WindowPtr pWin,
|
|
int x, int y
|
|
){
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
void
|
|
cfb8_16CopyWindow(
|
|
WindowPtr pWin,
|
|
DDXPointRec ptOldOrg,
|
|
RegionPtr prgnSrc
|
|
){
|
|
ScreenPtr pScreen = pWin->drawable.pScreen;
|
|
cfb8_16ScreenPtr pScreenPriv =
|
|
CFB8_16_GET_SCREEN_PRIVATE(pWin->drawable.pScreen);
|
|
ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
|
|
DDXPointPtr ppt, pptSrc;
|
|
RegionRec rgnDst;
|
|
BoxPtr pbox;
|
|
int i, nbox, dx, dy;
|
|
WindowPtr pRoot = WindowTable[pScreen->myNum];
|
|
|
|
REGION_NULL(pScreen, &rgnDst);
|
|
|
|
dx = ptOldOrg.x - pWin->drawable.x;
|
|
dy = ptOldOrg.y - pWin->drawable.y;
|
|
REGION_TRANSLATE(pScreen, prgnSrc, -dx, -dy);
|
|
REGION_INTERSECT(pScreen, &rgnDst, &pWin->borderClip, prgnSrc);
|
|
|
|
nbox = REGION_NUM_RECTS(&rgnDst);
|
|
if(nbox &&
|
|
(pptSrc = (DDXPointPtr )ALLOCATE_LOCAL(nbox * sizeof(DDXPointRec)))) {
|
|
|
|
pbox = REGION_RECTS(&rgnDst);
|
|
for (i = nbox, ppt = pptSrc; i--; ppt++, pbox++) {
|
|
ppt->x = pbox->x1 + dx;
|
|
ppt->y = pbox->y1 + dy;
|
|
}
|
|
cfbDoBitbltCopy((DrawablePtr)pRoot, (DrawablePtr)pRoot,
|
|
GXcopy, &rgnDst, pptSrc, ~0L);
|
|
if(pWin->drawable.bitsPerPixel == 16)
|
|
cfb16DoBitbltCopy((DrawablePtr)pScreenPriv->pix16,
|
|
(DrawablePtr)pScreenPriv->pix16,
|
|
GXcopy, &rgnDst, pptSrc, ~0L);
|
|
|
|
DEALLOCATE_LOCAL(pptSrc);
|
|
}
|
|
|
|
REGION_UNINIT(pScreen, &rgnDst);
|
|
|
|
if(pWin->drawable.depth == 8) {
|
|
REGION_NULL(pScreen, &rgnDst);
|
|
miSegregateChildren(pWin, &rgnDst, pScrn->depth);
|
|
if(REGION_NOTEMPTY(pScreen, &rgnDst)) {
|
|
REGION_INTERSECT(pScreen, &rgnDst, &rgnDst, prgnSrc);
|
|
nbox = REGION_NUM_RECTS(&rgnDst);
|
|
if(nbox &&
|
|
(pptSrc = (DDXPointPtr )ALLOCATE_LOCAL(nbox * sizeof(DDXPointRec)))){
|
|
|
|
pbox = REGION_RECTS(&rgnDst);
|
|
for (i = nbox, ppt = pptSrc; i--; ppt++, pbox++) {
|
|
ppt->x = pbox->x1 + dx;
|
|
ppt->y = pbox->y1 + dy;
|
|
}
|
|
|
|
cfb16DoBitbltCopy((DrawablePtr)pScreenPriv->pix16,
|
|
(DrawablePtr)pScreenPriv->pix16,
|
|
GXcopy, &rgnDst, pptSrc, ~0L);
|
|
DEALLOCATE_LOCAL(pptSrc);
|
|
}
|
|
}
|
|
REGION_UNINIT(pScreen, &rgnDst);
|
|
}
|
|
}
|
|
|
|
Bool
|
|
cfb8_16ChangeWindowAttributes(
|
|
WindowPtr pWin,
|
|
unsigned long mask
|
|
){
|
|
if (pWin->drawable.bitsPerPixel == 16)
|
|
return cfb16ChangeWindowAttributes(pWin,mask);
|
|
else
|
|
return cfbChangeWindowAttributes(pWin,mask);
|
|
}
|
|
|
|
void
|
|
cfb8_16WindowExposures(
|
|
WindowPtr pWin,
|
|
RegionPtr pReg,
|
|
RegionPtr pOtherReg
|
|
){
|
|
|
|
if(REGION_NUM_RECTS(pReg) && (pWin->drawable.bitsPerPixel == 16)) {
|
|
cfb8_16ScreenPtr pScreenPriv =
|
|
CFB8_16_GET_SCREEN_PRIVATE(pWin->drawable.pScreen);
|
|
|
|
cfbFillBoxSolid((DrawablePtr)pScreenPriv->pix8,
|
|
REGION_NUM_RECTS(pReg), REGION_RECTS(pReg),
|
|
pScreenPriv->key);
|
|
}
|
|
|
|
miWindowExposures(pWin, pReg, pOtherReg);
|
|
}
|
|
|
|
|
|
void
|
|
cfb8_16PaintWindow (
|
|
WindowPtr pWin,
|
|
RegionPtr pRegion,
|
|
int what
|
|
){
|
|
if(pWin->drawable.bitsPerPixel == 16) {
|
|
cfb16PaintWindow(pWin, pRegion, what);
|
|
if(what == PW_BORDER) {
|
|
cfb8_16ScreenPtr pScreenPriv =
|
|
CFB8_16_GET_SCREEN_PRIVATE(pWin->drawable.pScreen);
|
|
|
|
cfbFillBoxSolid((DrawablePtr)pScreenPriv->pix8,
|
|
REGION_NUM_RECTS(pRegion), REGION_RECTS(pRegion),
|
|
pScreenPriv->key);
|
|
}
|
|
} else
|
|
cfbPaintWindow(pWin, pRegion, what);
|
|
|
|
}
|
|
|