diff options
author | Cedric BAIL <cedric@osg.samsung.com> | 2015-01-06 11:09:27 +0100 |
---|---|---|
committer | Cedric BAIL <cedric@osg.samsung.com> | 2015-01-06 11:49:28 +0100 |
commit | 6724bbf8bdd04318b8aa36985c0a761f86cfe022 (patch) | |
tree | 4e961a9dc9764eb9c7eef529cf692bd63c83f651 | |
parent | 18d494489c5651aa152622a56579bbc1bda853cb (diff) | |
download | efl-6724bbf8bdd04318b8aa36985c0a761f86cfe022.tar.gz |
eet: refactorize handling of endian.
-rw-r--r-- | src/lib/eet/eet_image.c | 157 |
1 files changed, 59 insertions, 98 deletions
diff --git a/src/lib/eet/eet_image.c b/src/lib/eet/eet_image.c index 6a0bfa7b79..5ebe5a01b1 100644 --- a/src/lib/eet/eet_image.c +++ b/src/lib/eet/eet_image.c @@ -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; - - v = htonl(0x12345678); - if (v == 0x12345678) - _eet_image_words_bigendian = 1; - else - _eet_image_words_bigendian = 0; - } - - { - unsigned char *d; - int *header; + unsigned char *d; + int *header; - d = malloc((w * h * 4) + (8 * 4)); - if (!d) - return NULL; + _eet_image_endian_check(); - header = (int *)d; - memset(d, 0, 32); + d = malloc((w * h * 4) + (8 * 4)); + if (!d) + return NULL; - header[0] = 0xac1dfeed; - header[1] = w; - header[2] = h; - header[3] = alpha; + header = (int *)d; + memset(d, 0, 32); - memcpy(d + 32, data, w * h * 4); + header[0] = 0xac1dfeed; + header[1] = w; + header[2] = h; + header[3] = alpha; - if (_eet_image_words_bigendian) - { - unsigned int i; + memcpy(d + 32, data, w * h * 4); - for (i = 0; i < ((w * h) + 8); i++) SWAP32(header[i]); - } + _eet_image_endian_swap(header, ((w * h) + 8)); - *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]; |