341 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			341 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			C
		
	
	
	
/*
 | 
						|
 | 
						|
Copyright 1990, 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 "servermd.h"
 | 
						|
#include "misc.h"
 | 
						|
#include "mi.h"
 | 
						|
#include "scrnintstr.h"
 | 
						|
#include "pixmapstr.h"
 | 
						|
#include "dix.h"
 | 
						|
#include "miline.h"
 | 
						|
#ifdef MITSHM
 | 
						|
#define _XSHM_SERVER_
 | 
						|
#include <X11/extensions/XShm.h>
 | 
						|
#endif
 | 
						|
 | 
						|
/* We use this structure to propogate some information from miScreenInit to
 | 
						|
 * miCreateScreenResources.  miScreenInit allocates the structure, fills it
 | 
						|
 * in, and puts it into pScreen->devPrivate.  miCreateScreenResources 
 | 
						|
 * extracts the info and frees the structure.  We could've accomplished the
 | 
						|
 * same thing by adding fields to the screen structure, but they would have
 | 
						|
 * ended up being redundant, and would have exposed this mi implementation
 | 
						|
 * detail to the whole server.
 | 
						|
 */
 | 
						|
 | 
						|
typedef struct
 | 
						|
{
 | 
						|
    pointer pbits; /* pointer to framebuffer */
 | 
						|
    int width;    /* delta to add to a framebuffer addr to move one row down */
 | 
						|
} miScreenInitParmsRec, *miScreenInitParmsPtr;
 | 
						|
 | 
						|
 | 
						|
/* this plugs into pScreen->ModifyPixmapHeader */
 | 
						|
_X_EXPORT Bool
 | 
						|
miModifyPixmapHeader(pPixmap, width, height, depth, bitsPerPixel, devKind,
 | 
						|
		     pPixData)
 | 
						|
    PixmapPtr   pPixmap;
 | 
						|
    int		width;
 | 
						|
    int		height;
 | 
						|
    int		depth;
 | 
						|
    int		bitsPerPixel;
 | 
						|
    int		devKind;
 | 
						|
    pointer     pPixData;
 | 
						|
{
 | 
						|
    if (!pPixmap)
 | 
						|
	return FALSE;
 | 
						|
 | 
						|
    /*
 | 
						|
     * If all arguments are specified, reinitialize everything (including
 | 
						|
     * validated state).
 | 
						|
     */
 | 
						|
    if ((width > 0) && (height > 0) && (depth > 0) && (bitsPerPixel > 0) &&
 | 
						|
	(devKind > 0) && pPixData) {
 | 
						|
	pPixmap->drawable.depth = depth;
 | 
						|
	pPixmap->drawable.bitsPerPixel = bitsPerPixel;
 | 
						|
	pPixmap->drawable.id = 0;
 | 
						|
	pPixmap->drawable.serialNumber = NEXT_SERIAL_NUMBER;
 | 
						|
	pPixmap->drawable.x = 0;
 | 
						|
	pPixmap->drawable.y = 0;
 | 
						|
	pPixmap->drawable.width = width;
 | 
						|
	pPixmap->drawable.height = height;
 | 
						|
	pPixmap->devKind = devKind;
 | 
						|
	pPixmap->refcnt = 1;
 | 
						|
	pPixmap->devPrivate.ptr = pPixData;
 | 
						|
    } else {
 | 
						|
	/*
 | 
						|
	 * Only modify specified fields, keeping all others intact.
 | 
						|
	 */
 | 
						|
 | 
						|
	if (width > 0)
 | 
						|
	    pPixmap->drawable.width = width;
 | 
						|
 | 
						|
	if (height > 0)
 | 
						|
	    pPixmap->drawable.height = height;
 | 
						|
 | 
						|
	if (depth > 0)
 | 
						|
	    pPixmap->drawable.depth = depth;
 | 
						|
 | 
						|
	if (bitsPerPixel > 0)
 | 
						|
	    pPixmap->drawable.bitsPerPixel = bitsPerPixel;
 | 
						|
	else if ((bitsPerPixel < 0) && (depth > 0))
 | 
						|
	    pPixmap->drawable.bitsPerPixel = BitsPerPixel(depth);
 | 
						|
 | 
						|
	/*
 | 
						|
	 * CAVEAT:  Non-SI DDXen may use devKind and devPrivate fields for
 | 
						|
	 *          other purposes.
 | 
						|
	 */
 | 
						|
	if (devKind > 0)
 | 
						|
	    pPixmap->devKind = devKind;
 | 
						|
	else if ((devKind < 0) && ((width > 0) || (depth > 0)))
 | 
						|
	    pPixmap->devKind = PixmapBytePad(pPixmap->drawable.width,
 | 
						|
		pPixmap->drawable.depth);
 | 
						|
 | 
						|
	if (pPixData)
 | 
						|
	    pPixmap->devPrivate.ptr = pPixData;
 | 
						|
    }
 | 
						|
    return TRUE;
 | 
						|
}
 | 
						|
 | 
						|
static Bool
 | 
						|
miCloseScreen (int iScreen, ScreenPtr pScreen)
 | 
						|
{
 | 
						|
    return ((*pScreen->DestroyPixmap)((PixmapPtr)pScreen->devPrivate));
 | 
						|
}
 | 
						|
 | 
						|
/* With the introduction of pixmap privates, the "screen pixmap" can no
 | 
						|
 * longer be created in miScreenInit, since all the modules that could
 | 
						|
 * possibly ask for pixmap private space have not been initialized at
 | 
						|
 * that time.  pScreen->CreateScreenResources is called after all
 | 
						|
 * possible private-requesting modules have been inited; we create the
 | 
						|
 * screen pixmap here.
 | 
						|
 */
 | 
						|
_X_EXPORT Bool
 | 
						|
miCreateScreenResources(pScreen)
 | 
						|
    ScreenPtr pScreen;
 | 
						|
{
 | 
						|
    miScreenInitParmsPtr pScrInitParms;
 | 
						|
    pointer value;
 | 
						|
 | 
						|
    pScrInitParms = (miScreenInitParmsPtr)pScreen->devPrivate;
 | 
						|
 | 
						|
    /* if width is non-zero, pScreen->devPrivate will be a pixmap
 | 
						|
     * else it will just take the value pbits
 | 
						|
     */
 | 
						|
    if (pScrInitParms->width)
 | 
						|
    {
 | 
						|
	PixmapPtr pPixmap;
 | 
						|
 | 
						|
	/* create a pixmap with no data, then redirect it to point to
 | 
						|
	 * the screen
 | 
						|
	 */
 | 
						|
	pPixmap = (*pScreen->CreatePixmap)(pScreen, 0, 0, pScreen->rootDepth);
 | 
						|
	if (!pPixmap)
 | 
						|
	    return FALSE;
 | 
						|
 | 
						|
	if (!(*pScreen->ModifyPixmapHeader)(pPixmap, pScreen->width,
 | 
						|
		    pScreen->height, pScreen->rootDepth,
 | 
						|
		    BitsPerPixel(pScreen->rootDepth),
 | 
						|
		    PixmapBytePad(pScrInitParms->width, pScreen->rootDepth),
 | 
						|
		    pScrInitParms->pbits))
 | 
						|
	    return FALSE;
 | 
						|
	value = (pointer)pPixmap;
 | 
						|
    }
 | 
						|
    else
 | 
						|
    {
 | 
						|
	value = pScrInitParms->pbits;
 | 
						|
    }
 | 
						|
    xfree(pScreen->devPrivate); /* freeing miScreenInitParmsRec */
 | 
						|
    pScreen->devPrivate = value; /* pPixmap or pbits */
 | 
						|
    return TRUE;
 | 
						|
}
 | 
						|
 | 
						|
Bool
 | 
						|
miScreenDevPrivateInit(pScreen, width, pbits)
 | 
						|
    ScreenPtr pScreen;
 | 
						|
    int width;
 | 
						|
    pointer pbits;
 | 
						|
{
 | 
						|
    miScreenInitParmsPtr pScrInitParms;
 | 
						|
 | 
						|
    /* Stash pbits and width in a short-lived miScreenInitParmsRec attached
 | 
						|
     * to the screen, until CreateScreenResources can put them in the
 | 
						|
     * screen pixmap.
 | 
						|
     */
 | 
						|
    pScrInitParms = (miScreenInitParmsPtr)xalloc(sizeof(miScreenInitParmsRec));
 | 
						|
    if (!pScrInitParms)
 | 
						|
	return FALSE;
 | 
						|
    pScrInitParms->pbits = pbits;
 | 
						|
    pScrInitParms->width = width;
 | 
						|
    pScreen->devPrivate = (pointer)pScrInitParms;
 | 
						|
    return TRUE;
 | 
						|
}
 | 
						|
 | 
						|
_X_EXPORT Bool
 | 
						|
miScreenInit(pScreen, pbits, xsize, ysize, dpix, dpiy, width,
 | 
						|
	     rootDepth, numDepths, depths, rootVisual, numVisuals, visuals)
 | 
						|
    ScreenPtr pScreen;
 | 
						|
    pointer pbits;		/* pointer to screen bits */
 | 
						|
    int xsize, ysize;		/* in pixels */
 | 
						|
    int dpix, dpiy;		/* dots per inch */
 | 
						|
    int width;			/* pixel width of frame buffer */
 | 
						|
    int rootDepth;		/* depth of root window */
 | 
						|
    int numDepths;		/* number of depths supported */
 | 
						|
    DepthRec *depths;		/* supported depths */
 | 
						|
    VisualID rootVisual;	/* root visual */
 | 
						|
    int numVisuals;		/* number of visuals supported */
 | 
						|
    VisualRec *visuals;		/* supported visuals */
 | 
						|
{
 | 
						|
    pScreen->width = xsize;
 | 
						|
    pScreen->height = ysize;
 | 
						|
    pScreen->mmWidth = (xsize * 254 + dpix * 5) / (dpix * 10);
 | 
						|
    pScreen->mmHeight = (ysize * 254 + dpiy * 5) / (dpiy * 10);
 | 
						|
    pScreen->numDepths = numDepths;
 | 
						|
    pScreen->rootDepth = rootDepth;
 | 
						|
    pScreen->allowedDepths = depths;
 | 
						|
    pScreen->rootVisual = rootVisual;
 | 
						|
    /* defColormap */
 | 
						|
    pScreen->minInstalledCmaps = 1;
 | 
						|
    pScreen->maxInstalledCmaps = 1;
 | 
						|
    pScreen->backingStoreSupport = NotUseful;
 | 
						|
    pScreen->saveUnderSupport = NotUseful;
 | 
						|
    /* whitePixel, blackPixel */
 | 
						|
    pScreen->ModifyPixmapHeader = miModifyPixmapHeader;
 | 
						|
    pScreen->CreateScreenResources = miCreateScreenResources;
 | 
						|
    pScreen->GetScreenPixmap = miGetScreenPixmap;
 | 
						|
    pScreen->SetScreenPixmap = miSetScreenPixmap;
 | 
						|
    pScreen->numVisuals = numVisuals;
 | 
						|
    pScreen->visuals = visuals;
 | 
						|
    if (width)
 | 
						|
    {
 | 
						|
#ifdef MITSHM
 | 
						|
	ShmRegisterFbFuncs(pScreen);
 | 
						|
#endif
 | 
						|
	pScreen->CloseScreen = miCloseScreen;
 | 
						|
    }
 | 
						|
    /* else CloseScreen */
 | 
						|
    /* QueryBestSize, SaveScreen, GetImage, GetSpans */
 | 
						|
    pScreen->PointerNonInterestBox = (PointerNonInterestBoxProcPtr) 0;
 | 
						|
    pScreen->SourceValidate = (SourceValidateProcPtr) 0;
 | 
						|
    /* CreateWindow, DestroyWindow, PositionWindow, ChangeWindowAttributes */
 | 
						|
    /* RealizeWindow, UnrealizeWindow */
 | 
						|
    pScreen->ValidateTree = miValidateTree;
 | 
						|
    pScreen->PostValidateTree = (PostValidateTreeProcPtr) 0;
 | 
						|
    pScreen->WindowExposures = miWindowExposures;
 | 
						|
    /* PaintWindowBackground, PaintWindowBorder, CopyWindow */
 | 
						|
    pScreen->ClearToBackground = miClearToBackground;
 | 
						|
    pScreen->ClipNotify = (ClipNotifyProcPtr) 0;
 | 
						|
    pScreen->RestackWindow = (RestackWindowProcPtr) 0;
 | 
						|
    /* CreatePixmap, DestroyPixmap */
 | 
						|
    /* RealizeFont, UnrealizeFont */
 | 
						|
    /* CreateGC */
 | 
						|
    /* CreateColormap, DestroyColormap, InstallColormap, UninstallColormap */
 | 
						|
    /* ListInstalledColormaps, StoreColors, ResolveColor */
 | 
						|
    /* BitmapToRegion */
 | 
						|
    pScreen->SendGraphicsExpose = miSendGraphicsExpose;
 | 
						|
    pScreen->BlockHandler = (ScreenBlockHandlerProcPtr)NoopDDA;
 | 
						|
    pScreen->WakeupHandler = (ScreenWakeupHandlerProcPtr)NoopDDA;
 | 
						|
    pScreen->blockData = (pointer)0;
 | 
						|
    pScreen->wakeupData = (pointer)0;
 | 
						|
    pScreen->MarkWindow = miMarkWindow;
 | 
						|
    pScreen->MarkOverlappedWindows = miMarkOverlappedWindows;
 | 
						|
    pScreen->ChangeSaveUnder = miChangeSaveUnder;
 | 
						|
    pScreen->PostChangeSaveUnder = miPostChangeSaveUnder;
 | 
						|
    pScreen->MoveWindow = miMoveWindow;
 | 
						|
    pScreen->ResizeWindow = miSlideAndSizeWindow;
 | 
						|
    pScreen->GetLayerWindow = miGetLayerWindow;
 | 
						|
    pScreen->HandleExposures = miHandleValidateExposures;
 | 
						|
    pScreen->ReparentWindow = (ReparentWindowProcPtr) 0;
 | 
						|
    pScreen->ChangeBorderWidth = miChangeBorderWidth;
 | 
						|
#ifdef SHAPE
 | 
						|
    pScreen->SetShape = miSetShape;
 | 
						|
#endif
 | 
						|
    pScreen->MarkUnrealizedWindow = miMarkUnrealizedWindow;
 | 
						|
 | 
						|
    pScreen->SaveDoomedAreas = 0;
 | 
						|
    pScreen->RestoreAreas = 0;
 | 
						|
    pScreen->ExposeCopy = 0;
 | 
						|
    pScreen->TranslateBackingStore = 0;
 | 
						|
    pScreen->ClearBackingStore = 0;
 | 
						|
    pScreen->DrawGuarantee = 0;
 | 
						|
 | 
						|
    miSetZeroLineBias(pScreen, DEFAULTZEROLINEBIAS);
 | 
						|
 | 
						|
    return miScreenDevPrivateInit(pScreen, width, pbits);
 | 
						|
}
 | 
						|
 | 
						|
_X_EXPORT int
 | 
						|
miAllocateGCPrivateIndex()
 | 
						|
{
 | 
						|
    static int privateIndex = -1;
 | 
						|
    static unsigned long miGeneration = 0;
 | 
						|
 | 
						|
    if (miGeneration != serverGeneration)
 | 
						|
    {
 | 
						|
	privateIndex = AllocateGCPrivateIndex();
 | 
						|
	miGeneration = serverGeneration;
 | 
						|
    }
 | 
						|
    return privateIndex;
 | 
						|
}
 | 
						|
 | 
						|
_X_EXPORT int miZeroLineScreenIndex;
 | 
						|
static unsigned int miZeroLineGeneration = 0;
 | 
						|
 | 
						|
_X_EXPORT void
 | 
						|
miSetZeroLineBias(pScreen, bias)
 | 
						|
    ScreenPtr pScreen;
 | 
						|
    unsigned int bias;
 | 
						|
{
 | 
						|
    if (miZeroLineGeneration != serverGeneration)
 | 
						|
    {
 | 
						|
	miZeroLineScreenIndex = AllocateScreenPrivateIndex();
 | 
						|
	miZeroLineGeneration = serverGeneration;
 | 
						|
    }
 | 
						|
    if (miZeroLineScreenIndex >= 0)
 | 
						|
	pScreen->devPrivates[miZeroLineScreenIndex].uval = bias;
 | 
						|
}
 | 
						|
 | 
						|
_X_EXPORT PixmapPtr
 | 
						|
miGetScreenPixmap(pScreen)
 | 
						|
    ScreenPtr pScreen;
 | 
						|
{
 | 
						|
    return (PixmapPtr)(pScreen->devPrivate);
 | 
						|
}
 | 
						|
 | 
						|
_X_EXPORT void
 | 
						|
miSetScreenPixmap(pPix)
 | 
						|
    PixmapPtr pPix;
 | 
						|
{
 | 
						|
    if (pPix)
 | 
						|
	pPix->drawable.pScreen->devPrivate = (pointer)pPix;
 | 
						|
}
 |