From fb7702f638b300a07fae22601caf24156dd336ae Mon Sep 17 00:00:00 2001 From: Junxiao Shi Date: Sat, 1 Jun 2024 22:42:11 +0000 Subject: [PATCH] mb_shuffle big endian --- src/decode.c | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/src/decode.c b/src/decode.c index af0801018..3a9c77c61 100644 --- a/src/decode.c +++ b/src/decode.c @@ -303,7 +303,33 @@ shuffle_mb_unavail(UINT8 *dst, const UINT8 *src, int pixels) { static void mb_shuffle(UINT8 *dst, const UINT8 *src, Imaging im, ImagingCodecState state) { - memcpy(dst, src, state->xsize * im->pixelsize); + int size = state->xsize * im->pixelsize; +#ifdef WORDS_BIGENDIAN + switch (im->depth) { + default: + abort(); + return; + case 4 * CHAR_BIT: { + for (int i = 0; i < size; i += 4) { + dst[i] = src[i + 3]; + dst[i + 1] = src[i + 2]; + dst[i + 2] = src[i + 1]; + dst[i + 3] = src[i]; + } + return; + } + case 2 * CHAR_BIT: { + for (int i = 0; i < size; i += 2) { + dst[i] = src[i + 1]; + dst[i + 1] = src[i]; + } + return; + case CHAR_BIT: + // fallthrough + } + } +#endif + memcpy(dst, src, size); } static int