From 32d3c42f51264b2937ad2fa5067f756572678602 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Wed, 15 Mar 2006 15:43:15 +0000 Subject: [PATCH] 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. --- src/video/SDL_blit_N.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/video/SDL_blit_N.c b/src/video/SDL_blit_N.c index 99aa72e33..14d8f3f9d 100644 --- a/src/video/SDL_blit_N.c +++ b/src/video/SDL_blit_N.c @@ -2194,6 +2194,10 @@ static void BlitNtoNKey(SDL_BlitInfo *info) int srcbpp = srcfmt->BytesPerPixel; int dstbpp = dstfmt->BytesPerPixel; unsigned alpha = dstfmt->Amask ? srcfmt->alpha : 0; + Uint32 rgbmask = ~srcfmt->Amask; + + /* Set up some basic variables */ + ckey &= rgbmask; while ( height-- ) { DUFFS_LOOP( @@ -2203,7 +2207,7 @@ static void BlitNtoNKey(SDL_BlitInfo *info) unsigned sG; unsigned sB; RETRIEVE_RGB_PIXEL(src, srcbpp, Pixel); - if ( Pixel != ckey ) { + if ( (Pixel & rgbmask) != ckey ) { RGB_FROM_PIXEL(Pixel, srcfmt, sR, sG, sB); ASSEMBLE_RGBA(dst, dstbpp, dstfmt, sR, sG, sB, alpha);