[SDL] alpha blending bug - possible fix?

Stephane Marchesin stephane.marchesin at wanadoo.fr
Fri Jan 20 16:56:27 PST 2006


Daniel F Moisset wrote:

>Recently I posted about a problem with alpha blending that turned out to
>be a problem with the generic blit function when there is no
>acceleration, BlitNtoNPixelAlpha. Alex Volkov pointed me to the
>following comment:
>
>	/* FIXME: for 8bpp source alpha, this doesn't get opaque values
>	   quite right. for <8bpp source alpha, it gets them very wrong
>	   (check all macros!)
>	   It is unclear whether there is a good general solution that doesn't
>	   need a branch (or a divide). */
>	   
>The problem is a precision bug at the ALPHA_BLEND macro:
>
>#define ALPHA_BLEND(sR, sG, sB, A, dR, dG, dB)	\
>do {						\
>	dR = (((sR-dR)*(A))>>8)+dR;		\
>	dG = (((sG-dG)*(A))>>8)+dG;		\
>	dB = (((sB-dB)*(A))>>8)+dB;		\
>} while(0)
>
>you can make a slight correction changing this to:
>
>#define ALPHA_BLEND(sR, sG, sB, A, dR, dG, dB)	\
>do {						\
>    int premultR = (sR-dR)*(A); \
>    int premultG = (sG-dG)*(A); \
>    int premultB = (sB-dB)*(A); \
>    dR += ((premultR>>8)+((A)>>7)+(premultR>>16);	\
>    dG += ((premultG>>8)+((A)>>7)+(premultG>>16);	\
>    dB += ((premultB>>8)+((A)>>7)+(premultB>>16);	\
>} while(0)
>
>That incurs into some extra shifts and adds, but no division or branch.
>The correction is not better on the average (it is slightly worse,
>although the maximum error in the function is the same), but it gives
>equal or much better results at usual alpha values (0, 128, 255)
>
>could this change be introduced? thanks a lot, 
>
>  
>
Is changing (even slightly) the alpha behaviour for one among many alpha 
blitting functions a good idea ?

Stephane





More information about the SDL mailing list