fix excessive rounding error in mySDL_BlitTransform (completely opaque
surfaces would be set to an alpha value of 0xFB); fix latent alpha channel bug
This commit is contained in:
@@ -747,14 +747,18 @@ void mySDL_BlitTransform( const SDL_Surface *src, SDL_Surface *dst,
|
|||||||
Uint8 out[4] = { 0,0,0,0 };
|
Uint8 out[4] = { 0,0,0,0 };
|
||||||
for(int i = 0; i < 4; ++i)
|
for(int i = 0; i < 4; ++i)
|
||||||
{
|
{
|
||||||
Uint32 sum = 0;
|
float sum = 0;
|
||||||
sum += Uint8(v[0][i] * (1-weight_x) * (1-weight_y));
|
sum += v[0][i] * (1-weight_x) * (1-weight_y);
|
||||||
sum += Uint8(v[1][i] * (1-weight_x) * (weight_y));
|
sum += v[1][i] * (1-weight_x) * (weight_y);
|
||||||
sum += Uint8(v[2][i] * (weight_x) * (1-weight_y));
|
sum += v[2][i] * (weight_x) * (1-weight_y);
|
||||||
sum += Uint8(v[3][i] * (weight_x) * (weight_y));
|
sum += v[3][i] * (weight_x) * (weight_y);
|
||||||
out[i] = (Uint8) clamp(sum, 0u, 255u);
|
out[i] = (Uint8) clamp( lrintf(sum), 0, 255 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* If the source has no alpha, set the destination to opaque. */
|
||||||
|
if( src->format->Amask == 0 )
|
||||||
|
out[3] = Uint8( dst->format->Amask >> dst->format->Ashift );
|
||||||
|
|
||||||
mySDL_SetRawRGBAV(dstpx, dst, out);
|
mySDL_SetRawRGBAV(dstpx, dst, out);
|
||||||
|
|
||||||
dstpx += dst->format->BytesPerPixel;
|
dstpx += dst->format->BytesPerPixel;
|
||||||
|
|||||||
Reference in New Issue
Block a user