Mercurial > sdl-ios-xcode
diff src/video/x11/SDL_x11modes.c @ 2870:b801df19835f
The X11 window and all pixmaps and images share the same visual and depth.
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Sun, 14 Dec 2008 04:36:32 +0000 |
parents | 99210400e8b9 |
children | b33e38aaa027 |
line wrap: on
line diff
--- a/src/video/x11/SDL_x11modes.c Sat Dec 13 13:30:11 2008 +0000 +++ b/src/video/x11/SDL_x11modes.c Sun Dec 14 04:36:32 2008 +0000 @@ -57,19 +57,72 @@ return -1; } +static Uint32 +X11_GetPixelFormatFromVisualInfo(Display *display, XVisualInfo *vinfo) +{ + if (vinfo->class == DirectColor || vinfo->class == TrueColor) { + int bpp; + Uint32 Rmask, Gmask, Bmask, Amask; + + Rmask = vinfo->visual->red_mask; + Gmask = vinfo->visual->green_mask; + Bmask = vinfo->visual->blue_mask; + if (vinfo->depth == 32) { + Amask = (0xFFFFFFFF & ~(Rmask | Gmask | Bmask)); + } else { + Amask = 0; + } + + bpp = vinfo->depth; + if (bpp == 24) { + int i, n; + XPixmapFormatValues *p = XListPixmapFormats(display, &n); + if (p) { + for (i = 0; i < n; ++i) { + if (p[i].depth == 24) { + bpp = p[i].bits_per_pixel; + break; + } + } + XFree(p); + } + } + + return SDL_MasksToPixelFormatEnum(bpp, Rmask, Gmask, Bmask, Amask); + } + + if (vinfo->class == PseudoColor || vinfo->class == StaticColor) { + switch (vinfo->depth) { + case 8: + return SDL_PIXELTYPE_INDEX8; + case 4: + if (BitmapBitOrder(display) == LSBFirst) { + return SDL_PIXELFORMAT_INDEX4LSB; + } else { + return SDL_PIXELFORMAT_INDEX4MSB; + } + break; + case 1: + if (BitmapBitOrder(display) == LSBFirst) { + return SDL_PIXELFORMAT_INDEX1LSB; + } else { + return SDL_PIXELFORMAT_INDEX1MSB; + } + break; + } + } + + return SDL_PIXELFORMAT_UNKNOWN; +} + void X11_InitModes(_THIS) { SDL_VideoData *data = (SDL_VideoData *) _this->driverdata; int screen; - int n; - XPixmapFormatValues *p; - p = XListPixmapFormats(data->display, &n); for (screen = 0; screen < ScreenCount(data->display); ++screen) { XVisualInfo vinfo; - int i, bpp; - Uint32 Rmask, Gmask, Bmask, Amask; SDL_VideoDisplay display; SDL_DisplayData *displaydata; SDL_DisplayMode mode; @@ -78,23 +131,7 @@ continue; } - bpp = vinfo.depth; - for (i = 0; i < n; ++i) { - if (p[i].depth == vinfo.depth) { - bpp = p[i].bits_per_pixel; - break; - } - } - Rmask = vinfo.visual->red_mask; - Gmask = vinfo.visual->green_mask; - Bmask = vinfo.visual->blue_mask; - if (vinfo.depth == 32) { - Amask = (0xFFFFFFFF & ~(Rmask | Gmask | Bmask)); - } else { - Amask = 0; - } - mode.format = - SDL_MasksToPixelFormatEnum(bpp, Rmask, Gmask, Bmask, Amask); + mode.format = X11_GetPixelFormatFromVisualInfo(data->display, &vinfo); mode.w = DisplayWidth(data->display, screen); mode.h = DisplayHeight(data->display, screen); mode.refresh_rate = 0; @@ -114,15 +151,15 @@ display.driverdata = displaydata; SDL_AddVideoDisplay(&display); } - XFree(p); } void X11_GetDisplayModes(_THIS) { + Display *display = ((SDL_VideoData *) _this->driverdata)->display; SDL_DisplayData *data = (SDL_DisplayData *) SDL_CurrentDisplay.driverdata; SDL_DisplayMode mode; - //SDL_AddDisplayMode(_this->current_display, &mode); + } int