Commit 3f36d970 authored by Sam Lantinga's avatar Sam Lantinga

From: "Alex Volkov"

Date: Thu, 10 Nov 2005 21:53:40 -0500
Subject: [SDL] BUG[?]: 32bpp RGBA->RGB colorkey blit, no SDL_SRCALPHA

It seems there is either a documentation vs. reality mismatch or a real bug
in SDL_blit_N.c:BlitNtoNKey().
The exact blit in question is a 32bpp RGBA->RGB, where RGBA has SDL_COLORKEY
and *no* SDL_SRCALPHA flags. The doc in SDL_video.h states:
* RGBA->RGB:
*     SDL_SRCALPHA not set:
*       copy RGB.
*       if SDL_SRCCOLORKEY set, only copy the pixels matching the
*       RGB values of the source colour key, ignoring alpha in the
*       comparison.

BlitNtoNKey(), however, forgets to "ignore alpha in the comparison". The
documentation makes perfect sense, so I think it is the code that is faulty.

The attached patch corrects the code.

--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%401547
parent 3c69f946
...@@ -2194,6 +2194,10 @@ static void BlitNtoNKey(SDL_BlitInfo *info) ...@@ -2194,6 +2194,10 @@ static void BlitNtoNKey(SDL_BlitInfo *info)
int srcbpp = srcfmt->BytesPerPixel; int srcbpp = srcfmt->BytesPerPixel;
int dstbpp = dstfmt->BytesPerPixel; int dstbpp = dstfmt->BytesPerPixel;
unsigned alpha = dstfmt->Amask ? srcfmt->alpha : 0; unsigned alpha = dstfmt->Amask ? srcfmt->alpha : 0;
Uint32 rgbmask = ~srcfmt->Amask;
/* Set up some basic variables */
ckey &= rgbmask;
while ( height-- ) { while ( height-- ) {
DUFFS_LOOP( DUFFS_LOOP(
...@@ -2203,7 +2207,7 @@ static void BlitNtoNKey(SDL_BlitInfo *info) ...@@ -2203,7 +2207,7 @@ static void BlitNtoNKey(SDL_BlitInfo *info)
unsigned sG; unsigned sG;
unsigned sB; unsigned sB;
RETRIEVE_RGB_PIXEL(src, srcbpp, Pixel); RETRIEVE_RGB_PIXEL(src, srcbpp, Pixel);
if ( Pixel != ckey ) { if ( (Pixel & rgbmask) != ckey ) {
RGB_FROM_PIXEL(Pixel, srcfmt, sR, sG, sB); RGB_FROM_PIXEL(Pixel, srcfmt, sR, sG, sB);
ASSEMBLE_RGBA(dst, dstbpp, dstfmt, ASSEMBLE_RGBA(dst, dstbpp, dstfmt,
sR, sG, sB, alpha); sR, sG, sB, alpha);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment