From 7a309461eb3ba06f7d4ebdcb9da5d25c3457583c Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Mon, 17 Apr 2006 04:54:08 +0000 Subject: [PATCH] Fixed bug #197 On servers with the composite extension enabled, visuals with 32-bit depth have an alpha mask. This is pretty neat, but SDL needs a bit more work to handle these properly, so for now, we'll just use 24 bit depth visuals. --- src/video/x11/SDL_x11modes.c | 4 ++++ src/video/x11/SDL_x11video.c | 12 +++++++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/video/x11/SDL_x11modes.c b/src/video/x11/SDL_x11modes.c index 6e8851875..9b2708e3a 100644 --- a/src/video/x11/SDL_x11modes.c +++ b/src/video/x11/SDL_x11modes.c @@ -620,7 +620,11 @@ int X11_GetVideoModes(_THIS) #endif /* SDL_VIDEO_DRIVER_X11_XME */ { + /* It's interesting to note that if we allow 32 bit depths, + we get a visual with an alpha mask on composite servers. static int depth_list[] = { 32, 24, 16, 15, 8 }; + */ + static int depth_list[] = { 24, 16, 15, 8 }; int j, np; int use_directcolor = 1; XPixmapFormatValues *pf; diff --git a/src/video/x11/SDL_x11video.c b/src/video/x11/SDL_x11video.c index ee8c535d8..b419e352c 100644 --- a/src/video/x11/SDL_x11video.c +++ b/src/video/x11/SDL_x11video.c @@ -557,6 +557,9 @@ static int X11_VideoInit(_THIS, SDL_PixelFormat *vformat) vformat->Gmask = SDL_Visual->green_mask; vformat->Bmask = SDL_Visual->blue_mask; } + if ( this->hidden->depth == 32 ) { + vformat->Amask = (0xFFFFFFFF & ~(vformat->Rmask|vformat->Gmask|vformat->Bmask)); + } X11_SaveVidModeGamma(this); /* See if we have been passed a window to use */ @@ -772,6 +775,7 @@ static int X11_CreateWindow(_THIS, SDL_Surface *screen, int i, depth; Visual *vis; int vis_change; + Uint32 Amask; /* If a window is already present, destroy it and start fresh */ if ( SDL_Window ) { @@ -822,9 +826,15 @@ static int X11_CreateWindow(_THIS, SDL_Surface *screen, this->hidden->depth = depth; /* Allocate the new pixel format for this video mode */ + if ( this->hidden->depth == 32 ) { + Amask = (0xFFFFFFFF & ~(vis->red_mask|vis->green_mask|vis->blue_mask)); + } else { + Amask = 0; + } if ( ! SDL_ReallocFormat(screen, bpp, - vis->red_mask, vis->green_mask, vis->blue_mask, 0) ) + vis->red_mask, vis->green_mask, vis->blue_mask, Amask) ) { return -1; + } /* Create the appropriate colormap */ if ( SDL_XColorMap != SDL_DisplayColormap ) {