From 2001707bc11023349262438e3746c8e82e8e038f Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Sat, 29 Nov 2008 11:26:01 +0000 Subject: [PATCH] The SDL_RLEACCEL flag is respected in SDL_ConvertSurface(), per the docs. Fixed saving BMP files of surfaces with an alpha channel. --- include/SDL_surface.h | 4 +--- src/SDL_compat.c | 10 ++++------ src/video/SDL_bmp.c | 22 +++++++++------------- src/video/SDL_surface.c | 10 +++++++--- 4 files changed, 21 insertions(+), 25 deletions(-) diff --git a/include/SDL_surface.h b/include/SDL_surface.h index bc3b772e8..2bf38fd53 100644 --- a/include/SDL_surface.h +++ b/include/SDL_surface.h @@ -101,9 +101,7 @@ typedef int (*SDL_blit) (struct SDL_Surface * src, SDL_Rect * srcrect, * flags '[RGB]mask'. * If the function runs out of memory, it will return NULL. * - * The 'flags' tell what kind of surface to create. - * SDL_SRCCOLORKEY indicates that the surface will be used for colorkey blits. - * SDL_SRCALPHA means that the surface will be used for alpha blits. + * The 'flags' are obsolete and should be set to 0. */ extern DECLSPEC SDL_Surface *SDLCALL SDL_CreateRGBSurface (Uint32 flags, int width, int height, int depth, diff --git a/src/SDL_compat.c b/src/SDL_compat.c index a642c060f..107b65e20 100644 --- a/src/SDL_compat.c +++ b/src/SDL_compat.c @@ -614,17 +614,16 @@ SDL_SetAlpha(SDL_Surface * surface, Uint32 flag, Uint8 value) SDL_Surface * SDL_DisplayFormat(SDL_Surface * surface) { - SDL_Surface *converted; + SDL_PixelFormat *format; if (!SDL_PublicSurface) { SDL_SetError("No video mode has been set"); return NULL; } + format = SDL_PublicSurface->format; /* Set the flags appropriate for copying to display surface */ - converted = SDL_ConvertSurface(surface, SDL_PublicSurface->format, 0); - SDL_SetSurfaceRLE(converted, 1); - return converted; + return SDL_ConvertSurface(surface, format, SDL_RLEACCEL); } SDL_Surface * @@ -673,8 +672,7 @@ SDL_DisplayFormatAlpha(SDL_Surface * surface) break; } format = SDL_AllocFormat(32, rmask, gmask, bmask, amask); - converted = SDL_ConvertSurface(surface, format, 0); - SDL_SetSurfaceRLE(converted, 1); + converted = SDL_ConvertSurface(surface, format, SDL_RLEACCEL); SDL_FreeFormat(format); return converted; } diff --git a/src/video/SDL_bmp.c b/src/video/SDL_bmp.c index 443f88465..94b8ede5f 100644 --- a/src/video/SDL_bmp.c +++ b/src/video/SDL_bmp.c @@ -382,26 +382,22 @@ SDL_SaveBMP_RW(SDL_Surface * saveme, SDL_RWops * dst, int freedst) ) { surface = saveme; } else { - SDL_Rect bounds; + SDL_PixelFormat *format; /* Convert to 24 bits per pixel */ - surface = SDL_CreateRGBSurface(0, saveme->w, saveme->h, 24, + format = SDL_AllocFormat(24, #if SDL_BYTEORDER == SDL_LIL_ENDIAN - 0x00FF0000, 0x0000FF00, 0x000000FF, + 0x00FF0000, 0x0000FF00, 0x000000FF, #else - 0x000000FF, 0x0000FF00, 0x00FF0000, + 0x000000FF, 0x0000FF00, 0x00FF0000, #endif - 0); - if (surface != NULL) { - bounds.x = 0; - bounds.y = 0; - bounds.w = saveme->w; - bounds.h = saveme->h; - if (SDL_LowerBlit(saveme, &bounds, surface, &bounds) < 0) { - SDL_FreeSurface(surface); + 0); + if (format != NULL) { + surface = SDL_ConvertSurface(saveme, format, 0); + if (!surface) { SDL_SetError("Couldn't convert image to 24 bpp"); - surface = NULL; } + SDL_FreeFormat(format); } } } diff --git a/src/video/SDL_surface.c b/src/video/SDL_surface.c index d1f9563bd..902223b3e 100644 --- a/src/video/SDL_surface.c +++ b/src/video/SDL_surface.c @@ -41,6 +41,9 @@ SDL_CreateRGBSurface(Uint32 flags, { SDL_Surface *surface; + /* The flags are no longer used, make the compiler happy */ + flags; + /* Allocate the surface */ surface = (SDL_Surface *) SDL_calloc(1, sizeof(*surface)); if (surface == NULL) { @@ -754,8 +757,8 @@ SDL_UnlockSurface(SDL_Surface * surface) * Convert a surface into the specified pixel format. */ SDL_Surface * -SDL_ConvertSurface(SDL_Surface * surface, - SDL_PixelFormat * format, Uint32 flags) +SDL_ConvertSurface(SDL_Surface * surface, SDL_PixelFormat * format, + Uint32 flags) { SDL_Surface *convert; Uint32 copy_flags; @@ -777,7 +780,7 @@ SDL_ConvertSurface(SDL_Surface * surface, } /* Create a new surface with the desired format */ - convert = SDL_CreateRGBSurface(0, surface->w, surface->h, + convert = SDL_CreateRGBSurface(flags, surface->w, surface->h, format->BitsPerPixel, format->Rmask, format->Gmask, format->Bmask, format->Amask); @@ -827,6 +830,7 @@ SDL_ConvertSurface(SDL_Surface * surface, if (format->Amask || (copy_flags & SDL_COPY_MODULATE_ALPHA)) { SDL_SetSurfaceBlendMode(convert, SDL_TEXTUREBLENDMODE_BLEND); } + SDL_SetSurfaceRLE(convert, (flags & SDL_RLEACCEL)); /* We're ready to go! */ return (convert);