From: "Alex Volkov"
authorSam Lantinga <slouken@libsdl.org>
Wed, 15 Mar 2006 15:43:15 +0000
changeset 1543 98f9b16f565c
parent 1542 a8bf1aa21020
child 1544 ab1e4c41ab71
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
--- a/src/video/SDL_blit_N.c	Wed Mar 15 15:39:29 2006 +0000
+++ b/src/video/SDL_blit_N.c	Wed Mar 15 15:43:15 2006 +0000
@@ -2194,6 +2194,10 @@
 	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 @@
 			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);