From 76b7b1e96c73a23127ed76ae1562d39a7f141999 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Fri, 16 Aug 2013 09:20:33 -0700 Subject: [PATCH] Fixed alpha composition when destination alpha is transparent. Jianyu Guan I found I make a big mistake that when dstA==0, I just simply let *dstp=*srcp and forgot to make dstRGB = srcRGB*srcA. The if consition "(*dstp & amask) == 0" in BlitRGBtoRGBPixelAlphaMMX and BlitRGBtoRGBPixelAlphaMMX3dNow should be removed. --- src/video/SDL_blit_A.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/video/SDL_blit_A.c b/src/video/SDL_blit_A.c index e53f99a83..9ef4a074b 100644 --- a/src/video/SDL_blit_A.c +++ b/src/video/SDL_blit_A.c @@ -352,7 +352,7 @@ BlitRGBtoRGBPixelAlphaMMX(SDL_BlitInfo * info) Uint32 alpha = *srcp & amask; if (alpha == 0) { /* do nothing */ - } else if (alpha == amask || (*dstp & amask) == 0) { + } else if (alpha == amask) { *dstp = *srcp; } else { src1 = _mm_cvtsi32_si64(*srcp); /* src(ARGB) -> src1 (0000ARGB)*/ @@ -545,7 +545,7 @@ BlitRGBtoRGBPixelAlphaMMX3DNOW(SDL_BlitInfo * info) alpha = *srcp & amask; if (alpha == 0) { /* do nothing */ - } else if (alpha == amask || (*dstp & amask) == 0) { + } else if (alpha == amask) { *dstp = *srcp; } else { src1 = _mm_cvtsi32_si64(*srcp); /* src(ARGB) -> src1 (0000ARGB)*/