eet: refactorize handling of endian.

This commit is contained in:
Cedric BAIL 2015-01-06 11:09:27 +01:00
parent 18d494489c
commit 6724bbf8bd
1 changed files with 59 additions and 98 deletions

View File

@ -314,10 +314,6 @@ eet_data_image_jpeg_alpha_convert(int *size,
/*---*/
static int _eet_image_words_bigendian = -1;
/*---*/
#define SWAP64(x) eina_swap64(x)
#define SWAP32(x) eina_swap32(x)
#define SWAP16(x) eina_swap16(x)
@ -342,6 +338,37 @@ static int _eet_image_words_bigendian = -1;
/*---*/
static int _eet_image_words_bigendian = -1;
static inline void
_eet_image_endian_check(void)
{
if (_eet_image_words_bigendian == -1)
{
unsigned long int v;
v = htonl(0x12345678);
if (v == 0x12345678)
_eet_image_words_bigendian = 1;
else
_eet_image_words_bigendian = 0;
}
}
static inline void
_eet_image_endian_swap(void *data, unsigned int length)
{
if (_eet_image_words_bigendian)
{
unsigned int *buffer = data;
unsigned int i;
for (i = 0; i < length; i++) SWAP32(buffer[i]);
}
}
/*---*/
static void
_eet_image_jpeg_error_exit_cb(j_common_ptr cinfo)
{
@ -1067,45 +1094,29 @@ eet_data_image_lossless_convert(int *size,
unsigned int h,
int alpha)
{
if (_eet_image_words_bigendian == -1)
{
unsigned long int v;
unsigned char *d;
int *header;
v = htonl(0x12345678);
if (v == 0x12345678)
_eet_image_words_bigendian = 1;
else
_eet_image_words_bigendian = 0;
}
_eet_image_endian_check();
{
unsigned char *d;
int *header;
d = malloc((w * h * 4) + (8 * 4));
if (!d)
return NULL;
d = malloc((w * h * 4) + (8 * 4));
if (!d)
return NULL;
header = (int *)d;
memset(d, 0, 32);
header = (int *)d;
memset(d, 0, 32);
header[0] = 0xac1dfeed;
header[1] = w;
header[2] = h;
header[3] = alpha;
header[0] = 0xac1dfeed;
header[1] = w;
header[2] = h;
header[3] = alpha;
memcpy(d + 32, data, w * h * 4);
memcpy(d + 32, data, w * h * 4);
_eet_image_endian_swap(header, ((w * h) + 8));
if (_eet_image_words_bigendian)
{
unsigned int i;
for (i = 0; i < ((w * h) + 8); i++) SWAP32(header[i]);
}
*size = ((w * h * 4) + (8 * 4));
return d;
}
*size = ((w * h * 4) + (8 * 4));
return d;
}
static void *
@ -1116,16 +1127,7 @@ eet_data_image_lossless_compressed_convert(int *size,
int alpha,
int compression)
{
if (_eet_image_words_bigendian == -1)
{
unsigned long int v;
v = htonl(0x12345678);
if (v == 0x12345678)
_eet_image_words_bigendian = 1;
else
_eet_image_words_bigendian = 0;
}
_eet_image_endian_check();
{
unsigned char *d, *comp;
@ -1144,7 +1146,7 @@ eet_data_image_lossless_compressed_convert(int *size,
if (!bigend_data) return NULL;
memcpy(bigend_data, data, w * h * 4);
for (i = 0; i < w * h; i++) SWAP32(bigend_data[i]);
_eet_image_endian_swap(bigend_data, w * h);
data = (const char *) bigend_data;
}
@ -1200,13 +1202,8 @@ eet_data_image_lossless_compressed_convert(int *size,
header[3] = alpha;
header[4] = compression;
if (_eet_image_words_bigendian)
{
unsigned int i;
for (i = 0; i < 8; i++) SWAP32(header[i]);
free(bigend_data);
}
_eet_image_endian_swap(header, 8);
free(bigend_data);
memcpy(d + (8 * sizeof(int)), comp, buflen);
*size = (8 * sizeof(int)) + buflen;
@ -1538,6 +1535,8 @@ finish:
return result;
}
static void *
eet_data_image_jpeg_convert(int *size,
const void *data,
@ -1636,16 +1635,7 @@ eet_data_image_jpeg_alpha_convert(int *size,
(void)alpha; /* unused */
if (_eet_image_words_bigendian == -1)
{
unsigned long int v;
v = htonl(0x12345678);
if (v == 0x12345678)
_eet_image_words_bigendian = 1;
else
_eet_image_words_bigendian = 0;
}
_eet_image_endian_check();
{
const int *ptr;
@ -1796,12 +1786,7 @@ eet_data_image_jpeg_alpha_convert(int *size,
header[0] = 0xbeeff00d;
header[1] = sz1;
header[2] = sz2;
if (_eet_image_words_bigendian)
{
int i;
for (i = 0; i < 3; i++) SWAP32(header[i]);
}
_eet_image_endian_swap(header, 3);
memcpy(d + 12, d1, sz1);
memcpy(d + 12 + sz1, d2, sz2);
@ -2160,16 +2145,7 @@ eet_data_image_header_decode_cipher(const void *data,
}
}
if (_eet_image_words_bigendian == -1)
{
unsigned long int v;
v = htonl(0x12345678);
if (v == 0x12345678)
_eet_image_words_bigendian = 1;
else
_eet_image_words_bigendian = 0;
}
_eet_image_endian_check();
if (size < 32)
{
@ -2178,12 +2154,7 @@ eet_data_image_header_decode_cipher(const void *data,
}
memcpy(header, data, 32);
if (_eet_image_words_bigendian)
{
int i;
for (i = 0; i < 8; i++) SWAP32(header[i]);
}
_eet_image_endian_swap(header, 8);
if ((unsigned)header[0] == 0xac1dfeed)
{
@ -2515,12 +2486,7 @@ _eet_data_image_decode_inside(const void *data,
}
}
/* Fix swapiness. */
if (_eet_image_words_bigendian)
{
unsigned int x;
for (x = 0; x < (w * h); x++) SWAP32(d[x]);
}
_eet_image_endian_swap(d, w * h);
}
else if (comp == 0 && lossy == EET_IMAGE_JPEG)
{
@ -2531,12 +2497,7 @@ _eet_data_image_decode_inside(const void *data,
int sz1, sz2;
memcpy(header, data, 32);
if (_eet_image_words_bigendian)
{
int i;
for (i = 0; i < 8; i++) SWAP32(header[i]);
}
_eet_image_endian_swap(header, 8);
sz1 = header[1];
sz2 = header[2];