Skip to content

Commit

Permalink
Code factorization of the pixel format permutation
Browse files Browse the repository at this point in the history
  • Loading branch information
1bsyl committed Feb 7, 2019
1 parent 0a007a9 commit 704e62b
Showing 1 changed file with 73 additions and 108 deletions.
181 changes: 73 additions & 108 deletions src/video/SDL_blit_N.c
Expand Up @@ -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)
{
Expand All @@ -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(
Expand Down Expand Up @@ -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(
Expand All @@ -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(
Expand Down Expand Up @@ -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* */
Expand Down

0 comments on commit 704e62b

Please sign in to comment.