From 2ca83968ae53bfdad3100882be9d3628b0e7aa9e Mon Sep 17 00:00:00 2001 From: James Zern Date: Thu, 16 May 2013 13:47:15 -0700 Subject: [PATCH] webp/lossless: fix big endian BGRA output Change-Id: I3d4b3d21f561cb526dbe7697a31ea847d3e8b2c1 --- src/dsp/lossless.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/dsp/lossless.c b/src/dsp/lossless.c index 8c0960ad..f9078071 100644 --- a/src/dsp/lossless.c +++ b/src/dsp/lossless.c @@ -1279,11 +1279,12 @@ static void CopyOrSwap(const uint32_t* src, int num_pixels, uint8_t* dst, while (src < src_end) { uint32_t argb = *src++; +#if !defined(__BIG_ENDIAN__) #if !defined(WEBP_REFERENCE_IMPLEMENTATION) -#if !defined(__BIG_ENDIAN__) && (defined(__i386__) || defined(__x86_64__)) +#if defined(__i386__) || defined(__x86_64__) __asm__ volatile("bswap %0" : "=r"(argb) : "0"(argb)); *(uint32_t*)dst = argb; -#elif !defined(__BIG_ENDIAN__) && defined(_MSC_VER) +#elif defined(_MSC_VER) argb = _byteswap_ulong(argb); *(uint32_t*)dst = argb; #else @@ -1292,11 +1293,17 @@ static void CopyOrSwap(const uint32_t* src, int num_pixels, uint8_t* dst, dst[2] = (argb >> 8) & 0xff; dst[3] = (argb >> 0) & 0xff; #endif -#else // WEBP_REFERENCE_IMPLEMENTATION +#else // WEBP_REFERENCE_IMPLEMENTATION dst[0] = (argb >> 24) & 0xff; dst[1] = (argb >> 16) & 0xff; dst[2] = (argb >> 8) & 0xff; dst[3] = (argb >> 0) & 0xff; +#endif +#else // __BIG_ENDIAN__ + dst[0] = (argb >> 0) & 0xff; + dst[1] = (argb >> 8) & 0xff; + dst[2] = (argb >> 16) & 0xff; + dst[3] = (argb >> 24) & 0xff; #endif dst += sizeof(argb); }