152 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			152 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			C
		
	
	
	
| /*
 | |
| 
 | |
| Copyright 1993, 1998  The Open Group
 | |
| 
 | |
| 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.
 | |
| 
 | |
| The above copyright notice and this permission notice shall be included
 | |
| in all copies or substantial portions of the Software.
 | |
| 
 | |
| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 | |
| OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 | |
| MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
 | |
| IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR
 | |
| OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
 | |
| ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
 | |
| OTHER DEALINGS IN THE SOFTWARE.
 | |
| 
 | |
| Except as contained in this notice, the name of The Open Group shall
 | |
| not be used in advertising or otherwise to promote the sale, use or
 | |
| other dealings in this Software without prior written authorization
 | |
| from The Open Group.
 | |
| 
 | |
| */
 | |
| 
 | |
| #ifdef HAVE_DIX_CONFIG_H
 | |
| #include <dix-config.h>
 | |
| #endif
 | |
| 
 | |
| #include <X11/X.h>
 | |
| #include "scrnintstr.h"
 | |
| #include "misc.h"
 | |
| #include "os.h"
 | |
| #include "windowstr.h"
 | |
| #include "resource.h"
 | |
| #include "dixstruct.h"
 | |
| #include "gcstruct.h"
 | |
| #include "servermd.h"
 | |
| #include "site.h"
 | |
| 
 | |
| 
 | |
| /*
 | |
|  *  Scratch pixmap management and device independent pixmap allocation
 | |
|  *  function.
 | |
|  */
 | |
| 
 | |
| 
 | |
| /* callable by ddx */
 | |
| _X_EXPORT PixmapPtr
 | |
| GetScratchPixmapHeader(ScreenPtr pScreen, int width, int height, int depth, 
 | |
|                        int bitsPerPixel, int devKind, pointer pPixData)
 | |
| {
 | |
|     PixmapPtr pPixmap = pScreen->pScratchPixmap;
 | |
| 
 | |
|     if (pPixmap)
 | |
| 	pScreen->pScratchPixmap = NULL;
 | |
|     else
 | |
| 	/* width and height of 0 means don't allocate any pixmap data */
 | |
| 	pPixmap = (*pScreen->CreatePixmap)(pScreen, 0, 0, depth);
 | |
| 
 | |
|     if (pPixmap) {
 | |
| 	if ((*pScreen->ModifyPixmapHeader)(pPixmap, width, height, depth,
 | |
| 					   bitsPerPixel, devKind, pPixData))
 | |
| 	    return pPixmap;
 | |
| 	(*pScreen->DestroyPixmap)(pPixmap);
 | |
|     }
 | |
|     return NullPixmap;
 | |
| }
 | |
| 
 | |
| 
 | |
| /* callable by ddx */
 | |
| _X_EXPORT void
 | |
| FreeScratchPixmapHeader(PixmapPtr pPixmap)
 | |
| {
 | |
|     if (pPixmap)
 | |
|     {
 | |
| 	ScreenPtr pScreen = pPixmap->drawable.pScreen;
 | |
| 
 | |
| 	pPixmap->devPrivate.ptr = NULL; /* lest ddx chases bad ptr */
 | |
| 	if (pScreen->pScratchPixmap)
 | |
| 	    (*pScreen->DestroyPixmap)(pPixmap);
 | |
| 	else
 | |
| 	    pScreen->pScratchPixmap = pPixmap;
 | |
|     }
 | |
| }
 | |
| 
 | |
| 
 | |
| Bool
 | |
| CreateScratchPixmapsForScreen(int scrnum)
 | |
| {
 | |
|     /* let it be created on first use */
 | |
|     screenInfo.screens[scrnum]->pScratchPixmap = NULL;
 | |
|     return TRUE;
 | |
| }
 | |
| 
 | |
| 
 | |
| void
 | |
| FreeScratchPixmapsForScreen(int scrnum)
 | |
| {
 | |
|     FreeScratchPixmapHeader(screenInfo.screens[scrnum]->pScratchPixmap);
 | |
| }
 | |
| 
 | |
| 
 | |
| /* callable by ddx */
 | |
| _X_EXPORT PixmapPtr
 | |
| AllocatePixmap(ScreenPtr pScreen, int pixDataSize)
 | |
| {
 | |
|     PixmapPtr pPixmap;
 | |
| #ifdef PIXPRIV
 | |
|     char *ptr;
 | |
|     DevUnion *ppriv;
 | |
|     unsigned *sizes;
 | |
|     unsigned size;
 | |
|     int i;
 | |
| 
 | |
|     if (pScreen->totalPixmapSize > ((size_t)-1) - pixDataSize)
 | |
| 	return NullPixmap;
 | |
|     
 | |
|     pPixmap = (PixmapPtr)xalloc(pScreen->totalPixmapSize + pixDataSize);
 | |
|     if (!pPixmap)
 | |
| 	return NullPixmap;
 | |
|     ppriv = (DevUnion *)(pPixmap + 1);
 | |
|     pPixmap->devPrivates = ppriv;
 | |
|     sizes = pScreen->PixmapPrivateSizes;
 | |
|     ptr = (char *)(ppriv + pScreen->PixmapPrivateLen);
 | |
|     for (i = pScreen->PixmapPrivateLen; --i >= 0; ppriv++, sizes++)
 | |
|     {
 | |
|         if ((size = *sizes) != 0)
 | |
|         {
 | |
| 	    ppriv->ptr = (pointer)ptr;
 | |
| 	    ptr += size;
 | |
|         }
 | |
|         else
 | |
| 	    ppriv->ptr = (pointer)NULL;
 | |
|     }
 | |
| #else
 | |
|     pPixmap = (PixmapPtr)xalloc(sizeof(PixmapRec) + pixDataSize);
 | |
| #endif
 | |
| 
 | |
| #ifdef _XSERVER64
 | |
|     if (pPixmap) {
 | |
| 	pPixmap->drawable.pad0 = 0;
 | |
| 	pPixmap->drawable.pad1 = 0;
 | |
|     }
 | |
| #endif
 | |
| 
 | |
|     return pPixmap;
 | |
| }
 |