I have tried to blit a PNG with an alpha channel on a transparent surface created using format data from the image, the result of SDL_BlitSurface() is just nothing!
I have solved my problem using memcpy() if the image has the same dimension of the surface and using getpixel()/putpixel() if the image is smaller than the surface (or if I need a partial blit).
this source shows the problem:
http://mars.sourceforge.net/SDL/trans_bug/trans_test1.c
this are my solutions:
http://mars.sourceforge.net/SDL/trans_bug/trans_test2.c
and this is the package with all the sources and data:
http://mars.sourceforge.net/SDL/trans_bug.tar.gz
I hope this could help you.
This is not technically a bug.
According to the documentation:
* RGBA->RGBA:
* SDL_SRCALPHA set:
* alpha-blend (using the source alpha channel) the RGB values;
* leave destination alpha untouched. [Note: is this correct?]
* SDL_SRCCOLORKEY ignored.
* SDL_SRCALPHA not set:
* copy all of RGBA to the destination.
SDL_DisplayFormatAlpha() turns on SDL_SRCALPHA by default (to enable blending)
What I did to fix this in your test program was just add SDL_SetAlpha(img, 0, 0) before the blit onto window. Of course a manual memcpy works just as well. :)
Thanks for the great test case!
(In reply to comment #2)
I confirm that your solution works well, and I'm glad of this ;)
Just a note for someone interested:
if you want to blit img on screen after you have set SDL_SetAlpha(img, 0, 0), you have to set SDL_SetAlpha(img, SDL_SRCALPHA, 0).
Best regards.
Description Davide Coppola 2006-01-23 04:32:53 EST