SDL_BlitSurface的参数是两个PNG时,如何保护其透明度

原文 https://bugzilla.libsdl.org/show_bug.cgi?id=68#c2

Description
Davide Coppola 2006-01-23 04:32:53 EST
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.
Comment 1 Ryan C. Gordon 2006-01-27 11:23:21 EST
Setting Sam as "QA Contact" on all bugs (even resolved ones) so he'll definitely be in the loop to any further discussion here about SDL.

--ryan.

Comment 2 Sam Lantinga 2006-03-20 02:40:09 EST
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!
Comment 3 Davide Coppola 2006-03-20 04:20:11 EST
(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.
 



文章最后说到,在blit前加入

SDL_SetAlpha(img, 0, 0)
即可。

实测有效.

posted @ 2013-03-03 23:50  π秒就是一个纳世纪  阅读(226)  评论(0)    收藏  举报