Fixed SDL_DisplayFormatAlpha() on RGB surfaces with alpha
--HG-- extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40432
This commit is contained in:
parent
8613885333
commit
a9c0bef803
4 changed files with 63 additions and 6 deletions
|
@ -16,6 +16,7 @@ be found at the <A HREF="http://www.libsdl.org/"> main SDL page</A>.
|
|||
Major changes since SDL 1.0.0:
|
||||
</H2>
|
||||
<UL>
|
||||
<LI> 1.2.5: Fixed SDL_DisplayFormatAlpha() on RGB surfaces with alpha
|
||||
<LI> 1.2.5: Fixed setting OpenGL mode multiple times on Windows
|
||||
<LI> 1.2.5: Added support for Qtopia on embedded systems (thanks David!)
|
||||
<LI> 1.2.4: Added initial support for Atari (thanks Patrice!)
|
||||
|
|
|
@ -645,7 +645,7 @@ extern DECLSPEC SDL_Surface * SDLCALL SDL_ConvertSurface
|
|||
* alpha-blend (using the source per-surface alpha value);
|
||||
* set destination alpha to opaque.
|
||||
* SDL_SRCALPHA not set:
|
||||
* copy RGB, set destination alpha to opaque.
|
||||
* copy RGB, set destination alpha to source per-surface alpha value.
|
||||
* both:
|
||||
* if SDL_SRCCOLORKEY set, only copy the pixels matching the
|
||||
* source colour key.
|
||||
|
|
|
@ -1202,7 +1202,7 @@ static void BlitNtoN(SDL_BlitInfo *info)
|
|||
int srcbpp = srcfmt->BytesPerPixel;
|
||||
SDL_PixelFormat *dstfmt = info->dst;
|
||||
int dstbpp = dstfmt->BytesPerPixel;
|
||||
unsigned alpha = dstfmt->Amask ? SDL_ALPHA_OPAQUE : 0;
|
||||
unsigned alpha = dstfmt->Amask ? srcfmt->alpha : 0;
|
||||
|
||||
while ( height-- ) {
|
||||
DUFFS_LOOP(
|
||||
|
@ -1358,7 +1358,7 @@ static void BlitNtoNKey(SDL_BlitInfo *info)
|
|||
SDL_PixelFormat *dstfmt = info->dst;
|
||||
int srcbpp = srcfmt->BytesPerPixel;
|
||||
int dstbpp = dstfmt->BytesPerPixel;
|
||||
unsigned alpha = dstfmt->Amask ? SDL_ALPHA_OPAQUE : 0;
|
||||
unsigned alpha = dstfmt->Amask ? srcfmt->alpha : 0;
|
||||
|
||||
while ( height-- ) {
|
||||
DUFFS_LOOP(
|
||||
|
|
|
@ -211,6 +211,7 @@ int SDL_SetColorKey (SDL_Surface *surface, Uint32 flag, Uint32 key)
|
|||
SDL_InvalidateMap(surface->map);
|
||||
return(0);
|
||||
}
|
||||
/* This function sets the alpha channel of a surface */
|
||||
int SDL_SetAlpha (SDL_Surface *surface, Uint32 flag, Uint8 value)
|
||||
{
|
||||
Uint32 oldflags = surface->flags;
|
||||
|
@ -269,6 +270,52 @@ int SDL_SetAlpha (SDL_Surface *surface, Uint32 flag, Uint8 value)
|
|||
SDL_InvalidateMap(surface->map);
|
||||
return(0);
|
||||
}
|
||||
int SDL_SetAlphaChannel(SDL_Surface *surface, Uint8 value)
|
||||
{
|
||||
int row, col;
|
||||
int offset;
|
||||
Uint8 *buf;
|
||||
|
||||
if ( (surface->format->Amask != 0xFF000000) &&
|
||||
(surface->format->Amask != 0x000000FF) ) {
|
||||
SDL_SetError("Unsupported surface alpha mask format");
|
||||
return -1;
|
||||
}
|
||||
|
||||
#if SDL_BYTEORDER == SDL_LIL_ENDIAN
|
||||
if ( surface->format->Amask == 0xFF000000 ) {
|
||||
offset = 3;
|
||||
} else {
|
||||
offset = 0;
|
||||
}
|
||||
#else
|
||||
if ( surface->format->Amask == 0xFF000000 ) {
|
||||
offset = 0;
|
||||
} else {
|
||||
offset = 3;
|
||||
}
|
||||
#endif /* Byte ordering */
|
||||
|
||||
/* Quickly set the alpha channel of an RGBA or ARGB surface */
|
||||
if ( SDL_MUSTLOCK(surface) ) {
|
||||
if ( SDL_LockSurface(surface) < 0 ) {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
row = surface->h;
|
||||
while (row--) {
|
||||
col = surface->w;
|
||||
buf = (Uint8 *)surface->pixels + row * surface->pitch + offset;
|
||||
while(col--) {
|
||||
*buf = value;
|
||||
buf += 4;
|
||||
}
|
||||
}
|
||||
if ( SDL_MUSTLOCK(surface) ) {
|
||||
SDL_UnlockSurface(surface);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* A function to calculate the intersection of two rectangles:
|
||||
|
@ -748,8 +795,13 @@ SDL_Surface * SDL_ConvertSurface (SDL_Surface *surface,
|
|||
}
|
||||
}
|
||||
if ( (surface_flags & SDL_SRCALPHA) == SDL_SRCALPHA ) {
|
||||
alpha = surface->format->alpha;
|
||||
SDL_SetAlpha(surface, 0, 0);
|
||||
/* Copy over the alpha channel to RGBA if requested */
|
||||
if ( format->Amask ) {
|
||||
surface->flags &= ~SDL_SRCALPHA;
|
||||
} else {
|
||||
alpha = surface->format->alpha;
|
||||
SDL_SetAlpha(surface, 0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
/* Copy over the image data */
|
||||
|
@ -780,7 +832,11 @@ SDL_Surface * SDL_ConvertSurface (SDL_Surface *surface,
|
|||
SDL_SetAlpha(convert, aflags|(flags&SDL_RLEACCELOK),
|
||||
alpha);
|
||||
}
|
||||
SDL_SetAlpha(surface, aflags, alpha);
|
||||
if ( format->Amask ) {
|
||||
surface->flags |= SDL_SRCALPHA;
|
||||
} else {
|
||||
SDL_SetAlpha(surface, aflags, alpha);
|
||||
}
|
||||
}
|
||||
|
||||
/* We're ready to go! */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue