Blit SDL_Surface onto another SDL_Surface and apply a colorkey

Posted by NordCoder on Stack Overflow See other posts from Stack Overflow or by NordCoder
Published on 2012-03-01T22:27:10Z Indexed on 2012/04/02 17:28 UTC
Read the original article Hit count: 141

Filed under:

I want to load an SDL_Surface into an OpenGL texture with padding (so that NPOT->POT) and apply a color key on the surface afterwards. I either end up colorkeying all pixels, regardless of their color, or not colorkey anything at all. I have tried a lot of different things, but none of them seem to work.

Here's the working snippet of my code. I use a custom color class for the colorkey (range [0-1]):

// Create an empty surface with the same settings as the original image
SDL_Surface* paddedImage = SDL_CreateRGBSurface(image->flags, width, height,
                                                    image->format->BitsPerPixel,
                                                    #if SDL_BYTEORDER == SDL_BIG_ENDIAN
                                                        0xff000000,
                                                        0x00ff0000,
                                                        0x0000ff00,
                                                        0x000000ff
                                                    #else
                                                        0x000000ff,
                                                        0x0000ff00,
                                                        0x00ff0000,
                                                        0xff000000
                                                    #endif
                                                    );
// Map RGBA color to pixel format value
Uint32 colorKeyPixelFormat = SDL_MapRGBA(paddedImage->format,
                                         static_cast<Uint8>(colorKey.R * 255),
                                         static_cast<Uint8>(colorKey.G * 255),
                                         static_cast<Uint8>(colorKey.B * 255),
                                         static_cast<Uint8>(colorKey.A * 255));

SDL_FillRect(paddedImage, NULL, colorKeyPixelFormat);

// Blit the image onto the padded image
SDL_BlitSurface(image, NULL, paddedImage, NULL);

SDL_SetColorKey(paddedImage, SDL_SRCCOLORKEY, colorKeyPixelFormat);

Afterwards, I generate an OpenGL texture from paddedImage using similar code to the SDL+OpenGL texture loading code found online (I'll post if necessary). This code works if I just want the texture with or without padding, and is likely not the problem.

I realize that I set all pixels in paddedImage to have alpha zero which causes the first problem I mentioned, but I can't seem to figure out how to do this. Should I just loop over the pixels and set the appropriate colors to have alpha zero?

© Stack Overflow or respective owner

Related posts about opengl