252 lines
		
	
	
		
			8.3 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			252 lines
		
	
	
		
			8.3 KiB
		
	
	
	
		
			C
		
	
	
	
/*
 | 
						|
 | 
						|
Copyright (c) 1990  X Consortium
 | 
						|
 | 
						|
Permission is hereby granted, free of charge, to any person obtaining
 | 
						|
a copy of this software and associated documentation files (the
 | 
						|
"Software"), to deal in the Software without restriction, including
 | 
						|
without limitation the rights to use, copy, modify, merge, publish,
 | 
						|
distribute, sublicense, and/or sell copies of the Software, and to
 | 
						|
permit persons to whom the Software is furnished to do so, subject to
 | 
						|
the following conditions:
 | 
						|
 | 
						|
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 X CONSORTIUM 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 X Consortium 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 X Consortium.
 | 
						|
 | 
						|
 | 
						|
Copyright IBM Corporation 1987,1988,1989
 | 
						|
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 notice appear in all copies and that 
 | 
						|
both that copyright notice and this permission notice appear in
 | 
						|
supporting documentation, and that the name of IBM not be
 | 
						|
used in advertising or publicity pertaining to distribution of the
 | 
						|
software without specific, written prior permission.
 | 
						|
 | 
						|
IBM DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
 | 
						|
ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
 | 
						|
IBM BE LIABLE 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: ppcIO.c /main/8 1996/02/21 17:57:49 kaleb $ */
 | 
						|
 | 
						|
#ifdef HAVE_XORG_CONFIG_H
 | 
						|
#include <xorg-config.h>
 | 
						|
#endif
 | 
						|
 | 
						|
#include <stdlib.h>
 | 
						|
 | 
						|
#include "xf4bpp.h"
 | 
						|
#include "mfbmap.h"
 | 
						|
#include "mfb.h"
 | 
						|
#include "mi.h"
 | 
						|
#include "micmap.h"
 | 
						|
#include "scrnintstr.h"
 | 
						|
#include "vgaVideo.h"
 | 
						|
 | 
						|
#if 0
 | 
						|
/* XXX This remains to remind of the PC98 difference */
 | 
						|
static VisualRec vgaVisuals[] = {
 | 
						|
/* StaticColor needs to be first so is can be used as the default */
 | 
						|
/* vid class     bpRGB cmpE nplan rMask gMask bMask oRed oGreen oBlue */
 | 
						|
#ifdef	PC98
 | 
						|
{   0, StaticColor, 4, 1 << VGA_MAXPLANES, VGA_MAXPLANES, 0, 0, 0, 0, 0, 0 },
 | 
						|
{   0, StaticGray,  4, 1 << VGA_MAXPLANES, VGA_MAXPLANES, 0, 0, 0, 0, 0, 0 },
 | 
						|
{   0, GrayScale,   4, 1 << VGA_MAXPLANES, VGA_MAXPLANES, 0, 0, 0, 0, 0, 0 },
 | 
						|
{   0, PseudoColor, 4, 1 << VGA_MAXPLANES, VGA_MAXPLANES, 0, 0, 0, 0, 0, 0 },
 | 
						|
#else
 | 
						|
{   0, StaticColor, 6, 1 << VGA_MAXPLANES, VGA_MAXPLANES, 0, 0, 0, 0, 0, 0 },
 | 
						|
{   0, StaticGray,  6, 1 << VGA_MAXPLANES, VGA_MAXPLANES, 0, 0, 0, 0, 0, 0 },
 | 
						|
{   0, GrayScale,   6, 1 << VGA_MAXPLANES, VGA_MAXPLANES, 0, 0, 0, 0, 0, 0 },
 | 
						|
{   0, PseudoColor, 6, 1 << VGA_MAXPLANES, VGA_MAXPLANES, 0, 0, 0, 0, 0, 0 },
 | 
						|
#endif
 | 
						|
} ;
 | 
						|
#endif
 | 
						|
 | 
						|
void
 | 
						|
xf4bppNeverCalled()
 | 
						|
{
 | 
						|
	FatalError("xf4bppNeverCalled was nevertheless called\n");
 | 
						|
}
 | 
						|
 | 
						|
static BSFuncRec ppcBSFuncRec = {
 | 
						|
    xf4bppSaveAreas,
 | 
						|
    xf4bppRestoreAreas,
 | 
						|
    (BackingStoreSetClipmaskRgnProcPtr) 0,
 | 
						|
    (BackingStoreGetImagePixmapProcPtr) 0,
 | 
						|
    (BackingStoreGetSpansPixmapProcPtr) 0,
 | 
						|
};
 | 
						|
 | 
						|
/*ARGSUSED*/
 | 
						|
static Bool
 | 
						|
vgaScreenClose
 | 
						|
(
 | 
						|
	int       idx,
 | 
						|
	ScreenPtr pScreen
 | 
						|
)
 | 
						|
{
 | 
						|
	pScreen->defColormap = 0 ;
 | 
						|
	return TRUE;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
static GCPtr sampleGCperDepth[MAXFORMATS+1] = { 0 };
 | 
						|
static PixmapPtr samplePixmapPerDepth[1] = { 0 };
 | 
						|
 | 
						|
/* GJA -- Took this from miscrinit.c.
 | 
						|
 * We want that devKind contains the distance in bytes between two scanlines.
 | 
						|
 * The computation that mi does is not appropriate for planar VGA.
 | 
						|
 * Therefore we provide here our own routine.
 | 
						|
 */
 | 
						|
 | 
						|
/* GJA -- WARNING: this is an internal structure declaration, taken from
 | 
						|
 * miscrinit.c
 | 
						|
 */
 | 
						|
typedef struct
 | 
						|
{
 | 
						|
    pointer pbits; /* pointer to framebuffer */
 | 
						|
    int width;    /* delta to add to a framebuffer addr to move one row down */
 | 
						|
} miScreenInitParmsRec, *miScreenInitParmsPtr;
 | 
						|
 | 
						|
/* 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.
 | 
						|
 */
 | 
						|
static Bool
 | 
						|
v16CreateScreenResources
 | 
						|
(
 | 
						|
    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, 8 /* bits per pixel */,
 | 
						|
/* GJA: was 	    PixmapBytePad(pScrInitParms->width, pScreen->rootDepth), */
 | 
						|
#define BITS_PER_BYTE_SHIFT 3
 | 
						|
		    pScrInitParms->width >> BITS_PER_BYTE_SHIFT,
 | 
						|
		    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
 | 
						|
xf4bppScreenInit( pScreen, pbits, virtx, virty, dpix, dpiy, width )
 | 
						|
    ScreenPtr pScreen;
 | 
						|
    pointer pbits;
 | 
						|
    int virtx, virty;
 | 
						|
    int dpix, dpiy;
 | 
						|
    int width;
 | 
						|
{
 | 
						|
  Bool ret;
 | 
						|
  VisualPtr visuals;
 | 
						|
  DepthPtr depths;
 | 
						|
  int nvisuals;
 | 
						|
  int ndepths;
 | 
						|
  int rootdepth;
 | 
						|
  VisualID defaultVisual;
 | 
						|
 | 
						|
  rootdepth = 0;
 | 
						|
  ret = miInitVisuals(&visuals, &depths, &nvisuals, &ndepths, &rootdepth,
 | 
						|
		      &defaultVisual, (unsigned long)1 << 8, 6, -1);
 | 
						|
  if (!ret)
 | 
						|
	return FALSE;
 | 
						|
 | 
						|
  pScreen-> id = 0;
 | 
						|
  pScreen->defColormap = FakeClientID(0);
 | 
						|
  pScreen-> whitePixel = VGA_WHITE_PIXEL;
 | 
						|
  pScreen-> blackPixel = VGA_BLACK_PIXEL;
 | 
						|
  pScreen-> rgf = 0;
 | 
						|
  *(pScreen-> GCperDepth) = *(sampleGCperDepth);
 | 
						|
  *(pScreen-> PixmapPerDepth) = *(samplePixmapPerDepth);
 | 
						|
  pScreen-> CloseScreen = vgaScreenClose;
 | 
						|
  pScreen-> QueryBestSize = xf4bppQueryBestSize;
 | 
						|
  pScreen-> GetImage = xf4bppGetImage;
 | 
						|
  pScreen-> GetSpans = xf4bppGetSpans;
 | 
						|
  pScreen-> CreateWindow = xf4bppCreateWindowForXYhardware;
 | 
						|
  pScreen-> DestroyWindow = xf4bppDestroyWindow;
 | 
						|
  pScreen-> PositionWindow = xf4bppPositionWindow;
 | 
						|
  pScreen-> PaintWindowBackground = xf4bppPaintWindow;
 | 
						|
  pScreen-> PaintWindowBorder = xf4bppPaintWindow;
 | 
						|
  pScreen-> CopyWindow = xf4bppCopyWindow;
 | 
						|
  pScreen-> CreatePixmap = xf4bppCreatePixmap;
 | 
						|
  pScreen-> SaveDoomedAreas = (SaveDoomedAreasProcPtr)NoopDDA;
 | 
						|
  pScreen-> RestoreAreas = (RestoreAreasProcPtr)NoopDDA;
 | 
						|
  pScreen-> ExposeCopy = (ExposeCopyProcPtr)NoopDDA;
 | 
						|
  pScreen-> TranslateBackingStore = (TranslateBackingStoreProcPtr)NoopDDA;
 | 
						|
  pScreen-> ClearBackingStore = (ClearBackingStoreProcPtr)NoopDDA;
 | 
						|
  pScreen-> DrawGuarantee = (DrawGuaranteeProcPtr)NoopDDA;
 | 
						|
  pScreen-> CreateGC = xf4bppCreateGC;
 | 
						|
  pScreen-> CreateColormap = xf4bppInitializeColormap;
 | 
						|
  pScreen-> DestroyColormap = (DestroyColormapProcPtr)NoopDDA;
 | 
						|
  pScreen-> InstallColormap = miInstallColormap;
 | 
						|
  pScreen-> UninstallColormap = miUninstallColormap;
 | 
						|
  pScreen-> ListInstalledColormaps = miListInstalledColormaps;
 | 
						|
  pScreen-> StoreColors = (StoreColorsProcPtr)NoopDDA;
 | 
						|
  pScreen-> ResolveColor = xf4bppResolveColor;
 | 
						|
  mfbFillInScreen(pScreen);
 | 
						|
 | 
						|
  if (!mfbAllocatePrivates(pScreen, (int*)NULL, (int*)NULL))
 | 
						|
	return FALSE;
 | 
						|
 | 
						|
  if (!miScreenInit(pScreen, pbits, virtx, virty, dpix, dpiy, width,
 | 
						|
	rootdepth, ndepths, depths, defaultVisual /* See above */,
 | 
						|
	nvisuals, visuals))
 | 
						|
     return FALSE;
 | 
						|
  pScreen->BackingStoreFuncs = ppcBSFuncRec;
 | 
						|
 | 
						|
  /* GJA -- Now we override the supplied default: */
 | 
						|
  pScreen -> CreateScreenResources = v16CreateScreenResources;
 | 
						|
 | 
						|
  mfbRegisterCopyPlaneProc(pScreen,miCopyPlane); /* GJA -- R4->R5 */
 | 
						|
  return TRUE;
 | 
						|
}
 |