191 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			191 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			C
		
	
	
	
/*
 | 
						|
 * $XFree86: xc/programs/Xserver/miext/layer/layergc.c,v 1.4 2001/08/27 03:55:46 keithp Exp $
 | 
						|
 *
 | 
						|
 * Copyright © 2001 Keith Packard, member of The XFree86 Project, Inc.
 | 
						|
 *
 | 
						|
 * 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 Keith Packard not be used in
 | 
						|
 * advertising or publicity pertaining to distribution of the software without
 | 
						|
 * specific, written prior permission.  Keith Packard makes no
 | 
						|
 * representations about the suitability of this software for any purpose.  It
 | 
						|
 * is provided "as is" without express or implied warranty.
 | 
						|
 *
 | 
						|
 * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
 | 
						|
 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
 | 
						|
 * EVENT SHALL KEITH PACKARD 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.
 | 
						|
 */
 | 
						|
 | 
						|
#include "layerstr.h"
 | 
						|
 | 
						|
GCFuncs	layerGCFuncs = {
 | 
						|
    layerValidateGC, layerChangeGC, layerCopyGC, layerDestroyGC,
 | 
						|
    layerChangeClip, layerDestroyClip, layerCopyClip
 | 
						|
};
 | 
						|
 | 
						|
#if 0
 | 
						|
/*
 | 
						|
 * XXX dont need this until this supports 
 | 
						|
 * separate clipping and multiple layers
 | 
						|
 */
 | 
						|
GCOps layerGCOps = {
 | 
						|
    layerFillSpans, layerSetSpans, 
 | 
						|
    layerPutImage, layerCopyArea, 
 | 
						|
    layerCopyPlane, layerPolyPoint, 
 | 
						|
    layerPolylines, layerPolySegment, 
 | 
						|
    layerPolyRectangle, layerPolyArc, 
 | 
						|
    layerFillPolygon, layerPolyFillRect, 
 | 
						|
    layerPolyFillArc, layerPolyText8, 
 | 
						|
    layerPolyText16, layerImageText8, 
 | 
						|
    layerImageText16, layerImageGlyphBlt, 
 | 
						|
    layerPolyGlyphBlt, layerPushPixels,
 | 
						|
#ifdef NEED_LINEHELPER
 | 
						|
    NULL,
 | 
						|
#endif
 | 
						|
    {NULL}		/* devPrivate */
 | 
						|
};
 | 
						|
#endif
 | 
						|
 | 
						|
Bool
 | 
						|
layerCreateGC (GCPtr pGC)
 | 
						|
{
 | 
						|
    Bool	    ret = TRUE;
 | 
						|
    LayerKindPtr    pLayKind;
 | 
						|
    ScreenPtr	    pScreen = pGC->pScreen;
 | 
						|
    layerScrPriv(pScreen);
 | 
						|
    layerGCPriv(pGC);
 | 
						|
    
 | 
						|
    /*
 | 
						|
     * XXX assume the first layer can handle all GCs
 | 
						|
     */
 | 
						|
    pLayKind = &pLayScr->kinds[0];
 | 
						|
    if (pLayScr->pLayers)
 | 
						|
	pLayKind = pLayScr->pLayers->pKind;
 | 
						|
    pLayGC->pKind = pLayKind;
 | 
						|
    LayerUnwrap (pScreen,pLayGC->pKind,CreateGC);
 | 
						|
    
 | 
						|
    if (!(*pScreen->CreateGC) (pGC))
 | 
						|
	ret = FALSE;
 | 
						|
    LayerWrap (pScreen,pLayKind,CreateGC,layerCreateGC);
 | 
						|
 | 
						|
    LayerWrap (pGC,pLayGC,funcs,&layerGCFuncs);
 | 
						|
 | 
						|
    return ret;
 | 
						|
}
 | 
						|
 | 
						|
void
 | 
						|
layerValidateGC(GCPtr         pGC,
 | 
						|
		unsigned long changes,
 | 
						|
		DrawablePtr   pDraw)
 | 
						|
{
 | 
						|
    layerGCPriv(pGC);
 | 
						|
    LayerKindPtr    pKind;
 | 
						|
    
 | 
						|
    if (pDraw->type == DRAWABLE_WINDOW)
 | 
						|
    {
 | 
						|
	layerWinPriv ((WindowPtr) pDraw);
 | 
						|
	pKind = layerWinLayer (pLayWin)->pKind;
 | 
						|
    }
 | 
						|
    else
 | 
						|
    {
 | 
						|
	/* XXX assume the first layer can handle all pixmaps */
 | 
						|
	layerScrPriv (pDraw->pScreen);
 | 
						|
	pKind = &pLayScr->kinds[0];
 | 
						|
	if (pLayScr->pLayers)
 | 
						|
	    pKind = pLayScr->pLayers->pKind;
 | 
						|
    }
 | 
						|
    
 | 
						|
    LayerUnwrap (pGC,pLayGC,funcs);
 | 
						|
    if (pKind != pLayGC->pKind)
 | 
						|
    {
 | 
						|
	/*
 | 
						|
	 * Clean up the previous user
 | 
						|
	 */
 | 
						|
	CreateGCProcPtr	CreateGC;
 | 
						|
	(*pGC->funcs->DestroyGC) (pGC);
 | 
						|
	
 | 
						|
	pGC->serialNumber = GC_CHANGE_SERIAL_BIT;
 | 
						|
 | 
						|
	pLayGC->pKind = pKind;
 | 
						|
	
 | 
						|
	/*
 | 
						|
	 * Temporarily unwrap Create GC and let
 | 
						|
	 * the new code setup the GC 
 | 
						|
	 */
 | 
						|
	CreateGC = pGC->pScreen->CreateGC;
 | 
						|
	LayerUnwrap (pGC->pScreen, pLayGC->pKind, CreateGC);
 | 
						|
	(*pGC->pScreen->CreateGC) (pGC);
 | 
						|
	LayerWrap (pGC->pScreen, pLayGC->pKind, CreateGC, CreateGC);
 | 
						|
    }
 | 
						|
    
 | 
						|
    (*pGC->funcs->ValidateGC) (pGC, changes, pDraw);
 | 
						|
    LayerWrap(pGC,pLayGC,funcs,&layerGCFuncs);
 | 
						|
}
 | 
						|
 | 
						|
void
 | 
						|
layerDestroyGC(GCPtr pGC)
 | 
						|
{
 | 
						|
    layerGCPriv(pGC);
 | 
						|
    LayerUnwrap (pGC,pLayGC,funcs);
 | 
						|
    (*pGC->funcs->DestroyGC)(pGC);
 | 
						|
    LayerWrap(pGC,pLayGC,funcs,&layerGCFuncs);
 | 
						|
}
 | 
						|
 | 
						|
void
 | 
						|
layerChangeGC (GCPtr		pGC,
 | 
						|
	       unsigned long	mask)
 | 
						|
{
 | 
						|
    layerGCPriv(pGC);
 | 
						|
    LayerUnwrap (pGC,pLayGC,funcs);
 | 
						|
    (*pGC->funcs->ChangeGC) (pGC, mask);
 | 
						|
    LayerWrap(pGC,pLayGC,funcs,&layerGCFuncs);
 | 
						|
}
 | 
						|
 | 
						|
void
 | 
						|
layerCopyGC (GCPtr	    pGCSrc, 
 | 
						|
	     unsigned long  mask,
 | 
						|
	     GCPtr	    pGCDst)
 | 
						|
{
 | 
						|
    layerGCPriv(pGCDst);
 | 
						|
    LayerUnwrap (pGCDst,pLayGC,funcs);
 | 
						|
    (*pGCDst->funcs->CopyGC) (pGCSrc, mask, pGCDst);
 | 
						|
    LayerWrap(pGCDst,pLayGC,funcs,&layerGCFuncs);
 | 
						|
}
 | 
						|
 | 
						|
void
 | 
						|
layerChangeClip (GCPtr	    pGC,
 | 
						|
		 int	    type,
 | 
						|
		 pointer    pvalue,
 | 
						|
		 int	    nrects)
 | 
						|
{
 | 
						|
    layerGCPriv(pGC);
 | 
						|
    LayerUnwrap (pGC,pLayGC,funcs);
 | 
						|
    (*pGC->funcs->ChangeClip) (pGC, type, pvalue, nrects);
 | 
						|
    LayerWrap(pGC,pLayGC,funcs,&layerGCFuncs);
 | 
						|
}
 | 
						|
 | 
						|
void
 | 
						|
layerCopyClip(GCPtr pGCDst, GCPtr pGCSrc)
 | 
						|
{
 | 
						|
    layerGCPriv(pGCDst);
 | 
						|
    LayerUnwrap (pGCDst,pLayGC,funcs);
 | 
						|
    (*pGCDst->funcs->CopyClip) (pGCDst, pGCSrc);
 | 
						|
    LayerWrap(pGCDst,pLayGC,funcs,&layerGCFuncs);
 | 
						|
}
 | 
						|
 | 
						|
void
 | 
						|
layerDestroyClip(GCPtr pGC)
 | 
						|
{
 | 
						|
    layerGCPriv(pGC);
 | 
						|
    LayerUnwrap (pGC,pLayGC,funcs);
 | 
						|
    (*pGC->funcs->DestroyClip) (pGC);
 | 
						|
    LayerWrap(pGC,pLayGC,funcs,&layerGCFuncs);
 | 
						|
}
 | 
						|
 |