Skip to content
This repository has been archived by the owner. It is now read-only.
Permalink
Browse files

The SDL_RLEACCEL flag is respected in SDL_ConvertSurface(), per the d…

…ocs.

Fixed saving BMP files of surfaces with an alpha channel.
  • Loading branch information
slouken committed Nov 29, 2008
1 parent 47b6344 commit 2001707bc11023349262438e3746c8e82e8e038f
Showing with 21 additions and 25 deletions.
  1. +1 −3 include/SDL_surface.h
  2. +4 −6 src/SDL_compat.c
  3. +9 −13 src/video/SDL_bmp.c
  4. +7 −3 src/video/SDL_surface.c
@@ -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,
@@ -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;
}
@@ -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);
}
}
}
@@ -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);

0 comments on commit 2001707

Please sign in to comment.