image: Remove some code duplication

Only the indices are different between the big / little endian versions of this
loop, so just move the indices into local variables and we are done.

Signed-off-by: Uli Schlachter <psychon@znc.in>
Signed-off-by: Julien Danjou <julien@danjou.info>
This commit is contained in:
Uli Schlachter 2009-05-22 11:22:16 +02:00 committed by Julien Danjou
parent c06a58a581
commit d62b75679a
1 changed files with 10 additions and 14 deletions

24
image.c
View File

@ -108,6 +108,11 @@ image_getdata(image_t *image)
uint32_t *data; uint32_t *data;
double alpha; double alpha;
uint8_t *dataimg; uint8_t *dataimg;
#if AWESOME_IS_BIG_ENDIAN
const int index_a = 0, index_r = 1, index_g = 2, index_b = 3;
#else
const int index_a = 3, index_r = 2, index_g = 1, index_b = 0;
#endif
if(image->isupdated) if(image->isupdated)
return image->data; return image->data;
@ -123,21 +128,12 @@ image_getdata(image_t *image)
for(i = 0; i < size; i++, dataimg += 4) for(i = 0; i < size; i++, dataimg += 4)
{ {
#if AWESOME_IS_BIG_ENDIAN dataimg[index_a] = (data[i] >> 24) & 0xff; /* A */
dataimg[0] = (data[i] >> 24) & 0xff; /* A */
/* cairo wants pre-multiplied alpha */ /* cairo wants pre-multiplied alpha */
alpha = dataimg[0] / 255.0; alpha = dataimg[index_a] / 255.0;
dataimg[1] = ((data[i] >> 16) & 0xff) * alpha; /* R */ dataimg[index_r] = ((data[i] >> 16) & 0xff) * alpha; /* R */
dataimg[2] = ((data[i] >> 8) & 0xff) * alpha; /* G */ dataimg[index_g] = ((data[i] >> 8) & 0xff) * alpha; /* G */
dataimg[3] = (data[i] & 0xff) * alpha; /* B */ dataimg[index_b] = (data[i] & 0xff) * alpha; /* B */
#else
dataimg[3] = (data[i] >> 24) & 0xff; /* A */
/* cairo wants pre-multiplied alpha */
alpha = dataimg[3] / 255.0;
dataimg[2] = ((data[i] >> 16) & 0xff) * alpha; /* R */
dataimg[1] = ((data[i] >> 8) & 0xff) * alpha; /* G */
dataimg[0] = (data[i] & 0xff) * alpha; /* B */
#endif
} }
image->isupdated = true; image->isupdated = true;