xserver-multidpi/hw/xfree86/xf8_16bpp/cfbwindow.c
Daniel Stone e03198972c Add Xtrans definitions (FONT_t, TRANS_CLIENT) to clean up warnings.
Add XSERV_t, TRANS_SERVER, TRANS_REOPEN to quash warnings.
Add #include <dix-config.h> or <xorg-config.h>, as appropriate, to all
    source files in the xserver/xorg tree, predicated on defines of
    HAVE_{DIX,XORG}_CONFIG_H. Change all Xfont includes to
    <X11/fonts/foo.h>.
2005-07-03 07:02:09 +00:00

182 lines
4.2 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 $ */
#ifdef HAVE_XORG_CONFIG_H
#include <xorg-config.h>
#endif
#include <X11/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);
}