[SDL] [Sdl] Converting a 24 bit RGB surface with color key to 32 bit RGBA surface

benang at cs.its.ac.id benang at cs.its.ac.id
Fri Jul 27 01:33:57 PDT 2007


Sorry it took a while. I'm currently using the easy way out. I'm now using
a PNG with alpha channel of 0 for the transparent pixel rather than
colorkeying the black color of a BMP. And I use SDL_DiplayFormatAlpha() to
convert it to 32 bit RGBA. Thanks a lot though.

James Buchwald said:
> Try using other color masks - in particular, the ones of the surface
> returned by SDL_SetVideoMode. For example, if your original surface was
> called MainSurface, it might look like this:
>
> rmask = MainSurface->format->Rmask;
> gmask = MainSurface->format->Gmask;
> bmask = MainSurface->format->Bmask;
> amask = MainSurface->format->Amask;
>
> Of course, that's provided that you called SDL_SetVideoMode with 32-bit
> depth (which I'm assuming you did, since your comments said you're using
> OpenGL). If you're calling SDL_SetVideoMode with 24 bits (or less), maybe
> take a look at the SDL_ConvertSurface method?
>
> On 7/23/07, benang at cs.its.ac.id <benang at cs.its.ac.id> wrote:
>>
>> Hi, I'm trying to change a 24 bit surface with a color key to a 32 bit
>> surface with alpha channel. Because there is the color key, I want all
>> pixels in the new surface with the color matching the color key has an
>> alpha channel of 0 (or transparent). I've tried making a new 32 bit
>> surface with alpha channel 0 and blit the 24 bit surface to it but it
>> didn't work. In fact all the colors are wrong in the new surface. How do
>> I
>> do that? Is there anything wrong with my code? Thanks in advance.
>>
>> BTW, this is the code:
>>
>> if ( (surface = SDL_LoadBMP("test.bmp")) )
>> {
>>     char color=surface->flags&SDL_SRCCOLORKEY;
>>
>>     SDL_SetColorKey(surface, SDL_SRCCOLORKEY,
>> SDL_MapRGB(surface->format,
>> 0, 0, 0));
>>
>> /*  From SDL Documentation.
>>     Create a 32-bit surface with the bytes of each pixel in R,G,B,A
>> order,
>>     as expected by OpenGL for textures */
>>
>>     SDL_Surface *tempSur;
>>     Uint32 rmask, gmask, bmask, amask;
>>
>> /*  SDL interprets each pixel as a 32-bit number, so our masks must
>> depend
>>     on the endianness (byte order) of the machine */
>>
>> #if not SDL_BYTEORDER == SDL_BIG_ENDIAN
>>     rmask = 0xff000000;
>>     gmask = 0x00ff0000;
>>     bmask = 0x0000ff00;
>>     amask = 0x000000ff;
>> #else
>>     rmask = 0x000000ff;
>>     gmask = 0x0000ff00;
>>     bmask = 0x00ff0000;
>>     amask = 0xff000000;
>> #endif
>>
>>     tempSur = SDL_CreateRGBSurface(SDL_SWSURFACE, surface->w,
>> surface->h,
>> 32,rmask, gmask, bmask, amask);
>>
>>     if(tempSur == NULL) {
>>         fprintf(stderr, "CreateRGBSurface failed: %s\n",
>> SDL_GetError());
>>         exit(1);
>>         }
>>
>>
>>     SDL_SetAlpha(tempSur, SDL_SRCALPHA, 0);
>>     SDL_BlitSurface(surface,NULL,tempSur,NULL);
>>
>>     SDL_FreeSurface( surface );
>>
>>     surface=tempSur;
>> }
>> else {
>>     fprintf(stderr, "Cannot load BMP: %s\n",   SDL_GetError());
>>     exit(1);
>> }
>>
>> Fare thee well,
>> Bawenang R. P. P.
>>
>> ----------------
>> ERROR: Brain not found. Please insert a new brain!
>>
>> "Do nothing which is of no use." - Miyamoto Musashi.
>>
>> "I live for my dream. And my dream is to live my life to the fullest."
>>
>>
>> _______________________________________________
>> Sdl mailing list
>> Sdl at lists.libsdl.org
>> http://lists.libsdl.org/listinfo.cgi/sdl-libsdl.org
>>
>
>
>
> --
> "If you see somebody who you don't know getting into a crop duster that
> doesn't belong to you, report them." -- President George W. Bush
> _______________________________________________
> SDL mailing list
> SDL at lists.libsdl.org
> http://lists.libsdl.org/listinfo.cgi/sdl-libsdl.org
>


Fare thee well,
Bawenang R. P. P.

----------------
ERROR: Brain not found. Please insert a new brain!

“Do nothing which is of no use.” - Miyamoto Musashi.

"I live for my dream. And my dream is to live my life to the fullest."




More information about the SDL mailing list