From 704e62bbf491ffc7ea29b98d65268e2590d6f9ac Mon Sep 17 00:00:00 2001 From: Sylvain Becker Date: Thu, 7 Feb 2019 21:49:24 +0100 Subject: [PATCH] Code factorization of the pixel format permutation --- src/video/SDL_blit_N.c | 181 +++++++++++++++++------------------------ 1 file changed, 73 insertions(+), 108 deletions(-) diff --git a/src/video/SDL_blit_N.c b/src/video/SDL_blit_N.c index 60fc6560fb6a4..4b2d87688a4f2 100644 --- a/src/video/SDL_blit_N.c +++ b/src/video/SDL_blit_N.c @@ -2149,6 +2149,71 @@ Blit4to4CopyAlpha(SDL_BlitInfo * info) } } +/* permutation for mapping srcfmt to dstfmt, overloading or not the alpha channel */ +static void +get_permutation(SDL_PixelFormat *srcfmt, SDL_PixelFormat *dstfmt, + int *_r , int *_g, int *_b, int *_a, int *_missing) +{ + int missing = 0, r, g, b, a = 0; + int Pixel = 0x04030201; /* identity permutation */ + + if (srcfmt->Amask) { + RGBA_FROM_PIXEL(Pixel, srcfmt, r, g, b, a); + } else { + RGB_FROM_PIXEL(Pixel, srcfmt, r, g, b); + } + + if (dstfmt->Amask) { + if (srcfmt->Amask) { + PIXEL_FROM_RGBA(Pixel, dstfmt, r, g, b, a); + } else { + PIXEL_FROM_RGBA(Pixel, dstfmt, r, g, b, 0); + } + } else { + PIXEL_FROM_RGB(Pixel, dstfmt, r, g, b); + } + + r = Pixel & 0xFF; + g = (Pixel >> 8) & 0xFF; + b = (Pixel >> 16) & 0xFF; + a = (Pixel >> 24) & 0xFF; + + { + int val; + for (val = 0; val <= 3; val++) { + if (r != val && g != val && b != val && a != val) { + missing = val; + break; + } + } + } + + if (r == 0) { + r = missing; + missing = 0; + } else if (g == 0) { + g = missing; + missing = 1; + } else if (b == 0) { + b = missing; + missing = 2; + } else if (a == 0) { + a = missing; + missing = 3; + } + + *_r = r - 1; + *_g = g - 1; + *_b = b - 1; + *_a = a - 1; + + if (missing) { + *_missing = missing; + } + return; +} + + static void BlitNtoN(SDL_BlitInfo * info) { @@ -2174,45 +2239,8 @@ BlitNtoN(SDL_BlitInfo * info) /* Find the appropriate permutation */ int missing = 0, r, g, b, a; - int Pixel = 0x04030201; /* +1 */ - RGB_FROM_PIXEL(Pixel, srcfmt, r, g, b); - - if (dstfmt->Amask) { - PIXEL_FROM_RGBA(Pixel, dstfmt, r, g, b, 0); - } else { - PIXEL_FROM_RGB(Pixel, dstfmt, r, g, b); - } - r = Pixel & 0xFF; - g = (Pixel >> 8) & 0xFF; - b = (Pixel >> 16) & 0xFF; - a = (Pixel >> 24) & 0xFF; - - { - int val; - for (val = 0; val <= 3; val++) { - if (r != val && g != val && b != val && a != val) { - missing = val; - } - } - } - - if (r == 0) { - r = missing; - missing = 0; - } else if (g == 0) { - g = missing; - missing = 1; - } else if (b == 0) { - b = missing; - missing = 2; - } else if (a == 0) { - a = missing; - missing = 3; - } - - /* -1 */ - r -= 1; g -= 1; b -= 1; a -= 1; - + get_permutation(srcfmt, dstfmt, &r, &g, &b, &a, &missing); + while (height--) { /* *INDENT-OFF* */ DUFFS_LOOP( @@ -2456,41 +2484,12 @@ BlitNtoNKey(SDL_BlitInfo * info) Uint32 *src32 = (Uint32*)src; Uint32 *dst32 = (Uint32*)dst; - + + /* Find the appropriate permutation */ + int missing = 0, r, g, b, a; + get_permutation(srcfmt, dstfmt, &r, &g, &b, &a, &missing); + if (dstfmt->Amask) { - /* Find the appropriate permutation */ - int missing = 0, r, g, b, a; - int Pixel = 0x03020100; - RGB_FROM_PIXEL(Pixel, srcfmt, r, g, b); - PIXEL_FROM_RGBA(Pixel, dstfmt, r, g, b, 255); - r = Pixel & 0xFF; - g = (Pixel >> 8) & 0xFF; - b = (Pixel >> 16) & 0xFF; - a = (Pixel >> 24) & 0xFF; - - { - int val; - for (val = 0; val <= 3; val++) { - if (r != val && g != val && b != val && a != val) { - missing = val; - } - } - } - - if (r == 255) { - r = missing; - missing = 0; - } else if (g == 255) { - g = missing; - missing = 1; - } else if (b == 255) { - b = missing; - missing = 2; - } else if (a == 255) { - a = missing; - missing = 3; - } - while (height--) { /* *INDENT-OFF* */ DUFFS_LOOP( @@ -2514,34 +2513,6 @@ BlitNtoNKey(SDL_BlitInfo * info) return; } else { - /* Find the appropriate permutation */ - int missing = 0, r, g, b, a; - int Pixel = 0x04030201; /* +1 */ - RGBA_FROM_PIXEL(Pixel, srcfmt, r, g, b, a); - missing = a; - PIXEL_FROM_RGB(Pixel, dstfmt, r, g, b); - r = Pixel & 0xFF; - g = (Pixel >> 8) & 0xFF; - b = (Pixel >> 16) & 0xFF; - a = (Pixel >> 24) & 0xFF; - - if (r == 0) { - r = missing; - missing = 0; - } else if (g == 0) { - g = missing; - missing = 1; - } else if (b == 0) { - b = missing; - missing = 2; - } else if (a == 0) { - a = missing; - missing = 3; - } - - /* -1 */ - r -= 1; g -= 1; b -= 1; a -= 1; - while (height--) { /* *INDENT-OFF* */ DUFFS_LOOP( @@ -2716,13 +2687,7 @@ BlitNtoNKeyCopyAlpha(SDL_BlitInfo * info) /* Find the appropriate permutation */ int r, g, b, a; - Pixel = 0x03020100; - RGBA_FROM_PIXEL(Pixel, srcfmt, r, g, b, a); - PIXEL_FROM_RGBA(Pixel, dstfmt, r, g, b, a); - r = Pixel & 0xFF; - g = (Pixel >> 8) & 0xFF; - b = (Pixel >> 16) & 0xFF; - a = (Pixel >> 24) & 0xFF; + get_permutation(srcfmt, dstfmt, &r, &g, &b, &a, NULL); while (height--) { /* *INDENT-OFF* */