From 07548602d6df4feb03276c32eeffa49b246f4a1a Mon Sep 17 00:00:00 2001 From: Sylvain Becker Date: Sat, 19 Jan 2019 16:47:43 +0100 Subject: [PATCH] Fixed bug 3657 - Color-key doesn't work when an alpha channel is present When surface format is the same as renderer format, it still needs an intermediate conversion to transform colorkey to alpha. --- src/render/SDL_render.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/render/SDL_render.c b/src/render/SDL_render.c index 35f0066531891..85d4d691fe727 100644 --- a/src/render/SDL_render.c +++ b/src/render/SDL_render.c @@ -1187,6 +1187,7 @@ SDL_CreateTextureFromSurface(SDL_Renderer * renderer, SDL_Surface * surface) { const SDL_PixelFormat *fmt; SDL_bool needAlpha; + SDL_bool direct_update; Uint32 i; Uint32 format; SDL_Texture *texture; @@ -1233,6 +1234,20 @@ SDL_CreateTextureFromSurface(SDL_Renderer * renderer, SDL_Surface * surface) } if (format == surface->format->format) { + if (surface->format->Amask && SDL_HasColorKey(surface)) { + /* Surface and Renderer formats are identicals. + * Intermediate conversion is needed to convert color key to alpha (SDL_ConvertColorkeyToAlpha()). */ + direct_update = SDL_FALSE; + } else { + /* Update Texture directly */ + direct_update = SDL_TRUE; + } + } else { + /* Surface and Renderer formats are differents, it needs an intermediate conversion. */ + direct_update = SDL_FALSE; + } + + if (direct_update) { if (SDL_MUSTLOCK(surface)) { SDL_LockSurface(surface); SDL_UpdateTexture(texture, NULL, surface->pixels, surface->pitch);