201 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			201 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			C
		
	
	
	
/*
 | 
						|
 * Copyright 2001 by Alan Hourihane, Sychdyn, North Wales, UK.
 | 
						|
 *
 | 
						|
 * Permission to use, copy, modify, distribute, and sell this software and its
 | 
						|
 * documentation for any purpose is hereby granted without fee, provided that
 | 
						|
 * the above copyright notice appear in all copies and that both that
 | 
						|
 * copyright notice and this permission notice appear in supporting
 | 
						|
 * documentation, and that the name of Alan Hourihane not be used in
 | 
						|
 * advertising or publicity pertaining to distribution of the software without
 | 
						|
 * specific, written prior permission.  Alan Hourihane makes no representations
 | 
						|
 * about the suitability of this software for any purpose.  It is provided
 | 
						|
 * "as is" without express or implied warranty.
 | 
						|
 *
 | 
						|
 * ALAN HOURIHANE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
 | 
						|
 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
 | 
						|
 * EVENT SHALL ALAN HOURIHANE BE LIABLE FOR ANY SPECIAL, INDIRECT OR
 | 
						|
 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
 | 
						|
 * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
 | 
						|
 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
 | 
						|
 * PERFORMANCE OF THIS SOFTWARE.
 | 
						|
 *
 | 
						|
 * Authors:  Alan Hourihane, <alanh@fairlite.demon.co.uk>
 | 
						|
 */
 | 
						|
/* $RCSId: xc/programs/Xserver/hw/kdrive/pcmcia/pcmciashadow.c,v 1.1 2001/05/23 08:56:09 alanh Exp $ */
 | 
						|
 | 
						|
#ifdef HAVE_CONFIG_H
 | 
						|
#include <config.h>
 | 
						|
#endif
 | 
						|
#include    <X11/X.h>
 | 
						|
#include    "scrnintstr.h"
 | 
						|
#include    "windowstr.h"
 | 
						|
#include    "font.h"
 | 
						|
#include    "dixfontstr.h"
 | 
						|
#include    "fontstruct.h"
 | 
						|
#include    "mi.h"
 | 
						|
#include    "regionstr.h"
 | 
						|
#include    "globals.h"
 | 
						|
#include    "gcstruct.h"
 | 
						|
#include    "shadow.h"
 | 
						|
#include    "fb.h"
 | 
						|
 | 
						|
void
 | 
						|
tridentUpdatePacked (ScreenPtr	    pScreen,
 | 
						|
		     shadowBufPtr   pBuf)
 | 
						|
{
 | 
						|
    RegionPtr	damage = &pBuf->damage;
 | 
						|
    PixmapPtr	pShadow = pBuf->pPixmap;
 | 
						|
    shadowScrPriv(pScreen);
 | 
						|
    int		nbox = REGION_NUM_RECTS (damage);
 | 
						|
    BoxPtr	pbox = REGION_RECTS (damage);
 | 
						|
    FbBits	*shaBase, *shaLine, *sha;
 | 
						|
    FbStride	shaStride;
 | 
						|
    int		scrBase, scrLine, scr;
 | 
						|
    int		shaBpp;
 | 
						|
    int		shaXoff, shaYoff; /* XXX assumed to be zero */
 | 
						|
    int		x, y, w, h, width;
 | 
						|
    int         i;
 | 
						|
    FbBits	*winBase, *win;
 | 
						|
    CARD32      winSize;
 | 
						|
 | 
						|
    fbGetDrawable (&pShadow->drawable, shaBase, shaStride, shaBpp, shaXoff, shaYoff);
 | 
						|
    while (nbox--)
 | 
						|
    {
 | 
						|
	x = pbox->x1 * shaBpp;
 | 
						|
	y = pbox->y1;
 | 
						|
	w = (pbox->x2 - pbox->x1) * shaBpp;
 | 
						|
	h = pbox->y2 - pbox->y1;
 | 
						|
 | 
						|
	scrLine = (x >> FB_SHIFT);
 | 
						|
	shaLine = shaBase + y * shaStride + (x >> FB_SHIFT);
 | 
						|
				   
 | 
						|
	x &= FB_MASK;
 | 
						|
	w = (w + x + FB_MASK) >> FB_SHIFT;
 | 
						|
	
 | 
						|
	while (h--)
 | 
						|
	{
 | 
						|
	    winSize = 0;
 | 
						|
	    scrBase = 0;
 | 
						|
	    width = w;
 | 
						|
	    scr = scrLine;
 | 
						|
	    sha = shaLine;
 | 
						|
	    while (width) {
 | 
						|
		/* how much remains in this window */
 | 
						|
		i = scrBase + winSize - scr;
 | 
						|
		if (i <= 0 || scr < scrBase)
 | 
						|
		{
 | 
						|
		    winBase = (FbBits *) (*pBuf->window) (pScreen,
 | 
						|
							  y,
 | 
						|
							  scr * sizeof (FbBits),
 | 
						|
							  SHADOW_WINDOW_WRITE,
 | 
						|
							  &winSize,
 | 
						|
							  pBuf->closure);
 | 
						|
		    if(!winBase)
 | 
						|
			return;
 | 
						|
		    scrBase = scr;
 | 
						|
		    winSize /= sizeof (FbBits);
 | 
						|
		    i = winSize;
 | 
						|
		}
 | 
						|
		win = winBase + (scr - scrBase);
 | 
						|
		if (i > width)
 | 
						|
		    i = width;
 | 
						|
		width -= i;
 | 
						|
		scr += i;
 | 
						|
		{
 | 
						|
		    CARD16 *sha16 = (CARD16*)sha;
 | 
						|
		    CARD16 *win16 = (CARD16*)win;
 | 
						|
		    while (i--)
 | 
						|
		    {
 | 
						|
		    	*win16++ = *sha16++;
 | 
						|
		    	*win16++ = *sha16++;
 | 
						|
		    }
 | 
						|
		}
 | 
						|
	    }
 | 
						|
	    shaLine += shaStride;
 | 
						|
	    y++;
 | 
						|
	}
 | 
						|
	pbox++;
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
void
 | 
						|
cirrusUpdatePacked (ScreenPtr	    pScreen,
 | 
						|
		    shadowBufPtr    pBuf)
 | 
						|
{
 | 
						|
    RegionPtr	damage = &pBuf->damage;
 | 
						|
    PixmapPtr	pShadow = pBuf->pPixmap;
 | 
						|
    shadowScrPriv(pScreen);
 | 
						|
    int		nbox = REGION_NUM_RECTS (damage);
 | 
						|
    BoxPtr	pbox = REGION_RECTS (damage);
 | 
						|
    FbBits	*shaBase, *shaLine, *sha;
 | 
						|
    FbStride	shaStride;
 | 
						|
    int		scrBase, scrLine, scr;
 | 
						|
    int		shaBpp;
 | 
						|
    int		shaXoff, shaYoff;   /* XXX assumed to be zero */
 | 
						|
    int		x, y, w, h, width;
 | 
						|
    int         i;
 | 
						|
    FbBits	*winBase, *win;
 | 
						|
    CARD32      winSize;
 | 
						|
 | 
						|
    fbGetDrawable (&pShadow->drawable, shaBase, shaStride, shaBpp, shaXoff, shaYoff);
 | 
						|
    while (nbox--)
 | 
						|
    {
 | 
						|
	x = pbox->x1 * shaBpp;
 | 
						|
	y = pbox->y1;
 | 
						|
	w = (pbox->x2 - pbox->x1) * shaBpp;
 | 
						|
	h = pbox->y2 - pbox->y1;
 | 
						|
 | 
						|
	scrLine = (x >> FB_SHIFT);
 | 
						|
	shaLine = shaBase + y * shaStride + (x >> FB_SHIFT);
 | 
						|
				   
 | 
						|
	x &= FB_MASK;
 | 
						|
	w = (w + x + FB_MASK) >> FB_SHIFT;
 | 
						|
	
 | 
						|
	while (h--)
 | 
						|
	{
 | 
						|
	    winSize = 0;
 | 
						|
	    scrBase = 0;
 | 
						|
	    width = w;
 | 
						|
	    scr = scrLine;
 | 
						|
	    sha = shaLine;
 | 
						|
	    while (width) {
 | 
						|
		/* how much remains in this window */
 | 
						|
		i = scrBase + winSize - scr;
 | 
						|
		if (i <= 0 || scr < scrBase)
 | 
						|
		{
 | 
						|
		    winBase = (FbBits *) (*pBuf->window) (pScreen,
 | 
						|
							  y,
 | 
						|
							  scr * sizeof (FbBits),
 | 
						|
							  SHADOW_WINDOW_WRITE,
 | 
						|
							  &winSize,
 | 
						|
							  pBuf->closure);
 | 
						|
		    if(!winBase)
 | 
						|
			return;
 | 
						|
		    scrBase = scr;
 | 
						|
		    winSize /= sizeof (FbBits);
 | 
						|
		    i = winSize;
 | 
						|
		}
 | 
						|
		win = winBase + (scr - scrBase);
 | 
						|
		if (i > width)
 | 
						|
		    i = width;
 | 
						|
		width -= i;
 | 
						|
		scr += i;
 | 
						|
		{
 | 
						|
		    CARD8 *sha8 = (CARD8*)sha;
 | 
						|
		    CARD8 *win8 = (CARD8*)win;
 | 
						|
		    while (i--)
 | 
						|
		    {
 | 
						|
		    	*win8++ = *sha8++;
 | 
						|
		    	*win8++ = *sha8++;
 | 
						|
		    	*win8++ = *sha8++;
 | 
						|
		    	*win8++ = *sha8++;
 | 
						|
		    }
 | 
						|
		}
 | 
						|
	    }
 | 
						|
	    shaLine += shaStride;
 | 
						|
	    y++;
 | 
						|
	}
 | 
						|
	pbox++;
 | 
						|
    }
 | 
						|
}
 |