Permalink
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
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
Showing
with
21 additions
and
25 deletions.
-
+1
−3
include/SDL_surface.h
-
+4
−6
src/SDL_compat.c
-
+9
−13
src/video/SDL_bmp.c
-
+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); |
|
|