229 lines
		
	
	
		
			7.1 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			229 lines
		
	
	
		
			7.1 KiB
		
	
	
	
		
			C
		
	
	
	
| /* $XFree86: xc/programs/Xserver/cfb/cfbscrinit.c,v 1.19 2001/01/17 22:36:36 dawes Exp $ */
 | |
| /************************************************************
 | |
| Copyright 1987 by Sun Microsystems, Inc. Mountain View, CA.
 | |
| 
 | |
|                     All Rights Reserved
 | |
| 
 | |
| Permission  to  use,  copy,  modify,  and  distribute   this
 | |
| software  and  its documentation for any purpose and without
 | |
| fee is hereby granted, provided that the above copyright no-
 | |
| tice  appear  in all copies and that both that copyright no-
 | |
| tice and this permission notice appear in  supporting  docu-
 | |
| mentation,  and  that the names of Sun or The Open Group
 | |
| not be used in advertising or publicity pertaining to 
 | |
| distribution  of  the software  without specific prior 
 | |
| written permission. Sun and The Open Group make no 
 | |
| representations about the suitability of this software for 
 | |
| any purpose. It is provided "as is" without any express or 
 | |
| implied warranty.
 | |
| 
 | |
| SUN DISCLAIMS ALL WARRANTIES WITH REGARD TO  THIS  SOFTWARE,
 | |
| INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FIT-
 | |
| NESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SUN BE  LI-
 | |
| ABLE  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.
 | |
| 
 | |
| ********************************************************/
 | |
| /* $Xorg: cfbscrinit.c,v 1.3 2000/08/17 19:48:15 cpqbld Exp $ */
 | |
| 
 | |
| #include <X11/X.h>
 | |
| #include <X11/Xmd.h>
 | |
| #include "servermd.h"
 | |
| #include "scrnintstr.h"
 | |
| #include "pixmapstr.h"
 | |
| #include "resource.h"
 | |
| #include "colormap.h"
 | |
| #include "colormapst.h"
 | |
| #include "cfb.h"
 | |
| #include "mi.h"
 | |
| #include "mistruct.h"
 | |
| #include "dix.h"
 | |
| #include "cfbmskbits.h"
 | |
| #include "mibstore.h"
 | |
| 
 | |
| BSFuncRec cfbBSFuncRec = {
 | |
|     cfbSaveAreas,
 | |
|     cfbRestoreAreas,
 | |
|     (BackingStoreSetClipmaskRgnProcPtr) 0,
 | |
|     (BackingStoreGetImagePixmapProcPtr) 0,
 | |
|     (BackingStoreGetSpansPixmapProcPtr) 0,
 | |
| };
 | |
| 
 | |
| Bool
 | |
| cfbCloseScreen (index, pScreen)
 | |
|     int		index;
 | |
|     ScreenPtr	pScreen;
 | |
| {
 | |
|     int	    d;
 | |
|     DepthPtr	depths = pScreen->allowedDepths;
 | |
| 
 | |
|     for (d = 0; d < pScreen->numDepths; d++)
 | |
| 	xfree (depths[d].vids);
 | |
|     xfree (depths);
 | |
|     xfree (pScreen->visuals);
 | |
| #ifdef CFB_NEED_SCREEN_PRIVATE
 | |
|     xfree (pScreen->devPrivates[cfbScreenPrivateIndex].ptr);
 | |
| #else
 | |
|     xfree (pScreen->devPrivate);
 | |
| #endif
 | |
|     return TRUE;
 | |
| }
 | |
| 
 | |
| static void DestroyColormapNoop(
 | |
|         ColormapPtr pColormap)
 | |
| {
 | |
|     /* NOOP */
 | |
| }
 | |
| 
 | |
| static void StoreColorsNoop(
 | |
|         ColormapPtr pColormap,
 | |
|         int ndef,
 | |
|         xColorItem * pdef)
 | |
| {
 | |
|     /* NOOP */
 | |
| }
 | |
| 
 | |
| Bool
 | |
| cfbSetupScreen(pScreen, pbits, xsize, ysize, dpix, dpiy, width)
 | |
|     register ScreenPtr pScreen;
 | |
|     pointer pbits;		/* pointer to screen bitmap */
 | |
|     int xsize, ysize;		/* in pixels */
 | |
|     int dpix, dpiy;		/* dots per inch */
 | |
|     int width;			/* pixel width of frame buffer */
 | |
| {
 | |
|     if (!cfbAllocatePrivates(pScreen, (int *) 0, (int *) 0))
 | |
| 	return FALSE;
 | |
|     pScreen->defColormap = FakeClientID(0);
 | |
|     /* let CreateDefColormap do whatever it wants for pixels */ 
 | |
|     pScreen->blackPixel = pScreen->whitePixel = (Pixel) 0;
 | |
|     pScreen->QueryBestSize = mfbQueryBestSizeWeak();
 | |
|     /* SaveScreen */
 | |
|     pScreen->GetImage = cfbGetImage;
 | |
|     pScreen->GetSpans = cfbGetSpans;
 | |
|     pScreen->CreateWindow = cfbCreateWindow;
 | |
|     pScreen->DestroyWindow = cfbDestroyWindow;
 | |
|     pScreen->PositionWindow = cfbPositionWindow;
 | |
|     pScreen->ChangeWindowAttributes = cfbChangeWindowAttributes;
 | |
|     pScreen->RealizeWindow = cfbMapWindow;
 | |
|     pScreen->UnrealizeWindow = cfbUnmapWindow;
 | |
|     pScreen->PaintWindowBackground = cfbPaintWindow;
 | |
|     pScreen->PaintWindowBorder = cfbPaintWindow;
 | |
|     pScreen->CopyWindow = cfbCopyWindow;
 | |
|     pScreen->CreatePixmap = cfbCreatePixmap;
 | |
|     pScreen->DestroyPixmap = cfbDestroyPixmap;
 | |
|     pScreen->RealizeFont = mfbRealizeFontWeak();
 | |
|     pScreen->UnrealizeFont = mfbUnrealizeFontWeak();
 | |
|     pScreen->CreateGC = cfbCreateGC;
 | |
|     pScreen->CreateColormap = cfbInitializeColormap;
 | |
|     pScreen->DestroyColormap = DestroyColormapNoop;
 | |
|     pScreen->InstallColormap = cfbInstallColormap;
 | |
|     pScreen->UninstallColormap = cfbUninstallColormap;
 | |
|     pScreen->ListInstalledColormaps = cfbListInstalledColormaps;
 | |
|     pScreen->StoreColors = StoreColorsNoop;
 | |
|     pScreen->ResolveColor = cfbResolveColor;
 | |
|     pScreen->BitmapToRegion = mfbPixmapToRegionWeak();
 | |
| 
 | |
|     mfbRegisterCopyPlaneProc (pScreen, cfbCopyPlane);
 | |
|     return TRUE;
 | |
| }
 | |
| 
 | |
| #ifdef CFB_NEED_SCREEN_PRIVATE
 | |
| Bool
 | |
| cfbCreateScreenResources(pScreen)
 | |
|     ScreenPtr pScreen;
 | |
| {
 | |
|     Bool retval;
 | |
| 
 | |
|     pointer oldDevPrivate = pScreen->devPrivate;
 | |
|     pScreen->devPrivate = pScreen->devPrivates[cfbScreenPrivateIndex].ptr;
 | |
|     retval = miCreateScreenResources(pScreen);
 | |
|     pScreen->devPrivates[cfbScreenPrivateIndex].ptr = pScreen->devPrivate;
 | |
|     pScreen->devPrivate = oldDevPrivate;
 | |
|     return retval;
 | |
| }
 | |
| #endif
 | |
| 
 | |
| Bool
 | |
| cfbFinishScreenInit(pScreen, pbits, xsize, ysize, dpix, dpiy, width)
 | |
|     register ScreenPtr pScreen;
 | |
|     pointer pbits;		/* pointer to screen bitmap */
 | |
|     int xsize, ysize;		/* in pixels */
 | |
|     int dpix, dpiy;		/* dots per inch */
 | |
|     int width;			/* pixel width of frame buffer */
 | |
| {
 | |
| #ifdef CFB_NEED_SCREEN_PRIVATE
 | |
|     pointer oldDevPrivate;
 | |
| #endif
 | |
|     VisualPtr	visuals;
 | |
|     DepthPtr	depths;
 | |
|     int		nvisuals;
 | |
|     int		ndepths;
 | |
|     int		rootdepth;
 | |
|     VisualID	defaultVisual;
 | |
| 
 | |
|     rootdepth = 0;
 | |
|     if (!cfbInitVisuals (&visuals, &depths, &nvisuals, &ndepths, &rootdepth,
 | |
| 			 &defaultVisual,((unsigned long)1<<(PSZ-1)), 8))
 | |
| 	return FALSE;
 | |
| #ifdef CFB_NEED_SCREEN_PRIVATE
 | |
|     oldDevPrivate = pScreen->devPrivate;
 | |
| #endif
 | |
|     if (! miScreenInit(pScreen, pbits, xsize, ysize, dpix, dpiy, width,
 | |
| 			rootdepth, ndepths, depths,
 | |
| 			defaultVisual, nvisuals, visuals))
 | |
| 	return FALSE;
 | |
|     /* overwrite miCloseScreen with our own */
 | |
|     pScreen->CloseScreen = cfbCloseScreen;
 | |
| #ifdef CFB_NEED_SCREEN_PRIVATE
 | |
|     pScreen->CreateScreenResources = cfbCreateScreenResources;
 | |
|     pScreen->devPrivates[cfbScreenPrivateIndex].ptr = pScreen->devPrivate;
 | |
|     pScreen->devPrivate = oldDevPrivate;
 | |
| #endif
 | |
|     pScreen->BackingStoreFuncs = cfbBSFuncRec;
 | |
|     pScreen->GetScreenPixmap = cfbGetScreenPixmap;
 | |
|     pScreen->SetScreenPixmap = cfbSetScreenPixmap;
 | |
|     return TRUE;
 | |
| }
 | |
| 
 | |
| /* dts * (inch/dot) * (25.4 mm / inch) = mm */
 | |
| Bool
 | |
| cfbScreenInit(pScreen, pbits, xsize, ysize, dpix, dpiy, width)
 | |
|     register ScreenPtr pScreen;
 | |
|     pointer pbits;		/* pointer to screen bitmap */
 | |
|     int xsize, ysize;		/* in pixels */
 | |
|     int dpix, dpiy;		/* dots per inch */
 | |
|     int width;			/* pixel width of frame buffer */
 | |
| {
 | |
|     if (!cfbSetupScreen(pScreen, pbits, xsize, ysize, dpix, dpiy, width))
 | |
| 	return FALSE;
 | |
|     return cfbFinishScreenInit(pScreen, pbits, xsize, ysize, dpix, dpiy, width);
 | |
| }
 | |
| 
 | |
| PixmapPtr
 | |
| cfbGetScreenPixmap(pScreen)
 | |
|     ScreenPtr pScreen;
 | |
| {
 | |
| #ifdef CFB_NEED_SCREEN_PRIVATE
 | |
|     return (PixmapPtr)pScreen->devPrivates[cfbScreenPrivateIndex].ptr;
 | |
| #else
 | |
|     return (PixmapPtr)pScreen->devPrivate;
 | |
| #endif
 | |
| }
 | |
| 
 | |
| void
 | |
| cfbSetScreenPixmap(pPix)
 | |
|     PixmapPtr pPix;
 | |
| {
 | |
| #ifdef CFB_NEED_SCREEN_PRIVATE
 | |
|     if (pPix)
 | |
| 	pPix->drawable.pScreen->devPrivates[cfbScreenPrivateIndex].ptr =
 | |
| 	    (pointer)pPix;
 | |
| #else
 | |
|     if (pPix)
 | |
| 	pPix->drawable.pScreen->devPrivate = (pointer)pPix;
 | |
| #endif
 | |
| }
 |