234 lines
		
	
	
		
			7.3 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			234 lines
		
	
	
		
			7.3 KiB
		
	
	
	
		
			C
		
	
	
	
| /* $XFree86: xc/programs/Xserver/iplan2p4/iplscrinit.c,v 3.2 1998/06/27 12:55:03 hohndel 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 X Consortium
 | |
| not be used in advertising or publicity pertaining to 
 | |
| distribution  of  the software  without specific prior 
 | |
| written permission. Sun and X Consortium 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.
 | |
| 
 | |
| ********************************************************/
 | |
| /* $XConsortium: iplscrinit.c,v 5.32 94/04/17 20:29:00 dpw Exp $ */
 | |
| 
 | |
| /* Modified nov 94 by Martin Schaller (Martin_Schaller@maus.r.de) for use with
 | |
| interleaved planes */
 | |
| 
 | |
| #ifdef HAVE_DIX_CONFIG_H
 | |
| #include <dix-config.h>
 | |
| #endif
 | |
| 
 | |
| #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 "ipl.h"
 | |
| #include "mi.h"
 | |
| #include "mistruct.h"
 | |
| #include "dix.h"
 | |
| #include "mibstore.h"
 | |
| 
 | |
| 
 | |
| BSFuncRec iplBSFuncRec = {
 | |
|     iplSaveAreas,
 | |
|     iplRestoreAreas,
 | |
|     (BackingStoreSetClipmaskRgnProcPtr) 0,
 | |
|     (BackingStoreGetImagePixmapProcPtr) 0,
 | |
|     (BackingStoreGetSpansPixmapProcPtr) 0,
 | |
| };
 | |
| 
 | |
| Bool
 | |
| iplCloseScreen (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[iplScreenPrivateIndex].ptr);
 | |
| #else
 | |
|     xfree (pScreen->devPrivate);
 | |
| #endif
 | |
|     return TRUE;
 | |
| }
 | |
| 
 | |
| Bool
 | |
| iplSetupScreen(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 */
 | |
| {
 | |
|     int	i;
 | |
|     extern RegionPtr	(*iplPuntCopyPlane)();
 | |
| 
 | |
|     if (!iplAllocatePrivates(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 = mfbQueryBestSize;
 | |
|     /* SaveScreen */
 | |
|     pScreen->GetImage = iplGetImage;
 | |
|     pScreen->GetSpans = iplGetSpans;
 | |
|     pScreen->CreateWindow = iplCreateWindow;
 | |
|     pScreen->DestroyWindow = iplDestroyWindow;
 | |
|     pScreen->PositionWindow = iplPositionWindow;
 | |
|     pScreen->ChangeWindowAttributes = iplChangeWindowAttributes;
 | |
|     pScreen->RealizeWindow = iplMapWindow;
 | |
|     pScreen->UnrealizeWindow = iplUnmapWindow;
 | |
|     pScreen->PaintWindowBackground = iplPaintWindow;
 | |
|     pScreen->PaintWindowBorder = iplPaintWindow;
 | |
|     pScreen->CopyWindow = iplCopyWindow;
 | |
|     pScreen->CreatePixmap = iplCreatePixmap;
 | |
|     pScreen->DestroyPixmap = iplDestroyPixmap;
 | |
|     pScreen->RealizeFont = mfbRealizeFont;
 | |
|     pScreen->UnrealizeFont = mfbUnrealizeFont;
 | |
|     pScreen->CreateGC = iplCreateGC;
 | |
|     pScreen->CreateColormap = iplInitializeColormap;
 | |
|     pScreen->DestroyColormap = (void (*)())NoopDDA;
 | |
|     pScreen->InstallColormap = iplInstallColormap;
 | |
|     pScreen->UninstallColormap = iplUninstallColormap;
 | |
|     pScreen->ListInstalledColormaps = iplListInstalledColormaps;
 | |
|     pScreen->StoreColors = (void (*)())NoopDDA;
 | |
|     pScreen->ResolveColor = iplResolveColor;
 | |
|     pScreen->BitmapToRegion = mfbPixmapToRegion;
 | |
| 
 | |
|     mfbRegisterCopyPlaneProc (pScreen, iplCopyPlane);
 | |
|     return TRUE;
 | |
| }
 | |
| 
 | |
| #ifdef CFB_NEED_SCREEN_PRIVATE
 | |
| Bool
 | |
| iplCreateScreenResources(pScreen)
 | |
|     ScreenPtr pScreen;
 | |
| {
 | |
|     Bool retval;
 | |
| 
 | |
|     pointer oldDevPrivate = pScreen->devPrivate;
 | |
|     pScreen->devPrivate = pScreen->devPrivates[iplScreenPrivateIndex].ptr;
 | |
|     retval = miCreateScreenResources(pScreen);
 | |
|     pScreen->devPrivates[iplScreenPrivateIndex].ptr = pScreen->devPrivate;
 | |
|     pScreen->devPrivate = oldDevPrivate;
 | |
|     return retval;
 | |
| }
 | |
| #endif
 | |
| 
 | |
| Bool
 | |
| iplFinishScreenInit(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 */
 | |
| {
 | |
|     int	i, j;
 | |
| #ifdef CFB_NEED_SCREEN_PRIVATE
 | |
|     pointer oldDevPrivate;
 | |
| #endif
 | |
|     VisualPtr	visuals;
 | |
|     DepthPtr	depths;
 | |
|     int		nvisuals;
 | |
|     int		ndepths;
 | |
|     int		rootdepth;
 | |
|     VisualID	defaultVisual;
 | |
| 
 | |
|     rootdepth = 0;
 | |
|     if (!iplInitVisuals (&visuals, &depths, &nvisuals, &ndepths, &rootdepth,
 | |
| 			 &defaultVisual,((unsigned long)1<<(INTER_PLANES-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 = iplCloseScreen;
 | |
| #ifdef CFB_NEED_SCREEN_PRIVATE
 | |
|     pScreen->CreateScreenResources = iplCreateScreenResources;
 | |
|     pScreen->devPrivates[iplScreenPrivateIndex].ptr = pScreen->devPrivate;
 | |
|     pScreen->devPrivate = oldDevPrivate;
 | |
| #endif
 | |
|     pScreen->BackingStoreFuncs = iplBSFuncRec;
 | |
|     pScreen->GetScreenPixmap = iplGetScreenPixmap;
 | |
|     pScreen->SetScreenPixmap = iplSetScreenPixmap;
 | |
|     return TRUE;
 | |
| }
 | |
| 
 | |
| /* dts * (inch/dot) * (25.4 mm / inch) = mm */
 | |
| Bool
 | |
| iplScreenInit(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 (!iplSetupScreen(pScreen, pbits, xsize, ysize, dpix, dpiy, width))
 | |
| 	return FALSE;
 | |
|     if (!iplFinishScreenInit(pScreen, pbits, xsize, ysize, dpix, dpiy, width))
 | |
| 	return FALSE;
 | |
| #if INTER_PLANES == 2
 | |
| /* This shouldn't be necessary */
 | |
|     PixmapWidthPaddingInfo[2].padPixelsLog2 = 4;
 | |
|     PixmapWidthPaddingInfo[2].padRoundUp = 15;
 | |
|     PixmapWidthPaddingInfo[2].padBytesLog2 = 2;
 | |
| #endif
 | |
|     return TRUE;
 | |
| }
 | |
| 
 | |
| PixmapPtr
 | |
| iplGetScreenPixmap(pScreen)
 | |
|     ScreenPtr pScreen;
 | |
| {
 | |
| #ifdef CFB_NEED_SCREEN_PRIVATE
 | |
|     return (PixmapPtr)(pScreen->devPrivates[iplScreenPrivateIndex].ptr);
 | |
| #else
 | |
|     return (PixmapPtr)(pScreen->devPrivate.ptr);
 | |
| #endif
 | |
| }
 | |
| 
 | |
| void
 | |
| iplSetScreenPixmap(pPix)
 | |
|     PixmapPtr pPix;
 | |
| {
 | |
| #ifdef CFB_NEED_SCREEN_PRIVATE
 | |
|     if (pPix)
 | |
| 	pPix->drawable.pScreen->devPrivates[iplScreenPrivateIndex].ptr =
 | |
| 	    (pointer)pPix;
 | |
| #else
 | |
|     if (pPix)
 | |
| 	pPix->drawable.pScreen->devPrivate.ptr = (pointer)pPix;
 | |
| #endif
 | |
| }
 |