소스 검색

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.
Sylvain Becker 6 년 전
부모
커밋
07548602d6
1개의 변경된 파일15개의 추가작업 그리고 0개의 파일을 삭제
  1. 15 0
      src/render/SDL_render.c

+ 15 - 0
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);