diff --git a/src/video/SDL_blit_1.c b/src/video/SDL_blit_1.c index 2c54a2e84a..1a398da6a2 100644 --- a/src/video/SDL_blit_1.c +++ b/src/video/SDL_blit_1.c @@ -435,7 +435,7 @@ static void Blit1toNAlpha(SDL_BlitInfo *info) const SDL_Color *srcpal = info->src_fmt->palette->colors; int dstbpp; Uint32 pixel; - unsigned sR, sG, sB; + unsigned sR, sG, sB, sA; unsigned dR, dG, dB, dA; const unsigned A = info->a; @@ -449,8 +449,9 @@ static void Blit1toNAlpha(SDL_BlitInfo *info) sR = srcpal[*src].r; sG = srcpal[*src].g; sB = srcpal[*src].b; + sA = (srcpal[*src].a * A) / 255; DISEMBLE_RGBA(dst, dstbpp, dstfmt, pixel, dR, dG, dB, dA); - ALPHA_BLEND_RGBA(sR, sG, sB, A, dR, dG, dB, dA); + ALPHA_BLEND_RGBA(sR, sG, sB, sA, dR, dG, dB, dA); ASSEMBLE_RGBA(dst, dstbpp, dstfmt, dR, dG, dB, dA); src++; dst += dstbpp; @@ -475,7 +476,7 @@ static void Blit1toNAlphaKey(SDL_BlitInfo *info) Uint32 ckey = info->colorkey; int dstbpp; Uint32 pixel; - unsigned sR, sG, sB; + unsigned sR, sG, sB, sA; unsigned dR, dG, dB, dA; const unsigned A = info->a; @@ -490,8 +491,9 @@ static void Blit1toNAlphaKey(SDL_BlitInfo *info) sR = srcpal[*src].r; sG = srcpal[*src].g; sB = srcpal[*src].b; + sA = (srcpal[*src].a * A) / 255; DISEMBLE_RGBA(dst, dstbpp, dstfmt, pixel, dR, dG, dB, dA); - ALPHA_BLEND_RGBA(sR, sG, sB, A, dR, dG, dB, dA); + ALPHA_BLEND_RGBA(sR, sG, sB, sA, dR, dG, dB, dA); ASSEMBLE_RGBA(dst, dstbpp, dstfmt, dR, dG, dB, dA); } src++; @@ -531,8 +533,10 @@ SDL_BlitFunc SDL_CalculateBlit1(SDL_Surface *surface) return one_blitkey[which]; case SDL_COPY_COLORKEY | SDL_COPY_BLEND: /* this is not super-robust but handles a specific case we found sdl12-compat. */ - return (surface->map->info.a == 255) ? one_blitkey[which] : (SDL_BlitFunc)NULL; + return (surface->map->info.a == 255) ? one_blitkey[which] : + which >= 2 ? Blit1toNAlphaKey : (SDL_BlitFunc)NULL; + case SDL_COPY_BLEND: case SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND: /* Supporting 8bpp->8bpp alpha is doable but requires lots of tables which consume space and takes time to precompute,