# HG changeset patch # User Sam Lantinga # Date 1230180148 0 # Node ID ffdd533f7add947a78dd9cda54d3b4b4f86b93a4 # Parent deb377097225e03867113bba4d051367d271ce21 Fixed pitch alignment problem causing MITSHM error on 16-bit displays diff -r deb377097225 -r ffdd533f7add src/video/x11/SDL_x11modes.c --- a/src/video/x11/SDL_x11modes.c Wed Dec 24 13:13:38 2008 +0000 +++ b/src/video/x11/SDL_x11modes.c Thu Dec 25 04:42:28 2008 +0000 @@ -136,6 +136,8 @@ SDL_VideoDisplay display; SDL_DisplayData *displaydata; SDL_DisplayMode mode; + XPixmapFormatValues *pixmapFormats; + int i, n; if (get_visualinfo(data->display, screen, &vinfo) < 0) { continue; @@ -155,6 +157,18 @@ displaydata->visual = vinfo.visual; displaydata->depth = vinfo.depth; + displaydata->scanline_pad = SDL_BYTESPERPIXEL(mode.format)*8; + pixmapFormats = XListPixmapFormats(data->display, &n); + if (pixmapFormats) { + for (i = 0; i < n; ++i) { + if (pixmapFormats[i].depth == displaydata->depth) { + displaydata->scanline_pad = pixmapFormats[i].scanline_pad; + break; + } + } + XFree(pixmapFormats); + } + SDL_zero(display); display.desktop_mode = mode; display.current_mode = mode; diff -r deb377097225 -r ffdd533f7add src/video/x11/SDL_x11modes.h --- a/src/video/x11/SDL_x11modes.h Wed Dec 24 13:13:38 2008 +0000 +++ b/src/video/x11/SDL_x11modes.h Thu Dec 25 04:42:28 2008 +0000 @@ -29,6 +29,7 @@ int screen; Visual *visual; int depth; + int scanline_pad; int use_xinerama; int use_xrandr; diff -r deb377097225 -r ffdd533f7add src/video/x11/SDL_x11render.c --- a/src/video/x11/SDL_x11render.c Wed Dec 24 13:13:38 2008 +0000 +++ b/src/video/x11/SDL_x11render.c Thu Dec 25 04:42:28 2008 +0000 @@ -83,6 +83,7 @@ int screen; Visual *visual; int depth; + int scanline_pad; Window window; Pixmap pixmaps[3]; int current_pixmap; @@ -185,6 +186,7 @@ data->screen = displaydata->screen; data->visual = displaydata->visual; data->depth = displaydata->depth; + data->scanline_pad = displaydata->scanline_pad; data->window = windowdata->window; renderer->DisplayModeChanged = X11_DisplayModeChanged; @@ -316,6 +318,7 @@ SDL_Window *window = SDL_GetWindowFromID(renderer->window); SDL_VideoDisplay *display = SDL_GetDisplayFromWindow(window); X11_TextureData *data; + int pitch_alignmask = ((renderdata->scanline_pad / 8) - 1); data = (X11_TextureData *) SDL_calloc(1, sizeof(*data)); if (!data) { @@ -343,6 +346,7 @@ data->format = texture->format; } data->pitch = texture->w * SDL_BYTESPERPIXEL(data->format); + data->pitch = (data->pitch + pitch_alignmask) & ~pitch_alignmask; if (data->yuv || texture->access == SDL_TEXTUREACCESS_STREAMING) { #ifndef NO_SHARED_MEMORY