#include "X.h"
#include "Xproto.h"
#include "Xmd.h"
#include "scrnintstr.h"
#include "pixmapstr.h"
#include "windowstr.h"
#include "resource.h"
#include "colormap.h"
#include "ilbm.h"
#include "mistruct.h"
#include "dix.h"
#include "mi.h"
#include "mibstore.h"
#include "migc.h"
#include "servermd.h"
#ifdef PIXMAP_PER_WINDOW
int frameWindowPrivateIndex;
#endif
int ilbmWindowPrivateIndex;
int ilbmGCPrivateIndex;
int ilbmScreenPrivateIndex;
static unsigned long ilbmGeneration = 0;
BSFuncRec ilbmBSFuncRec = {
ilbmSaveAreas,
ilbmRestoreAreas,
(BackingStoreSetClipmaskRgnProcPtr) 0,
(BackingStoreGetImagePixmapProcPtr) 0,
(BackingStoreGetSpansPixmapProcPtr) 0,
};
Bool
ilbmCloseScreen(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);
xfree(pScreen->devPrivates[ilbmScreenPrivateIndex].ptr);
return(TRUE);
}
Bool
ilbmCreateScreenResources(pScreen)
ScreenPtr pScreen;
{
Bool retval;
pointer oldDevPrivate = pScreen->devPrivate;
pScreen->devPrivate = pScreen->devPrivates[ilbmScreenPrivateIndex].ptr;
retval = miCreateScreenResources(pScreen);
((PixmapPtr)pScreen->devPrivate)->devKind = BitmapBytePad(pScreen->width);
pScreen->devPrivates[ilbmScreenPrivateIndex].ptr = pScreen->devPrivate;
pScreen->devPrivate = oldDevPrivate;
return(retval);
}
Bool
ilbmAllocatePrivates(pScreen, pWinIndex, pGCIndex)
ScreenPtr pScreen;
int *pWinIndex, *pGCIndex;
{
if (ilbmGeneration != serverGeneration) {
#ifdef PIXMAP_PER_WINDOW
frameWindowPrivateIndex = AllocateWindowPrivateIndex();
#endif
ilbmWindowPrivateIndex = AllocateWindowPrivateIndex();
ilbmGCPrivateIndex = AllocateGCPrivateIndex();
ilbmGeneration = serverGeneration;
}
if (pWinIndex)
*pWinIndex = ilbmWindowPrivateIndex;
if (pGCIndex)
*pGCIndex = ilbmGCPrivateIndex;
ilbmScreenPrivateIndex = AllocateScreenPrivateIndex();
pScreen->GetWindowPixmap = ilbmGetWindowPixmap;
pScreen->SetWindowPixmap = ilbmSetWindowPixmap;
return(AllocateWindowPrivate(pScreen, ilbmWindowPrivateIndex, sizeof(ilbmPrivWin)) &&
AllocateGCPrivate(pScreen, ilbmGCPrivateIndex, sizeof(ilbmPrivGC)));
}
Bool
ilbmScreenInit(pScreen, pbits, xsize, ysize, dpix, dpiy, width)
register ScreenPtr pScreen;
pointer pbits;
int xsize, ysize;
int dpix, dpiy;
int width;
{
VisualPtr visuals;
DepthPtr depths;
int nvisuals;
int ndepths;
int rootdepth;
VisualID defaultVisual;
pointer oldDevPrivate;
rootdepth = 0;
if (!ilbmInitVisuals(&visuals, &depths, &nvisuals, &ndepths, &rootdepth,
&defaultVisual, 256, 8)) {
ErrorF("ilbmInitVisuals: FALSE\n");
return FALSE;
}
if (!ilbmAllocatePrivates(pScreen,(int *)NULL, (int *)NULL)) {
ErrorF("ilbmAllocatePrivates: FALSE\n");
return FALSE;
}
pScreen->defColormap = (Colormap)FakeClientID(0);
pScreen->blackPixel = 0;
pScreen->whitePixel = 0;
pScreen->QueryBestSize = ilbmQueryBestSize;
pScreen->GetImage = ilbmGetImage;
pScreen->GetSpans = ilbmGetSpans;
pScreen->CreateWindow = ilbmCreateWindow;
pScreen->DestroyWindow = ilbmDestroyWindow;
pScreen->PositionWindow = ilbmPositionWindow;
pScreen->ChangeWindowAttributes = ilbmChangeWindowAttributes;
pScreen->RealizeWindow = ilbmMapWindow;
pScreen->UnrealizeWindow = ilbmUnmapWindow;
pScreen->PaintWindowBackground = ilbmPaintWindow;
pScreen->PaintWindowBorder = ilbmPaintWindow;
pScreen->CopyWindow = ilbmCopyWindow;
pScreen->CreatePixmap = ilbmCreatePixmap;
pScreen->DestroyPixmap = ilbmDestroyPixmap;
pScreen->RealizeFont = ilbmRealizeFont;
pScreen->UnrealizeFont = ilbmUnrealizeFont;
pScreen->CreateGC = ilbmCreateGC;
pScreen->CreateColormap = ilbmInitializeColormap;
pScreen->DestroyColormap = (void (*)())NoopDDA;
pScreen->InstallColormap = ilbmInstallColormap;
pScreen->UninstallColormap = ilbmUninstallColormap;
pScreen->ListInstalledColormaps = ilbmListInstalledColormaps;
pScreen->StoreColors = (void (*)())NoopDDA;
pScreen->ResolveColor = ilbmResolveColor;
pScreen->BitmapToRegion = ilbmPixmapToRegion;
oldDevPrivate = pScreen->devPrivate;
if (!miScreenInit(pScreen, pbits, xsize, ysize, dpix, dpiy, width, rootdepth,
ndepths, depths, defaultVisual, nvisuals, visuals)) {
ErrorF("miScreenInit: FALSE\n");
return FALSE;
}
pScreen->CloseScreen = ilbmCloseScreen;
pScreen->CreateScreenResources = ilbmCreateScreenResources;
pScreen->BackingStoreFuncs = ilbmBSFuncRec;
pScreen->devPrivates[ilbmScreenPrivateIndex].ptr = pScreen->devPrivate;
pScreen->devPrivate = oldDevPrivate;
return TRUE;
}
PixmapPtr
ilbmGetWindowPixmap(pWin)
WindowPtr pWin;
{
#ifdef PIXMAP_PER_WINDOW
return (PixmapPtr)(pWin->devPrivates[frameWindowPrivateIndex].ptr);
#else
ScreenPtr pScreen = pWin->drawable.pScreen;
return (* pScreen->GetScreenPixmap)(pScreen);
#endif
}
void
ilbmSetWindowPixmap(pWin, pPix)
WindowPtr pWin;
PixmapPtr pPix;
{
#ifdef PIXMAP_PER_WINDOW
pWin->devPrivates[frameWindowPrivateIndex].ptr = (pointer)pPix;
#else
(* pWin->drawable.pScreen->SetScreenPixmap)(pPix);
#endif
}