230 lines
7.3 KiB
C
230 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 */
|
|
|
|
#include "X.h"
|
|
#include "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
|
|
}
|