예제 #1
0
파일: fake.c 프로젝트: Agnesa/xserver
Bool
fakeScreenInitialize(KdScreenInfo * screen, FakeScrPriv * scrpriv)
{
    if (!screen->width || !screen->height) {
        screen->width = 1024;
        screen->height = 768;
        screen->rate = 72;
    }

    if (screen->width <= 0)
        screen->width = 1;
    if (screen->height <= 0)
        screen->height = 1;

    if (!screen->fb.depth)
        screen->fb.depth = 16;

    if (screen->fb.depth <= 8) {
        screen->fb.visuals = ((1 << StaticGray) |
                              (1 << GrayScale) |
                              (1 << StaticColor) |
                              (1 << PseudoColor) |
                              (1 << TrueColor) | (1 << DirectColor));
    }
    else {
        screen->fb.visuals = (1 << TrueColor);
#define Mask(o,l)   (((1 << l) - 1) << o)
        if (screen->fb.depth <= 15) {
            screen->fb.depth = 15;
            screen->fb.bitsPerPixel = 16;
            screen->fb.redMask = Mask (10, 5);
            screen->fb.greenMask = Mask (5, 5);
            screen->fb.blueMask = Mask (0, 5);
        }
        else if (screen->fb.depth <= 16) {
            screen->fb.depth = 16;
            screen->fb.bitsPerPixel = 16;
            screen->fb.redMask = Mask (11, 5);
            screen->fb.greenMask = Mask (5, 6);
            screen->fb.blueMask = Mask (0, 5);
        }
        else {
            screen->fb.depth = 24;
            screen->fb.bitsPerPixel = 32;
            screen->fb.redMask = Mask (16, 8);
            screen->fb.greenMask = Mask (8, 8);
            screen->fb.blueMask = Mask (0, 8);
        }
    }

    scrpriv->randr = screen->randr;

    return fakeMapFramebuffer(screen);
}
예제 #2
0
파일: vrx.c 프로젝트: eriytt/xserver-xsdl
Bool
fakeRandRSetConfig (ScreenPtr			pScreen,
					 Rotation			randr,
					 int				rate,
					 RRScreenSizePtr	pSize)
{
	KdScreenPriv(pScreen);
	KdScreenInfo		*screen = pScreenPriv->screen;
	FakeScrPriv *scrpriv = screen->driver;
	Bool				wasEnabled = pScreenPriv->enabled;
	FakeScrPriv oldscr;
	int					oldwidth;
	int					oldheight;
	int					oldmmwidth;
	int					oldmmheight;
	int					newwidth, newheight;

	if (screen->randr & (RR_Rotate_0|RR_Rotate_180))
	{
		newwidth = pSize->width;
		newheight = pSize->height;
	}
	else
	{
		newwidth = pSize->height;
		newheight = pSize->width;
	}

	if (wasEnabled)
		KdDisableScreen (pScreen);

	oldscr = *scrpriv;
	
	oldwidth = screen->width;
	oldheight = screen->height;
	oldmmwidth = pScreen->mmWidth;
	oldmmheight = pScreen->mmHeight;
	
	/*
	 * Set new configuration
	 */
	
	scrpriv->randr = KdAddRotation (screen->randr, randr);

	fakeUnmapFramebuffer (screen);
	
	if (!fakeMapFramebuffer (screen))
		goto bail4;

	KdShadowUnset (screen->pScreen);

	if (!fakeSetShadow (screen->pScreen))
		goto bail4;

	fakeSetScreenSizes (screen->pScreen);

	/*
	 * Set frame buffer mapping
	 */
	(*pScreen->ModifyPixmapHeader) (fbGetScreenPixmap (pScreen),
									pScreen->width,
									pScreen->height,
									screen->fb.depth,
									screen->fb.bitsPerPixel,
									screen->fb.byteStride,
									screen->fb.frameBuffer);
	
	/* set the subpixel order */
	
	KdSetSubpixelOrder (pScreen, scrpriv->randr);
	if (wasEnabled)
		KdEnableScreen (pScreen);

	return TRUE;

bail4:
	fakeUnmapFramebuffer (screen);
	*scrpriv = oldscr;
	(void) fakeMapFramebuffer (screen);
	pScreen->width = oldwidth;
	pScreen->height = oldheight;
	pScreen->mmWidth = oldmmwidth;
	pScreen->mmHeight = oldmmheight;
	
	if (wasEnabled)
		KdEnableScreen (pScreen);
	return FALSE;
}