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);
 | |
| 
 | |
| }
 | |
| 
 |