Fixed bug 3368 - SDL_Blit_Slow doesn't ignore alpha values in colorkey comparison

Simon Hug

When the SDL_Blit_Slow function compares the pixel to the color key it does so without removing the alpha component from the pixel value and the key. This is different from the optimized 32-bit blitters which create a rgb mask and apply it to both to filter the alpha out. SDL_Blit_Slow will only skip the pixels with the exact alpha value of the key instead of all pixels with the same color.

The attached test case blits a surface with a color key and prints the pixel values to the console. The third row is expected to be skipped.
This commit is contained in:
Sam Lantinga 2016-10-01 10:46:10 -07:00
parent 2ccb46cebc
commit fd1d692bef
1 changed files with 3 additions and 1 deletions

View File

@ -46,6 +46,8 @@ SDL_Blit_Slow(SDL_BlitInfo * info)
SDL_PixelFormat *dst_fmt = info->dst_fmt; SDL_PixelFormat *dst_fmt = info->dst_fmt;
int srcbpp = src_fmt->BytesPerPixel; int srcbpp = src_fmt->BytesPerPixel;
int dstbpp = dst_fmt->BytesPerPixel; int dstbpp = dst_fmt->BytesPerPixel;
Uint32 rgbmask = ~src_fmt->Amask;
Uint32 ckey = info->colorkey & rgbmask;
srcy = 0; srcy = 0;
posy = 0; posy = 0;
@ -85,7 +87,7 @@ SDL_Blit_Slow(SDL_BlitInfo * info)
srcpixel = (srcR << src_fmt->Rshift) | srcpixel = (srcR << src_fmt->Rshift) |
(srcG << src_fmt->Gshift) | (srcB << src_fmt->Bshift); (srcG << src_fmt->Gshift) | (srcB << src_fmt->Bshift);
} }
if (srcpixel == info->colorkey) { if ((srcpixel & rgbmask) == ckey) {
posx += incx; posx += incx;
dst += dstbpp; dst += dstbpp;
continue; continue;