Fixed I;16 conversion on big endian

This commit is contained in:
Andrew Murray 2021-12-21 16:12:52 +11:00
parent 591e79e01e
commit 9b0192826a
3 changed files with 9 additions and 14 deletions

View File

@ -13,7 +13,6 @@ from .helper import (
assert_image_equal,
assert_image_equal_tofile,
hopper,
is_big_endian,
is_win32,
mark_if_feature_version,
skip_unless_feature,
@ -77,7 +76,6 @@ class TestFilePng:
png.crc(cid, s)
return chunks
@pytest.mark.xfail(is_big_endian(), reason="Fails on big-endian")
def test_sanity(self, tmp_path):
# internal version number

View File

@ -963,10 +963,17 @@ static struct {
{"HSV", "RGB", hsv2rgb},
#ifdef WORDS_BIGENDIAN
{"I", "I;16", I_I16B},
{"I;16", "I", I16B_I},
{"L", "I;16", L_I16B},
{"I;16", "L", I16B_L},
#else
{"I", "I;16", I_I16L},
{"I;16", "I", I16L_I},
{"L", "I;16", L_I16L},
{"I;16", "L", I16L_L},
#endif
{"I", "I;16L", I_I16L},
{"I;16L", "I", I16L_I},

View File

@ -181,21 +181,11 @@ ImagingGetExtrema(Imaging im, void *extrema) {
case IMAGING_TYPE_SPECIAL:
if (strcmp(im->mode, "I;16") == 0) {
UINT16 v;
UINT8 *pixel = *im->image8;
#ifdef WORDS_BIGENDIAN
v = pixel[0] + (pixel[1] << 8);
#else
memcpy(&v, pixel, sizeof(v));
#endif
memcpy(&v, *im->image8, sizeof(v));
imin = imax = v;
for (y = 0; y < im->ysize; y++) {
for (x = 0; x < im->xsize; x++) {
pixel = (UINT8 *)im->image[y] + x * sizeof(v);
#ifdef WORDS_BIGENDIAN
v = pixel[0] + (pixel[1] << 8);
#else
memcpy(&v, pixel, sizeof(v));
#endif
memcpy(&v, im->image[y] + x * sizeof(v), sizeof(v));
if (imin > v) {
imin = v;
} else if (imax < v) {