summaryrefslogtreecommitdiff
path: root/hw/xfree86/xf8_32wid/cfbscrinit.c
diff options
context:
space:
mode:
Diffstat (limited to 'hw/xfree86/xf8_32wid/cfbscrinit.c')
-rw-r--r--hw/xfree86/xf8_32wid/cfbscrinit.c382
1 files changed, 382 insertions, 0 deletions
diff --git a/hw/xfree86/xf8_32wid/cfbscrinit.c b/hw/xfree86/xf8_32wid/cfbscrinit.c
new file mode 100644
index 000000000..93c15371d
--- /dev/null
+++ b/hw/xfree86/xf8_32wid/cfbscrinit.c
@@ -0,0 +1,382 @@
+/*
+ Copyright (C) 1999. The XFree86 Project Inc.
+
+ Written by David S. Miller (davem@redhat.com)
+
+ Based largely upon the xf8_16bpp module which is
+ Mark Vojkovich's work.
+*/
+
+/* $XFree86: xc/programs/Xserver/hw/xfree86/xf8_32wid/cfbscrinit.c,v 1.1 2000/05/21 01:02:43 mvojkovi Exp $ */
+
+#include "X.h"
+#include "Xmd.h"
+#include "misc.h"
+#include "servermd.h"
+#include "scrnintstr.h"
+#include "pixmapstr.h"
+#include "resource.h"
+#include "colormap.h"
+#include "colormapst.h"
+#define PSZ 8
+#include "cfb.h"
+#undef PSZ
+#include "cfb32.h"
+#include "cfb8_32wid.h"
+#include "mi.h"
+#include "micmap.h"
+#include "mistruct.h"
+#include "gcstruct.h"
+#include "dix.h"
+#include "mibstore.h"
+#include "xf86str.h"
+#include "xf86.h"
+
+/* CAUTION: We require that cfb8 and cfb32 were NOT
+ compiled with CFB_NEED_SCREEN_PRIVATE */
+
+int cfb8_32WidScreenPrivateIndex;
+
+static unsigned long cfb8_32WidGeneration = 0;
+extern WindowPtr *WindowTable;
+
+static PixmapPtr cfb8_32WidGetWindowPixmap(WindowPtr pWin);
+
+static void
+cfb8_32WidSaveAreas(
+ PixmapPtr pPixmap,
+ RegionPtr prgnSave,
+ int xorg,
+ int yorg,
+ WindowPtr pWin
+);
+
+static void
+cfb8_32WidRestoreAreas(
+ PixmapPtr pPixmap,
+ RegionPtr prgnRestore,
+ int xorg,
+ int yorg,
+ WindowPtr pWin
+);
+
+static BSFuncRec cfb8_32WidBSFuncRec = {
+ cfb8_32WidSaveAreas,
+ cfb8_32WidRestoreAreas,
+ (BackingStoreSetClipmaskRgnProcPtr) 0,
+ (BackingStoreGetImagePixmapProcPtr) 0,
+ (BackingStoreGetSpansPixmapProcPtr) 0,
+};
+
+static void
+cfb8_32WidGetSpans(
+ DrawablePtr pDraw,
+ int wMax,
+ DDXPointPtr ppt,
+ int *pwidth,
+ int nspans,
+ char *pchardstStart
+);
+
+static void
+cfb8_32WidGetImage (
+ DrawablePtr pDraw,
+ int sx, int sy, int w, int h,
+ unsigned int format,
+ unsigned long planeMask,
+ char *pdstLine
+);
+
+static Bool cfb8_32WidCreateGC(GCPtr pGC);
+static void cfb8_32WidEnableDisableFBAccess(int index, Bool enable);
+
+
+static Bool
+cfb8_32WidAllocatePrivates(ScreenPtr pScreen)
+{
+ cfb8_32WidScreenPtr pScreenPriv;
+
+ if (cfb8_32WidGeneration != serverGeneration) {
+ if ((cfb8_32WidScreenPrivateIndex = AllocateScreenPrivateIndex()) < 0)
+ return FALSE;
+ cfb8_32WidGeneration = serverGeneration;
+ }
+
+ if (!(pScreenPriv = xalloc(sizeof(cfb8_32WidScreenRec))))
+ return FALSE;
+
+ pScreen->devPrivates[cfb8_32WidScreenPrivateIndex].ptr = (pointer)pScreenPriv;
+
+ /* All cfb will have the same GC and Window private indicies */
+ if (!mfbAllocatePrivates(pScreen, &cfbWindowPrivateIndex, &cfbGCPrivateIndex))
+ return FALSE;
+
+ /* The cfb indicies are the mfb indicies. Reallocating them resizes them */
+ if (!AllocateWindowPrivate(pScreen, cfbWindowPrivateIndex, sizeof(cfbPrivWin)))
+ return FALSE;
+
+ if (!AllocateGCPrivate(pScreen, cfbGCPrivateIndex, sizeof(cfbPrivGC)))
+ return FALSE;
+
+ return TRUE;
+}
+
+static Bool
+cfb8_32WidSetupScreen(
+ ScreenPtr pScreen,
+ int xsize, int ysize, /* in pixels */
+ int dpix, int dpiy
+){
+ if (!cfb8_32WidAllocatePrivates(pScreen))
+ return FALSE;
+
+ pScreen->defColormap = FakeClientID(0);
+
+ /* let CreateDefColormap do whatever it wants for pixels */
+ pScreen->blackPixel = pScreen->whitePixel = (Pixel) 0;
+ pScreen->QueryBestSize = mfbQueryBestSize;
+
+ /* SaveScreen */
+ pScreen->GetImage = cfb8_32WidGetImage;
+ pScreen->GetSpans = cfb8_32WidGetSpans;
+ pScreen->CreateWindow = cfb8_32WidCreateWindow;
+ pScreen->DestroyWindow = cfb8_32WidDestroyWindow;
+ pScreen->PositionWindow = cfb8_32WidPositionWindow;
+ pScreen->ChangeWindowAttributes = cfb8_32WidChangeWindowAttributes;
+ pScreen->RealizeWindow = cfb32MapWindow; /* OK */
+ pScreen->UnrealizeWindow = cfb32UnmapWindow; /* OK */
+ pScreen->PaintWindowBackground = cfb8_32WidPaintWindow;
+ pScreen->PaintWindowBorder = cfb8_32WidPaintWindow;
+ pScreen->CopyWindow = cfb8_32WidCopyWindow;
+ pScreen->CreatePixmap = cfb32CreatePixmap; /* OK */
+ pScreen->DestroyPixmap = cfb32DestroyPixmap; /* OK */
+ pScreen->RealizeFont = mfbRealizeFont;
+ pScreen->UnrealizeFont = mfbUnrealizeFont;
+ pScreen->CreateGC = cfb8_32WidCreateGC;
+ pScreen->CreateColormap = miInitializeColormap;
+ pScreen->DestroyColormap = (void (*)())NoopDDA;
+ pScreen->InstallColormap = miInstallColormap;
+ pScreen->UninstallColormap = miUninstallColormap;
+ pScreen->ListInstalledColormaps = miListInstalledColormaps;
+ pScreen->StoreColors = (void (*)())NoopDDA;
+ pScreen->ResolveColor = miResolveColor;
+ pScreen->BitmapToRegion = mfbPixmapToRegion;
+
+ mfbRegisterCopyPlaneProc (pScreen, cfbCopyPlane);
+ return TRUE;
+}
+
+static Bool
+cfb8_32WidCreateScreenResources(ScreenPtr pScreen)
+{
+ ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
+ cfb8_32WidScreenPtr pScreenPriv = CFB8_32WID_GET_SCREEN_PRIVATE(pScreen);
+ PixmapPtr pix8, pix32, pixWid;
+
+ xfree(pScreen->devPrivate); /* freeing miScreenInitParmsRec */
+
+ pix8 = (*pScreen->CreatePixmap)(pScreen, 0, 0, 8);
+ pix32 = (*pScreen->CreatePixmap)(pScreen, 0, 0, pScrn->depth);
+ pixWid = (*pScreen->CreatePixmap)(pScreen, 0, 0, pScreenPriv->bitsPerWid);
+ if (!pix32 || !pix8 || !pixWid)
+ return FALSE;
+
+ pix8->drawable.width = pScreen->width;
+ pix8->drawable.height = pScreen->height;
+ pix8->devKind = pScreenPriv->width8;
+ pix8->devPrivate.ptr = pScreenPriv->pix8;
+
+ pix32->drawable.width = pScreen->width;
+ pix32->drawable.height = pScreen->height;
+ pix32->devKind = pScreenPriv->width32 * 4;
+ pix32->devPrivate.ptr = pScreenPriv->pix32;
+
+ pixWid->drawable.width = pScreen->width;
+ pixWid->drawable.height = pScreen->height;
+ pixWid->devKind = (pScreenPriv->widthWid * pScreenPriv->bitsPerWid) / 8;
+ pixWid->devPrivate.ptr = pScreenPriv->pixWid;
+
+ pScreenPriv->pix8 = (pointer) pix8;
+ pScreenPriv->pix32 = (pointer) pix32;
+ pScreenPriv->pixWid = (pointer) pixWid;
+
+ pScreen->devPrivate = (pointer) pix32;
+
+ return TRUE;
+}
+
+
+static Bool
+cfb8_32WidCloseScreen (int i, ScreenPtr pScreen)
+{
+ cfb8_32WidScreenPtr pScreenPriv = CFB8_32WID_GET_SCREEN_PRIVATE(pScreen);
+
+ xfree((pointer) pScreenPriv);
+
+ return cfb32CloseScreen(i, pScreen);
+}
+
+static Bool
+cfb8_32WidFinishScreenInit(
+ ScreenPtr pScreen,
+ int xsize, int ysize, /* in pixels */
+ int dpix, int dpiy /* dots per inch */
+){
+ ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
+ VisualPtr visuals;
+ DepthPtr depths;
+ int nvisuals;
+ int ndepths;
+ int rootdepth;
+ VisualID defaultVisual;
+
+ rootdepth = 0;
+ if (!miInitVisuals(&visuals, &depths, &nvisuals, &ndepths, &rootdepth,
+ &defaultVisual,((unsigned long)1<<(32-1)), 8, -1))
+ return FALSE;
+
+ if (!miScreenInit(pScreen, NULL, xsize, ysize, dpix, dpiy, 0,
+ rootdepth, ndepths, depths,
+ defaultVisual, nvisuals, visuals))
+ return FALSE;
+
+ pScreen->BackingStoreFuncs = cfb8_32WidBSFuncRec;
+ pScreen->CreateScreenResources = cfb8_32WidCreateScreenResources;
+ pScreen->CloseScreen = cfb8_32WidCloseScreen;
+ pScreen->GetWindowPixmap = cfb8_32WidGetWindowPixmap;
+ pScreen->WindowExposures = cfb8_32WidWindowExposures;
+
+ pScrn->EnableDisableFBAccess = cfb8_32WidEnableDisableFBAccess;
+
+ return TRUE;
+}
+
+Bool
+cfb8_32WidScreenInit(
+ ScreenPtr pScreen,
+ pointer pbits32, /* pointer to screen bitmap */
+ pointer pbits8,
+ pointer pbitsWid, /* pointer to WID bitmap */
+ int xsize, int ysize, /* in pixels */
+ int dpix, int dpiy, /* dots per inch */
+ int width32, /* pixel width of frame buffer */
+ int width8,
+ int widthWid,
+ int bitsPerWid,
+ cfb8_32WidOps *WIDOps
+){
+ cfb8_32WidScreenPtr pScreenPriv;
+
+ if (!WIDOps || !WIDOps->WidGet || !WIDOps->WidAlloc || !WIDOps->WidFree)
+ return FALSE;
+
+ if (!cfb8_32WidSetupScreen(pScreen, xsize, ysize, dpix, dpiy))
+ return FALSE;
+
+ pScreenPriv = CFB8_32WID_GET_SCREEN_PRIVATE(pScreen);
+ pScreenPriv->pix8 = pbits8;
+ pScreenPriv->pix32 = pbits32;
+ pScreenPriv->pixWid = pbitsWid;
+ pScreenPriv->width8 = width8;
+ pScreenPriv->width32 = width32;
+ pScreenPriv->widthWid = widthWid;
+ pScreenPriv->bitsPerWid = bitsPerWid;
+
+ pScreenPriv->WIDOps = xalloc(sizeof(cfb8_32WidOps));
+ if (!pScreenPriv->WIDOps)
+ return FALSE;
+
+ *(pScreenPriv->WIDOps) = *WIDOps;
+
+ if (!WIDOps->WidFillBox || !WIDOps->WidCopyArea)
+ cfb8_32WidGenericOpsInit(pScreenPriv);
+
+ return cfb8_32WidFinishScreenInit(pScreen, xsize, ysize, dpix, dpiy);
+}
+
+static PixmapPtr
+cfb8_32WidGetWindowPixmap(WindowPtr pWin)
+{
+ cfb8_32WidScreenPtr pScreenPriv =
+ CFB8_32WID_GET_SCREEN_PRIVATE(pWin->drawable.pScreen);
+
+ return ((pWin->drawable.bitsPerPixel == 8) ?
+ (PixmapPtr) pScreenPriv->pix8 : (PixmapPtr) pScreenPriv->pix32);
+}
+
+static void
+cfb8_32WidGetImage (DrawablePtr pDraw, int sx, int sy, int w, int h,
+ unsigned int format, unsigned long planemask, char *pdstLine)
+{
+ if (!w || !h)
+ return;
+
+ if (pDraw->bitsPerPixel == 8)
+ cfbGetImage(pDraw, sx, sy, w, h, format, planemask, pdstLine);
+ else
+ cfb32GetImage(pDraw, sx, sy, w, h, format, planemask, pdstLine);
+}
+
+static void
+cfb8_32WidGetSpans(DrawablePtr pDraw, int wMax, DDXPointPtr ppt, int *pwidth, int nspans, char *pDst)
+{
+ if (pDraw->bitsPerPixel == 8)
+ cfbGetSpans(pDraw, wMax, ppt, pwidth, nspans, pDst);
+ else
+ cfb32GetSpans(pDraw, wMax, ppt, pwidth, nspans, pDst);
+}
+
+static void
+cfb8_32WidSaveAreas(PixmapPtr pPixmap, RegionPtr prgnSave, int xorg, int yorg, WindowPtr pWin)
+{
+ if (pWin->drawable.bitsPerPixel == 8)
+ cfbSaveAreas(pPixmap, prgnSave, xorg, yorg, pWin);
+ else
+ cfb32SaveAreas(pPixmap, prgnSave, xorg, yorg, pWin);
+}
+
+static void
+cfb8_32WidRestoreAreas(PixmapPtr pPixmap, RegionPtr prgnRestore, int xorg, int yorg, WindowPtr pWin)
+{
+ if (pWin->drawable.bitsPerPixel == 8)
+ cfbRestoreAreas(pPixmap, prgnRestore, xorg, yorg, pWin);
+ else
+ cfb32RestoreAreas(pPixmap, prgnRestore, xorg, yorg, pWin);
+}
+
+
+static Bool
+cfb8_32WidCreateGC(GCPtr pGC)
+{
+ if (pGC->depth == 8)
+ return cfbCreateGC(pGC);
+ else
+ return cfb32CreateGC(pGC);
+}
+
+static void
+cfb8_32WidEnableDisableFBAccess(int index, Bool enable)
+{
+ ScreenPtr pScreen = xf86Screens[index]->pScreen;
+ cfb8_32WidScreenPtr pScreenPriv = CFB8_32WID_GET_SCREEN_PRIVATE(pScreen);
+ static DevUnion devPrivates8[MAXSCREENS];
+ static DevUnion devPrivates32[MAXSCREENS];
+ PixmapPtr pix8, pix32;
+
+ pix8 = (PixmapPtr) pScreenPriv->pix8;
+ pix32 = (PixmapPtr) pScreenPriv->pix32;
+
+ if (enable) {
+ pix8->devPrivate = devPrivates8[index];
+ pix32->devPrivate = devPrivates32[index];
+ }
+
+ xf86EnableDisableFBAccess (index, enable);
+
+ if (!enable) {
+ devPrivates8[index] = pix8->devPrivate;
+ pix8->devPrivate.ptr = 0;
+ devPrivates32[index] = pix32->devPrivate;
+ pix32->devPrivate.ptr = 0;
+ }
+}