#include "sun.h"
#include "cfb/cfb.h"
#include "mi/miline.h"
#define GXZEROLINEBIAS (OCTANT1 | OCTANT3 | OCTANT4 | OCTANT6)
static void CGUpdateColormap(pScreen, dex, count, rmap, gmap, bmap)
ScreenPtr pScreen;
int dex, count;
u_char *rmap, *gmap, *bmap;
{
struct fbcmap sunCmap;
sunCmap.index = dex;
sunCmap.count = count;
sunCmap.red = &rmap[dex];
sunCmap.green = &gmap[dex];
sunCmap.blue = &bmap[dex];
if (ioctl(sunFbs[pScreen->myNum].fd, FBIOPUTCMAP, &sunCmap) < 0) {
Error("CGUpdateColormap");
FatalError( "CGUpdateColormap: FBIOPUTCMAP failed\n" );
}
}
static void CGGetColormap(pScreen, dex, count, rmap, gmap, bmap)
ScreenPtr pScreen;
int dex, count;
u_char *rmap, *gmap, *bmap;
{
struct fbcmap sunCmap;
sunCmap.index = dex;
sunCmap.count = count;
sunCmap.red = &rmap[dex];
sunCmap.green = &gmap[dex];
sunCmap.blue = &bmap[dex];
if (ioctl(sunFbs[pScreen->myNum].fd, FBIOGETCMAP, &sunCmap) < 0) {
Error("CGGetColormap");
FatalError( "CGGetColormap: FBIOGETCMAP failed\n" );
}
}
void sunInstallColormap(cmap)
ColormapPtr cmap;
{
SetupScreen(cmap->pScreen);
register int i;
register Entry *pent;
register VisualPtr pVisual = cmap->pVisual;
u_char rmap[256], gmap[256], bmap[256];
unsigned long rMask, gMask, bMask;
int oRed, oGreen, oBlue;
if (cmap == pPrivate->installedMap)
return;
if (pPrivate->installedMap)
WalkTree(pPrivate->installedMap->pScreen, TellLostMap,
(pointer) &(pPrivate->installedMap->mid));
if ((pVisual->class | DynamicClass) == DirectColor) {
if (pVisual->ColormapEntries < 256) {
rMask = pVisual->redMask;
gMask = pVisual->greenMask;
bMask = pVisual->blueMask;
oRed = pVisual->offsetRed;
oGreen = pVisual->offsetGreen;
oBlue = pVisual->offsetBlue;
} else {
rMask = gMask = bMask = 255;
oRed = oGreen = oBlue = 0;
}
for (i = 0; i < 256; i++) {
rmap[i] = cmap->red[(i & rMask) >> oRed].co.local.red >> 8;
gmap[i] = cmap->green[(i & gMask) >> oGreen].co.local.green >> 8;
bmap[i] = cmap->blue[(i & bMask) >> oBlue].co.local.blue >> 8;
}
} else {
(*pPrivate->GetColormap) (cmap->pScreen, 0, 256, rmap, gmap, bmap);
for (i = 0, pent = cmap->red;
i < pVisual->ColormapEntries;
i++, pent++) {
if (pent->fShared) {
rmap[i] = pent->co.shco.red->color >> 8;
gmap[i] = pent->co.shco.green->color >> 8;
bmap[i] = pent->co.shco.blue->color >> 8;
}
else if (pent->refcnt != 0) {
rmap[i] = pent->co.local.red >> 8;
gmap[i] = pent->co.local.green >> 8;
bmap[i] = pent->co.local.blue >> 8;
}
}
}
pPrivate->installedMap = cmap;
(*pPrivate->UpdateColormap) (cmap->pScreen, 0, 256, rmap, gmap, bmap);
WalkTree(cmap->pScreen, TellGainedMap, (pointer) &(cmap->mid));
}
void sunUninstallColormap(cmap)
ColormapPtr cmap;
{
SetupScreen(cmap->pScreen);
if (cmap == pPrivate->installedMap) {
Colormap defMapID = cmap->pScreen->defColormap;
if (cmap->mid != defMapID) {
ColormapPtr defMap = (ColormapPtr) LookupIDByType(defMapID,
RT_COLORMAP);
if (defMap)
(*cmap->pScreen->InstallColormap)(defMap);
else
ErrorF("sunFbs: Can't find default colormap\n");
}
}
}
int sunListInstalledColormaps(pScreen, pCmapList)
ScreenPtr pScreen;
Colormap *pCmapList;
{
SetupScreen(pScreen);
*pCmapList = pPrivate->installedMap->mid;
return (1);
}
static void CGStoreColors(pmap, ndef, pdefs)
ColormapPtr pmap;
int ndef;
xColorItem *pdefs;
{
SetupScreen(pmap->pScreen);
u_char rmap[256], gmap[256], bmap[256];
xColorItem expanddefs[256];
register int i;
if (pPrivate->installedMap != NULL && pPrivate->installedMap != pmap)
return;
if ((pmap->pVisual->class | DynamicClass) == DirectColor) {
ndef = cfbExpandDirectColors(pmap, ndef, pdefs, expanddefs);
pdefs = expanddefs;
}
while (ndef--) {
i = pdefs->pixel;
rmap[i] = pdefs->red >> 8;
gmap[i] = pdefs->green >> 8;
bmap[i] = pdefs->blue >> 8;
(*pPrivate->UpdateColormap) (pmap->pScreen, i, 1, rmap, gmap, bmap);
pdefs++;
}
}
static void CGScreenInit (pScreen)
ScreenPtr pScreen;
{
#ifndef STATIC_COLOR
SetupScreen (pScreen);
pScreen->InstallColormap = sunInstallColormap;
pScreen->UninstallColormap = sunUninstallColormap;
pScreen->ListInstalledColormaps = sunListInstalledColormaps;
pScreen->StoreColors = CGStoreColors;
pPrivate->UpdateColormap = CGUpdateColormap;
pPrivate->GetColormap = CGGetColormap;
if (sunFlipPixels) {
Pixel pixel = pScreen->whitePixel;
pScreen->whitePixel = pScreen->blackPixel;
pScreen->blackPixel = pixel;
}
#endif
}
static void checkMono (argc, argv)
int argc;
char** argv;
{
int i;
for (i = 1; i < argc; i++)
if (strcmp (argv[i], "-mono") == 0)
ErrorF ("-mono not appropriate for CG3/CG4/CG6\n");
}
#define CG3_MMAP_OFFSET 0x04000000
Bool sunCG3Init (screen, pScreen, argc, argv)
int screen;
ScreenPtr pScreen;
int argc;
char **argv;
{
checkMono (argc, argv);
sunFbs[screen].EnterLeave = (void (*)())NoopDDA;
return sunInitCommon (screen, pScreen, (off_t) CG3_MMAP_OFFSET,
sunCfbScreenInit, CGScreenInit,
cfbCreateDefColormap, sunSaveScreen, 0);
}
Bool sunTCXInit (screen, pScreen, argc, argv)
int screen;
ScreenPtr pScreen;
int argc;
char **argv;
{
checkMono (argc, argv);
sunFbs[screen].EnterLeave = (void (*)())NoopDDA;
return sunInitCommon (screen, pScreen, (off_t) 0,
sunCfbScreenInit, CGScreenInit,
cfbCreateDefColormap, sunSaveScreen, 0);
}
#if !defined(i386)
#ifdef SVR4
#ifdef INCLUDE_CG2_HEADER
#include <sys/cg2reg.h>
#endif
#else
#ifndef CSRG_BASED
#include <pixrect/cg2reg.h>
#else
#if defined(__sparc__) || defined(__sparc)
#if !defined(__bsdi__)
#include <machine/cgtworeg.h>
#endif
#else
#include <machine/cg2reg.h>
#endif
#endif
#endif
#ifdef INCLUDE_CG2_HEADER
typedef struct {
struct cg2memfb mem;
struct cg2fb regs;
} *CG2Ptr;
static void CG2UpdateColormap(pScreen, index, count, rmap, gmap,bmap)
ScreenPtr pScreen;
int index, count;
u_char *rmap, *gmap, *bmap;
{
CG2Ptr fb = (CG2Ptr) sunFbs[pScreen->myNum].fb;
volatile struct cg2statusreg *regp = &fb->regs.status.reg;
regp->update_cmap = 0;
while (count--) {
fb->regs.redmap[index] = rmap[index];
fb->regs.greenmap[index] = gmap[index];
fb->regs.bluemap[index] = bmap[index];
index++;
}
regp->update_cmap = 1;
}
static void CG2GetColormap(pScreen, index, count, rmap, gmap,bmap)
ScreenPtr pScreen;
int index, count;
u_char *rmap, *gmap, *bmap;
{
CG2Ptr fb = (CG2Ptr) sunFbs[pScreen->myNum].fb;
while (count--) {
rmap[index] = fb->regs.redmap[index];
gmap[index] = fb->regs.greenmap[index];
bmap[index] = fb->regs.bluemap[index];
index++;
}
}
static Bool CG2SaveScreen (pScreen, on)
ScreenPtr pScreen;
int on;
{
CG2Ptr fb = (CG2Ptr) sunFbs[pScreen->myNum].fb;
volatile struct cg2statusreg *regp = &fb->regs.status.reg;
if (on != SCREEN_SAVER_FORCER)
regp->video_enab = (on == SCREEN_SAVER_ON) ? 0 : 1;
return TRUE;
}
static void CG2ScreenInit (pScreen)
ScreenPtr pScreen;
{
SetupScreen (pScreen);
CGScreenInit (pScreen);
pPrivate->UpdateColormap = CG2UpdateColormap;
pPrivate->GetColormap = CG2GetColormap;
}
Bool sunCG2Init (screen, pScreen, argc, argv)
int screen;
ScreenPtr pScreen;
int argc;
char** argv;
{
int i;
Bool ret;
Bool mono = FALSE;
for (i = 1; i < argc; i++)
if (strcmp (argv[i], "-mono") == 0)
mono = TRUE;
sunFbs[screen].EnterLeave = (void (*)())NoopDDA;
pScreen->SaveScreen = CG2SaveScreen;
#ifndef LOWMEMFTPT
if (mono) {
pScreen->whitePixel = 0;
pScreen->blackPixel = 1;
ret = sunInitCommon (screen, pScreen, (off_t) 0,
mfbScreenInit, NULL,
mfbCreateDefColormap, CG2SaveScreen, 0);
((CG2Ptr) sunFbs[screen].fb)->regs.ppmask.reg = 1;
} else {
#endif
ret = sunInitCommon (screen, pScreen, (off_t) 0,
sunCfbScreenInit, CG2ScreenInit,
cfbCreateDefColormap, CG2SaveScreen,
(int) &((struct cg2memfb *) 0)->pixplane);
((CG2Ptr) sunFbs[screen].fb)->regs.ppmask.reg = 0xFF;
#ifndef LOWMEMFTPT
}
#endif
return ret;
}
#endif
#define CG4_HEIGHT 900
#define CG4_WIDTH 1152
#define CG4_MELEN (128*1024)
typedef struct {
u_char mpixel[CG4_MELEN];
u_char epixel[CG4_MELEN];
u_char cpixel[CG4_HEIGHT][CG4_WIDTH];
} *CG4Ptr;
static void CG4Switch (pScreen, select)
ScreenPtr pScreen;
int select;
{
CG4Ptr fb = (CG4Ptr) sunFbs[pScreen->myNum].fb;
(void) memset ((char *)fb->epixel, select ? ~0 : 0, CG4_MELEN);
}
Bool sunCG4Init (screen, pScreen, argc, argv)
int screen;
ScreenPtr pScreen;
int argc;
char** argv;
{
checkMono (argc, argv);
if (sunCG4Frob)
sunFbs[screen].EnterLeave = (void (*)())NoopDDA;
else
sunFbs[screen].EnterLeave = CG4Switch;
return sunInitCommon (screen, pScreen, (off_t) 0,
sunCfbScreenInit, CGScreenInit,
cfbCreateDefColormap, sunSaveScreen, (int) ((CG4Ptr) 0)->cpixel);
}
#ifdef FBTYPE_SUNFAST_COLOR
#define CG6_MMAP_OFFSET 0x70000000
#define CG6_IMAGE_OFFSET 0x16000
Bool sunCG6Init (screen, pScreen, argc, argv)
int screen;
ScreenPtr pScreen;
int argc;
char** argv;
{
pointer fb;
checkMono (argc, argv);
if (!sunScreenAllocate (pScreen))
return FALSE;
if (!sunFbs[screen].fb) {
#define FBSIZE (size_t) sunFbs[screen].info.fb_width * \
sunFbs[screen].info.fb_height + CG6_IMAGE_OFFSET
if ((fb = sunMemoryMap (FBSIZE,
(off_t) CG6_MMAP_OFFSET,
sunFbs[screen].fd)) == NULL)
return FALSE;
sunFbs[screen].fb = fb;
#undef FBSIZE
}
sunFbs[screen].EnterLeave = (void (*)())NoopDDA;
if (!sunCfbSetupScreen (pScreen,
sunFbs[screen].fb + CG6_IMAGE_OFFSET,
sunFbs[screen].info.fb_width,
sunFbs[screen].info.fb_height,
monitorResolution, monitorResolution,
sunFbs[screen].info.fb_width,
sunFbs[screen].info.fb_depth))
return FALSE;
#ifndef LOWMEMFTPT
if (sunNoGX == FALSE) {
if (!sunGXInit (pScreen, &sunFbs[screen]))
return FALSE;
}
#endif
if (!sunCfbFinishScreenInit(pScreen,
sunFbs[screen].fb + CG6_IMAGE_OFFSET,
sunFbs[screen].info.fb_width,
sunFbs[screen].info.fb_height,
monitorResolution, monitorResolution,
sunFbs[screen].info.fb_width,
sunFbs[screen].info.fb_depth))
return FALSE;
if (sunNoGX == FALSE) {
miSetZeroLineBias(pScreen, GXZEROLINEBIAS);
}
miInitializeBackingStore(pScreen);
CGScreenInit (pScreen);
if (!sunScreenInit (pScreen))
return FALSE;
sunSaveScreen (pScreen, SCREEN_SAVER_OFF);
return cfbCreateDefColormap(pScreen);
}
#endif
#endif