#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 "mi.h"
#include "mistruct.h"
#include "dix.h"
#include "gcstruct.h"
#include "mibstore.h"
#ifndef SINGLEDEPTH
static Bool
sunCfbCreateGC(pGC)
GCPtr pGC;
{
if (pGC->depth == 1)
{
return mfbCreateGC (pGC);
}
else if (pGC->depth <= 8)
{
return cfbCreateGC (pGC);
}
else if (pGC->depth <= 16)
{
return cfb16CreateGC (pGC);
}
else if (pGC->depth <= 32)
{
return cfb32CreateGC (pGC);
}
return FALSE;
}
static void
sunCfbGetSpans(pDrawable, wMax, ppt, pwidth, nspans, pdstStart)
DrawablePtr pDrawable;
int wMax;
register DDXPointPtr ppt;
int *pwidth;
int nspans;
char *pdstStart;
{
switch (pDrawable->bitsPerPixel) {
case 1:
mfbGetSpans(pDrawable, wMax, ppt, pwidth, nspans, pdstStart);
break;
case 8:
cfbGetSpans(pDrawable, wMax, ppt, pwidth, nspans, pdstStart);
break;
case 16:
cfb16GetSpans(pDrawable, wMax, ppt, pwidth, nspans, pdstStart);
break;
case 32:
cfb32GetSpans(pDrawable, wMax, ppt, pwidth, nspans, pdstStart);
break;
}
return;
}
static void
sunCfbGetImage(pDrawable, sx, sy, w, h, format, planeMask, pdstLine)
DrawablePtr pDrawable;
int sx, sy, w, h;
unsigned int format;
unsigned long planeMask;
char *pdstLine;
{
switch (pDrawable->bitsPerPixel)
{
case 1:
mfbGetImage(pDrawable, sx, sy, w, h, format, planeMask, pdstLine);
break;
case 8:
cfbGetImage(pDrawable, sx, sy, w, h, format, planeMask, pdstLine);
break;
case 16:
cfb16GetImage(pDrawable, sx, sy, w, h, format, planeMask, pdstLine);
break;
case 32:
cfb32GetImage(pDrawable, sx, sy, w, h, format, planeMask, pdstLine);
break;
}
}
Bool
sunCfbSetupScreen(pScreen, pbits, xsize, ysize, dpix, dpiy, width, bpp)
register ScreenPtr pScreen;
pointer pbits;
int xsize, ysize;
int dpix, dpiy;
int width;
int bpp;
{
extern int cfbWindowPrivateIndex;
extern int cfbGCPrivateIndex;
int ret;
sunRegisterPixmapFormat( 1, 1);
sunRegisterPixmapFormat( 8, 8);
sunRegisterPixmapFormat( 12, 16);
sunRegisterPixmapFormat( 24, 32);
switch (bpp) {
case 8:
ret = cfbSetupScreen(pScreen, pbits, xsize, ysize, dpix, dpiy, width);
break;
case 16:
ret = cfb16SetupScreen(pScreen, pbits, xsize, ysize, dpix, dpiy, width);
break;
case 32:
ret = cfb32SetupScreen(pScreen, pbits, xsize, ysize, dpix, dpiy, width);
break;
default:
return FALSE;
}
pScreen->CreateGC = sunCfbCreateGC;
pScreen->GetImage = sunCfbGetImage;
pScreen->GetSpans = sunCfbGetSpans;
return ret;
}
extern BSFuncRec cfbBSFuncRec, cfb16BSFuncRec, cfb32BSFuncRec;
extern int cfb16ScreenPrivateIndex, cfb32ScreenPrivateIndex;
extern Bool cfbCloseScreen(), cfb16CloseScreen(), cfb32CloseScreen();
Bool
sunCfbFinishScreenInit(pScreen, pbits, xsize, ysize, dpix, dpiy, width, bpp)
register ScreenPtr pScreen;
pointer pbits;
int xsize, ysize;
int dpix, dpiy;
int width;
int bpp;
{
int i;
pointer oldDevPrivate;
VisualPtr visuals;
int nvisuals;
DepthPtr depths;
int ndepths;
VisualID defaultVisual;
int rootdepth;
if (!cfbInitVisuals(&visuals, &depths, &nvisuals, &ndepths,
&rootdepth, &defaultVisual, 1 << (bpp - 1), 8))
return FALSE;
oldDevPrivate = pScreen->devPrivate;
if (! miScreenInit(pScreen, pbits, xsize, ysize, dpix, dpiy, width,
rootdepth, ndepths, depths,
defaultVisual, nvisuals, visuals))
return FALSE;
switch (bpp)
{
case 8:
pScreen->CloseScreen = cfbCloseScreen;
pScreen->BackingStoreFuncs = cfbBSFuncRec;
break;
case 16:
pScreen->CloseScreen = cfb16CloseScreen;
pScreen->devPrivates[cfb16ScreenPrivateIndex].ptr =
pScreen->devPrivate;
pScreen->devPrivate = oldDevPrivate;
pScreen->BackingStoreFuncs = cfb16BSFuncRec;
break;
case 32:
pScreen->CloseScreen = cfb32CloseScreen;
pScreen->devPrivates[cfb32ScreenPrivateIndex].ptr =
pScreen->devPrivate;
pScreen->devPrivate = oldDevPrivate;
pScreen->BackingStoreFuncs = cfb32BSFuncRec;
break;
}
return TRUE;
}
Bool
sunCfbScreenInit(pScreen, pbits, xsize, ysize, dpix, dpiy, width, bpp)
register ScreenPtr pScreen;
pointer pbits;
int xsize, ysize;
int dpix, dpiy;
int width;
int bpp;
{
if (!sunCfbSetupScreen(pScreen, pbits, xsize, ysize, dpix, dpiy,
width, bpp))
return FALSE;
return sunCfbFinishScreenInit(pScreen, pbits, xsize, ysize, dpix,
dpiy, width, bpp);
}
#else
Bool
sunCfbSetupScreen(pScreen, pbits, xsize, ysize, dpix, dpiy, width, bpp)
register ScreenPtr pScreen;
pointer pbits;
int xsize, ysize;
int dpix, dpiy;
int width;
int bpp;
{
sunRegisterPixmapFormat( 1, 1);
sunRegisterPixmapFormat( 8, 8);
return cfbSetupScreen(pScreen, pbits, xsize, ysize, dpix, dpiy,
width);
}
Bool
sunCfbFinishScreenInit(pScreen, pbits, xsize, ysize, dpix, dpiy, width, bpp)
register ScreenPtr pScreen;
pointer pbits;
int xsize, ysize;
int dpix, dpiy;
int width;
int bpp;
{
return cfbFinishScreenInit(pScreen, pbits, xsize, ysize, dpix, dpiy,
width);
}
Bool
sunCfbScreenInit(pScreen, pbits, xsize, ysize, dpix, dpiy, width, bpp)
register ScreenPtr pScreen;
pointer pbits;
int xsize, ysize;
int dpix, dpiy;
int width;
int bpp;
{
sunRegisterPixmapFormat( 1, 1);
sunRegisterPixmapFormat( 8, 8);
return cfbScreenInit(pScreen, pbits, xsize, ysize, dpix, dpiy, width);
}
#endif