1
/* $Xorg: InitOutput.c,v 1.4 2001/02/09 02:04:45 xorgcvs Exp $ */
4
Copyright 1993, 1998 The Open Group
6
Permission to use, copy, modify, distribute, and sell this software and its
7
documentation for any purpose is hereby granted without fee, provided that
8
the above copyright notice appear in all copies and that both that
9
copyright notice and this permission notice appear in supporting
12
The above copyright notice and this permission notice shall be included
13
in all copies or substantial portions of the Software.
15
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
16
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
18
IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR
19
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
20
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
21
OTHER DEALINGS IN THE SOFTWARE.
23
Except as contained in this notice, the name of The Open Group shall
24
not be used in advertising or otherwise to promote the sale, use or
25
other dealings in this Software without prior written authorization
29
/* $XFree86: xc/programs/Xserver/hw/vfb/InitOutput.c,v 3.25 2003/11/15 04:01:56 dawes Exp $ */
31
#ifdef HAVE_DIX_CONFIG_H
32
#include <dix-config.h>
36
#include <X11/Xwinsock.h>
41
#include <X11/Xproto.h>
43
#include "scrnintstr.h"
48
#include "colormapst.h"
51
#include "mipointer.h"
53
#include <sys/types.h>
63
#include <sys/param.h>
65
#include <X11/XWDFile.h>
73
#define VFB_DEFAULT_WIDTH 1280
74
#define VFB_DEFAULT_HEIGHT 1024
75
#define VFB_DEFAULT_DEPTH 8
76
#define VFB_DEFAULT_WHITEPIXEL 1
77
#define VFB_DEFAULT_BLACKPIXEL 0
78
#define VFB_DEFAULT_LINEBIAS 0
79
#define XWD_WINDOW_NAME_LEN 60
94
XWDFileHeader *pXWDHeader;
97
unsigned int lineBias;
98
CloseScreenProcPtr closeScreen;
102
char mmap_file[MAXPATHLEN];
108
} vfbScreenInfo, *vfbScreenInfoPtr;
110
static int vfbNumScreens;
111
static vfbScreenInfo vfbScreens[MAXSCREENS];
112
static Bool vfbPixmapDepths[33];
114
static char *pfbdir = NULL;
116
typedef enum { NORMAL_MEMORY_FB, SHARED_MEMORY_FB, MMAPPED_FILE_FB } fbMemType;
117
static fbMemType fbmemtype = NORMAL_MEMORY_FB;
118
static char needswap = 0;
119
static int lastScreen = -1;
120
static Bool Render = TRUE;
122
#define swapcopy16(_dst, _src) \
123
if (needswap) { CARD16 _s = _src; cpswaps(_s, _dst); } \
126
#define swapcopy32(_dst, _src) \
127
if (needswap) { CARD32 _s = _src; cpswapl(_s, _dst); } \
132
vfbInitializePixmapDepths(void)
135
vfbPixmapDepths[1] = TRUE; /* always need bitmaps */
136
for (i = 2; i <= 32; i++)
137
vfbPixmapDepths[i] = FALSE;
141
vfbInitializeDefaultScreens(void)
145
for (i = 0; i < MAXSCREENS; i++)
147
vfbScreens[i].scrnum = i;
148
vfbScreens[i].width = VFB_DEFAULT_WIDTH;
149
vfbScreens[i].height = VFB_DEFAULT_HEIGHT;
150
vfbScreens[i].depth = VFB_DEFAULT_DEPTH;
151
vfbScreens[i].blackPixel = VFB_DEFAULT_BLACKPIXEL;
152
vfbScreens[i].whitePixel = VFB_DEFAULT_WHITEPIXEL;
153
vfbScreens[i].lineBias = VFB_DEFAULT_LINEBIAS;
154
vfbScreens[i].pfbMemory = NULL;
160
vfbBitsPerPixel(int depth)
162
if (depth == 1) return 1;
163
else if (depth <= 8) return 8;
164
else if (depth <= 16) return 16;
173
/* clean up the framebuffers */
178
case MMAPPED_FILE_FB:
179
for (i = 0; i < vfbNumScreens; i++)
181
if (-1 == unlink(vfbScreens[i].mmap_file))
184
ErrorF("unlink %s failed, errno %d",
185
vfbScreens[i].mmap_file, errno);
190
case MMAPPED_FILE_FB:
192
#endif /* HAS_MMAP */
195
case SHARED_MEMORY_FB:
196
for (i = 0; i < vfbNumScreens; i++)
198
if (-1 == shmdt((char *)vfbScreens[i].pXWDHeader))
201
ErrorF("shmdt failed, errno %d", errno);
206
case SHARED_MEMORY_FB:
210
case NORMAL_MEMORY_FB:
211
for (i = 0; i < vfbNumScreens; i++)
213
Xfree(vfbScreens[i].pXWDHeader);
227
DarwinHandleGUI(int argc, char *argv[])
231
void GlxExtensionInit();
232
void GlxWrapInitVisuals(void *procPtr);
235
DarwinGlxExtensionInit()
241
DarwinGlxWrapInitVisuals(
244
GlxWrapInitVisuals(procPtr);
258
void ddxBeforeReset(void)
266
ErrorF("-screen scrn WxHxD set screen's width, height, depth\n");
267
ErrorF("-pixdepths list-of-int support given pixmap depths\n");
269
ErrorF("+/-render turn on/of RENDER extension support"
272
ErrorF("-linebias n adjust thin line pixelization\n");
273
ErrorF("-blackpixel n pixel value for black\n");
274
ErrorF("-whitepixel n pixel value for white\n");
277
ErrorF("-fbdir directory put framebuffers in mmap'ed files in directory\n");
281
ErrorF("-shmem put framebuffers in shared memory\n");
285
/* ddxInitGlobals - called by |InitGlobals| from os/util.c */
286
void ddxInitGlobals(void)
291
ddxProcessArgument(int argc, char *argv[], int i)
293
static Bool firstTime = TRUE;
297
vfbInitializeDefaultScreens();
298
vfbInitializePixmapDepths();
302
if (strcmp (argv[i], "-screen") == 0) /* -screen n WxHxD */
305
if (i + 2 >= argc) UseMsg();
306
screenNum = atoi(argv[i+1]);
307
if (screenNum < 0 || screenNum >= MAXSCREENS)
309
ErrorF("Invalid screen number %d\n", screenNum);
312
if (3 != sscanf(argv[i+2], "%dx%dx%d",
313
&vfbScreens[screenNum].width,
314
&vfbScreens[screenNum].height,
315
&vfbScreens[screenNum].depth))
317
ErrorF("Invalid screen configuration %s\n", argv[i+2]);
321
if (screenNum >= vfbNumScreens)
322
vfbNumScreens = screenNum + 1;
323
lastScreen = screenNum;
327
if (strcmp (argv[i], "-pixdepths") == 0) /* -pixdepths list-of-depth */
331
if (++i >= argc) UseMsg();
332
while ((i < argc) && (depth = atoi(argv[i++])) != 0)
334
if (depth < 0 || depth > 32)
336
ErrorF("Invalid pixmap depth %d\n", depth);
339
vfbPixmapDepths[depth] = TRUE;
345
if (strcmp (argv[i], "+render") == 0) /* +render */
351
if (strcmp (argv[i], "-render") == 0) /* -render */
357
if (strcmp (argv[i], "-blackpixel") == 0) /* -blackpixel n */
360
if (++i >= argc) UseMsg();
362
if (-1 == lastScreen)
365
for (i = 0; i < MAXSCREENS; i++)
367
vfbScreens[i].blackPixel = pix;
372
vfbScreens[lastScreen].blackPixel = pix;
377
if (strcmp (argv[i], "-whitepixel") == 0) /* -whitepixel n */
380
if (++i >= argc) UseMsg();
382
if (-1 == lastScreen)
385
for (i = 0; i < MAXSCREENS; i++)
387
vfbScreens[i].whitePixel = pix;
392
vfbScreens[lastScreen].whitePixel = pix;
397
if (strcmp (argv[i], "-linebias") == 0) /* -linebias n */
399
unsigned int linebias;
400
if (++i >= argc) UseMsg();
401
linebias = atoi(argv[i]);
402
if (-1 == lastScreen)
405
for (i = 0; i < MAXSCREENS; i++)
407
vfbScreens[i].lineBias = linebias;
412
vfbScreens[lastScreen].lineBias = linebias;
418
if (strcmp (argv[i], "-fbdir") == 0) /* -fbdir directory */
420
if (++i >= argc) UseMsg();
422
fbmemtype = MMAPPED_FILE_FB;
425
#endif /* HAS_MMAP */
428
if (strcmp (argv[i], "-shmem") == 0) /* -shmem */
430
fbmemtype = SHARED_MEMORY_FB;
438
#ifdef DDXTIME /* from ServerOSDefines */
445
return(tp.tv_sec * 1000) + (tp.tv_usec / 1000);
449
static ColormapPtr InstalledMaps[MAXSCREENS];
452
vfbListInstalledColormaps(ScreenPtr pScreen, Colormap *pmaps)
454
/* By the time we are processing requests, we can guarantee that there
455
* is always a colormap installed */
456
*pmaps = InstalledMaps[pScreen->myNum]->mid;
462
vfbInstallColormap(ColormapPtr pmap)
464
int index = pmap->pScreen->myNum;
465
ColormapPtr oldpmap = InstalledMaps[index];
470
XWDFileHeader *pXWDHeader;
478
if(oldpmap != (ColormapPtr)None)
479
WalkTree(pmap->pScreen, TellLostMap, (char *)&oldpmap->mid);
481
InstalledMaps[index] = pmap;
482
WalkTree(pmap->pScreen, TellGainedMap, (char *)&pmap->mid);
484
entries = pmap->pVisual->ColormapEntries;
485
pXWDHeader = vfbScreens[pmap->pScreen->myNum].pXWDHeader;
486
pXWDCmap = vfbScreens[pmap->pScreen->myNum].pXWDCmap;
487
pVisual = pmap->pVisual;
489
swapcopy32(pXWDHeader->visual_class, pVisual->class);
490
swapcopy32(pXWDHeader->red_mask, pVisual->redMask);
491
swapcopy32(pXWDHeader->green_mask, pVisual->greenMask);
492
swapcopy32(pXWDHeader->blue_mask, pVisual->blueMask);
493
swapcopy32(pXWDHeader->bits_per_rgb, pVisual->bitsPerRGBValue);
494
swapcopy32(pXWDHeader->colormap_entries, pVisual->ColormapEntries);
496
ppix = (Pixel *)ALLOCATE_LOCAL(entries * sizeof(Pixel));
497
prgb = (xrgb *)ALLOCATE_LOCAL(entries * sizeof(xrgb));
498
defs = (xColorItem *)ALLOCATE_LOCAL(entries * sizeof(xColorItem));
500
for (i = 0; i < entries; i++) ppix[i] = i;
502
QueryColors(pmap, entries, ppix, prgb);
504
for (i = 0; i < entries; i++) { /* convert xrgbs to xColorItems */
505
defs[i].pixel = ppix[i] & 0xff; /* change pixel to index */
506
defs[i].red = prgb[i].red;
507
defs[i].green = prgb[i].green;
508
defs[i].blue = prgb[i].blue;
509
defs[i].flags = DoRed|DoGreen|DoBlue;
511
(*pmap->pScreen->StoreColors)(pmap, entries, defs);
513
DEALLOCATE_LOCAL(ppix);
514
DEALLOCATE_LOCAL(prgb);
515
DEALLOCATE_LOCAL(defs);
520
vfbUninstallColormap(ColormapPtr pmap)
522
ColormapPtr curpmap = InstalledMaps[pmap->pScreen->myNum];
526
if (pmap->mid != pmap->pScreen->defColormap)
528
curpmap = (ColormapPtr) LookupIDByType(pmap->pScreen->defColormap,
530
(*pmap->pScreen->InstallColormap)(curpmap);
536
vfbStoreColors(ColormapPtr pmap, int ndef, xColorItem *pdefs)
541
if (pmap != InstalledMaps[pmap->pScreen->myNum])
546
pXWDCmap = vfbScreens[pmap->pScreen->myNum].pXWDCmap;
548
if ((pmap->pVisual->class | DynamicClass) == DirectColor)
553
for (i = 0; i < ndef; i++)
555
if (pdefs[i].flags & DoRed)
557
swapcopy16(pXWDCmap[pdefs[i].pixel].red, pdefs[i].red);
559
if (pdefs[i].flags & DoGreen)
561
swapcopy16(pXWDCmap[pdefs[i].pixel].green, pdefs[i].green);
563
if (pdefs[i].flags & DoBlue)
565
swapcopy16(pXWDCmap[pdefs[i].pixel].blue, pdefs[i].blue);
571
vfbSaveScreen(ScreenPtr pScreen, int on)
578
/* this flushes any changes to the screens out to the mmapped file */
580
vfbBlockHandler(pointer blockData, OSTimePtr pTimeout, pointer pReadmask)
584
for (i = 0; i < vfbNumScreens; i++)
587
if (-1 == msync((caddr_t)vfbScreens[i].pXWDHeader,
588
(size_t)vfbScreens[i].sizeInBytes, MS_ASYNC))
590
/* silly NetBSD and who else? */
591
if (-1 == msync((caddr_t)vfbScreens[i].pXWDHeader,
592
(size_t)vfbScreens[i].sizeInBytes))
596
ErrorF("msync failed, errno %d", errno);
603
vfbWakeupHandler(pointer blockData, int result, pointer pReadmask)
609
vfbAllocateMmappedFramebuffer(vfbScreenInfoPtr pvfb)
611
#define DUMMY_BUFFER_SIZE 65536
612
char dummyBuffer[DUMMY_BUFFER_SIZE];
613
int currentFileSize, writeThisTime;
615
sprintf(pvfb->mmap_file, "%s/Xvfb_screen%d", pfbdir, pvfb->scrnum);
616
if (-1 == (pvfb->mmap_fd = open(pvfb->mmap_file, O_CREAT|O_RDWR, 0666)))
619
ErrorF("open %s failed, errno %d", pvfb->mmap_file, errno);
623
/* Extend the file to be the proper size */
625
bzero(dummyBuffer, DUMMY_BUFFER_SIZE);
626
for (currentFileSize = 0;
627
currentFileSize < pvfb->sizeInBytes;
628
currentFileSize += writeThisTime)
630
writeThisTime = min(DUMMY_BUFFER_SIZE,
631
pvfb->sizeInBytes - currentFileSize);
632
if (-1 == write(pvfb->mmap_fd, dummyBuffer, writeThisTime))
635
ErrorF("write %s failed, errno %d", pvfb->mmap_file, errno);
640
/* try to mmap the file */
642
pvfb->pXWDHeader = (XWDFileHeader *)mmap((caddr_t)NULL, pvfb->sizeInBytes,
643
PROT_READ|PROT_WRITE,
646
if (-1 == (long)pvfb->pXWDHeader)
649
ErrorF("mmap %s failed, errno %d", pvfb->mmap_file, errno);
650
pvfb->pXWDHeader = NULL;
654
if (!RegisterBlockAndWakeupHandlers(vfbBlockHandler, vfbWakeupHandler,
657
pvfb->pXWDHeader = NULL;
660
#endif /* HAS_MMAP */
665
vfbAllocateSharedMemoryFramebuffer(vfbScreenInfoPtr pvfb)
667
/* create the shared memory segment */
669
pvfb->shmid = shmget(IPC_PRIVATE, pvfb->sizeInBytes, IPC_CREAT|0777);
673
ErrorF("shmget %d bytes failed, errno %d", pvfb->sizeInBytes, errno);
677
/* try to attach it */
679
pvfb->pXWDHeader = (XWDFileHeader *)shmat(pvfb->shmid, 0, 0);
680
if (-1 == (long)pvfb->pXWDHeader)
683
ErrorF("shmat failed, errno %d", errno);
684
pvfb->pXWDHeader = NULL;
688
ErrorF("screen %d shmid %d\n", pvfb->scrnum, pvfb->shmid);
693
vfbAllocateFramebufferMemory(vfbScreenInfoPtr pvfb)
695
if (pvfb->pfbMemory) return pvfb->pfbMemory; /* already done */
697
pvfb->sizeInBytes = pvfb->paddedBytesWidth * pvfb->height;
699
/* Calculate how many entries in colormap. This is rather bogus, because
700
* the visuals haven't even been set up yet, but we need to know because we
701
* have to allocate space in the file for the colormap. The number 10
702
* below comes from the MAX_PSEUDO_DEPTH define in cfbcmap.c.
705
if (pvfb->depth <= 10)
706
{ /* single index colormaps */
707
pvfb->ncolors = 1 << pvfb->depth;
710
{ /* decomposed colormaps */
711
int nplanes_per_color_component = pvfb->depth / 3;
712
if (pvfb->depth % 3) nplanes_per_color_component++;
713
pvfb->ncolors = 1 << nplanes_per_color_component;
716
/* add extra bytes for XWDFileHeader, window name, and colormap */
718
pvfb->sizeInBytes += SIZEOF(XWDheader) + XWD_WINDOW_NAME_LEN +
719
pvfb->ncolors * SIZEOF(XWDColor);
721
pvfb->pXWDHeader = NULL;
725
case MMAPPED_FILE_FB: vfbAllocateMmappedFramebuffer(pvfb); break;
727
case MMAPPED_FILE_FB: break;
731
case SHARED_MEMORY_FB: vfbAllocateSharedMemoryFramebuffer(pvfb); break;
733
case SHARED_MEMORY_FB: break;
736
case NORMAL_MEMORY_FB:
737
pvfb->pXWDHeader = (XWDFileHeader *)Xalloc(pvfb->sizeInBytes);
741
if (pvfb->pXWDHeader)
743
pvfb->pXWDCmap = (XWDColor *)((char *)pvfb->pXWDHeader
744
+ SIZEOF(XWDheader) + XWD_WINDOW_NAME_LEN);
745
pvfb->pfbMemory = (char *)(pvfb->pXWDCmap + pvfb->ncolors);
747
return pvfb->pfbMemory;
755
vfbWriteXWDFileHeader(ScreenPtr pScreen)
757
vfbScreenInfoPtr pvfb = &vfbScreens[pScreen->myNum];
758
XWDFileHeader *pXWDHeader = pvfb->pXWDHeader;
759
char hostname[XWD_WINDOW_NAME_LEN];
760
unsigned long swaptest = 1;
763
needswap = *(char *) &swaptest;
765
pXWDHeader->header_size = (char *)pvfb->pXWDCmap - (char *)pvfb->pXWDHeader;
766
pXWDHeader->file_version = XWD_FILE_VERSION;
768
pXWDHeader->pixmap_format = ZPixmap;
769
pXWDHeader->pixmap_depth = pvfb->depth;
770
pXWDHeader->pixmap_height = pXWDHeader->window_height = pvfb->height;
771
pXWDHeader->xoffset = 0;
772
pXWDHeader->byte_order = IMAGE_BYTE_ORDER;
773
pXWDHeader->bitmap_bit_order = BITMAP_BIT_ORDER;
774
#ifndef INTERNAL_VS_EXTERNAL_PADDING
775
pXWDHeader->pixmap_width = pXWDHeader->window_width = pvfb->width;
776
pXWDHeader->bitmap_unit = BITMAP_SCANLINE_UNIT;
777
pXWDHeader->bitmap_pad = BITMAP_SCANLINE_PAD;
779
pXWDHeader->pixmap_width = pXWDHeader->window_width = pvfb->paddedWidth;
780
pXWDHeader->bitmap_unit = BITMAP_SCANLINE_UNIT_PROTO;
781
pXWDHeader->bitmap_pad = BITMAP_SCANLINE_PAD_PROTO;
783
pXWDHeader->bits_per_pixel = pvfb->bitsPerPixel;
784
pXWDHeader->bytes_per_line = pvfb->paddedBytesWidth;
785
pXWDHeader->ncolors = pvfb->ncolors;
787
/* visual related fields are written when colormap is installed */
789
pXWDHeader->window_x = pXWDHeader->window_y = 0;
790
pXWDHeader->window_bdrwidth = 0;
792
/* write xwd "window" name: Xvfb hostname:server.screen */
794
if (-1 == gethostname(hostname, sizeof(hostname)))
797
hostname[XWD_WINDOW_NAME_LEN-1] = 0;
798
sprintf((char *)(pXWDHeader+1), "Xvfb %s:%s.%d", hostname, display,
801
/* write colormap pixel slot values */
803
for (i = 0; i < pvfb->ncolors; i++)
805
pvfb->pXWDCmap[i].pixel = i;
808
/* byte swap to most significant byte first */
812
SwapLongs((CARD32 *)pXWDHeader, SIZEOF(XWDheader)/4);
813
for (i = 0; i < pvfb->ncolors; i++)
816
swapl(&pvfb->pXWDCmap[i].pixel, n);
823
vfbCursorOffScreen (ScreenPtr *ppScreen, int *x, int *y)
829
vfbCrossScreen (ScreenPtr pScreen, Bool entering)
833
static miPointerScreenFuncRec vfbPointerCursorFuncs =
841
vfbCloseScreen(int index, ScreenPtr pScreen)
843
vfbScreenInfoPtr pvfb = &vfbScreens[index];
846
pScreen->CloseScreen = pvfb->closeScreen;
849
* XXX probably lots of stuff to clean. For now,
850
* clear InstalledMaps[] so that server reset works correctly.
852
for (i = 0; i < MAXSCREENS; i++)
853
InstalledMaps[i] = NULL;
855
return pScreen->CloseScreen(index, pScreen);
859
vfbScreenInit(int index, ScreenPtr pScreen, int argc, char **argv)
861
vfbScreenInfoPtr pvfb = &vfbScreens[index];
862
int dpix = monitorResolution, dpiy = monitorResolution;
872
pvfb->paddedBytesWidth = PixmapBytePad(pvfb->width, pvfb->depth);
873
pvfb->bitsPerPixel = vfbBitsPerPixel(pvfb->depth);
874
if (pvfb->bitsPerPixel >= 8 )
875
pvfb->paddedWidth = pvfb->paddedBytesWidth / (pvfb->bitsPerPixel / 8);
877
pvfb->paddedWidth = pvfb->paddedBytesWidth * 8;
878
pbits = vfbAllocateFramebufferMemory(pvfb);
879
if (!pbits) return FALSE;
881
miSetPixmapDepths ();
883
switch (pvfb->depth) {
885
miSetVisualTypesAndMasks (8,
892
8, PseudoColor, 0, 0, 0);
895
/* 12bit PseudoColor with 12bit color resolution
896
* (to simulate SGI hardware and the 12bit PseudoColor emulation layer) */
898
miSetVisualTypesAndMasks (12,
905
12, PseudoColor, 0, 0, 0);
909
miSetVisualTypesAndMasks (15,
912
8, TrueColor, 0x7c00, 0x03e0, 0x001f);
915
miSetVisualTypesAndMasks (16,
918
8, TrueColor, 0xf800, 0x07e0, 0x001f);
921
miSetVisualTypesAndMasks (24,
924
8, TrueColor, 0xff0000, 0x00ff00, 0x0000ff);
927
/* 30bit TrueColor (to simulate Sun's XVR-1000/-4000 high quality
928
* framebuffer series) */
930
miSetVisualTypesAndMasks (30,
933
10, TrueColor, 0x3ff00000, 0x000ffc00, 0x000003ff);
938
ret = fbScreenInit(pScreen, pbits, pvfb->width, pvfb->height,
939
dpix, dpiy, pvfb->paddedWidth,pvfb->bitsPerPixel);
942
fbPictureInit (pScreen, 0, 0);
945
if (!ret) return FALSE;
947
miInitializeBackingStore(pScreen);
950
* Circumvent the backing store that was just initialised. This amounts
951
* to a truely bizarre way of initialising SaveDoomedAreas and friends.
954
pScreen->InstallColormap = vfbInstallColormap;
955
pScreen->UninstallColormap = vfbUninstallColormap;
956
pScreen->ListInstalledColormaps = vfbListInstalledColormaps;
958
pScreen->SaveScreen = vfbSaveScreen;
959
pScreen->StoreColors = vfbStoreColors;
961
miDCInitialize(pScreen, &vfbPointerCursorFuncs);
963
vfbWriteXWDFileHeader(pScreen);
965
pScreen->blackPixel = pvfb->blackPixel;
966
pScreen->whitePixel = pvfb->whitePixel;
968
ret = fbCreateDefColormap(pScreen);
970
miSetZeroLineBias(pScreen, pvfb->lineBias);
972
pvfb->closeScreen = pScreen->CloseScreen;
973
pScreen->CloseScreen = vfbCloseScreen;
977
} /* end vfbScreenInit */
981
InitOutput(ScreenInfo *screenInfo, int argc, char **argv)
986
/* initialize pixmap formats */
988
/* must have a pixmap depth to match every screen depth */
989
for (i = 0; i < vfbNumScreens; i++)
991
vfbPixmapDepths[vfbScreens[i].depth] = TRUE;
994
/* RENDER needs a good set of pixmaps. */
996
vfbPixmapDepths[1] = TRUE;
997
vfbPixmapDepths[4] = TRUE;
998
vfbPixmapDepths[8] = TRUE;
1000
vfbPixmapDepths[12] = TRUE;
1002
/* vfbPixmapDepths[15] = TRUE; */
1003
vfbPixmapDepths[16] = TRUE;
1004
vfbPixmapDepths[24] = TRUE;
1006
vfbPixmapDepths[30] = TRUE;
1008
vfbPixmapDepths[32] = TRUE;
1011
for (i = 1; i <= 32; i++)
1013
if (vfbPixmapDepths[i])
1015
if (NumFormats >= MAXFORMATS)
1016
FatalError ("MAXFORMATS is too small for this server\n");
1017
screenInfo->formats[NumFormats].depth = i;
1018
screenInfo->formats[NumFormats].bitsPerPixel = vfbBitsPerPixel(i);
1019
screenInfo->formats[NumFormats].scanlinePad = BITMAP_SCANLINE_PAD;
1024
screenInfo->imageByteOrder = IMAGE_BYTE_ORDER;
1025
screenInfo->bitmapScanlineUnit = BITMAP_SCANLINE_UNIT;
1026
screenInfo->bitmapScanlinePad = BITMAP_SCANLINE_PAD;
1027
screenInfo->bitmapBitOrder = BITMAP_BIT_ORDER;
1028
screenInfo->numPixmapFormats = NumFormats;
1030
/* initialize screens */
1032
for (i = 0; i < vfbNumScreens; i++)
1034
if (-1 == AddScreen(vfbScreenInit, argc, argv))
1036
FatalError("Couldn't add screen %d", i);
1040
} /* end InitOutput */
1042
/* this is just to get the server to link on AIX */
1044
int SelectWaitTime = 10000; /* usec */