From e077c13bafd0d139dd2816acdad86b10c38b7a48 Mon Sep 17 00:00:00 2001 From: Thomas A Caswell <tcaswell@gmail.com> Date: Fri, 1 Jul 2016 23:36:51 -0400 Subject: [PATCH] FIX: handle non-native endian images In cbook.safe_mask_invalid also ensure that the data is in native byte order. close #6671 closes #6394 --- lib/matplotlib/cbook.py | 7 ++++++ .../test_image/imshow_endianess.png | Bin 0 -> 5320 bytes lib/matplotlib/tests/test_image.py | 21 +++++++++++++++--- 3 files changed, 25 insertions(+), 3 deletions(-) create mode 100644 lib/matplotlib/tests/baseline_images/test_image/imshow_endianess.png diff --git a/lib/matplotlib/cbook.py b/lib/matplotlib/cbook.py index 8fef27ac0165..ab0cc8edec27 100644 --- a/lib/matplotlib/cbook.py +++ b/lib/matplotlib/cbook.py @@ -1505,6 +1505,13 @@ def issubclass_safe(x, klass): def safe_masked_invalid(x, copy=False): x = np.array(x, subok=True, copy=copy) + if not x.dtype.isnative: + # Note that the argument to `byteswap` is 'inplace', + # thus if we have already made a copy, do the byteswap in + # place, else make a copy with the byte order swapped. + # Be explicit that we are swapping the byte order of the dtype + x = x.byteswap(copy).newbyteorder('S') + try: xm = np.ma.masked_invalid(x, copy=False) xm.shrink_mask() diff --git a/lib/matplotlib/tests/baseline_images/test_image/imshow_endianess.png b/lib/matplotlib/tests/baseline_images/test_image/imshow_endianess.png new file mode 100644 index 0000000000000000000000000000000000000000..148acf1251743f8b2f5a1d6916854c31f0bcc76c GIT binary patch literal 5320 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 WUs1M;)CKM50iK7@?(_q}DgOq^7HVz) literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/test_image.py b/lib/matplotlib/tests/test_image.py index 23d842f79aee..29cc7a98e638 100644 --- a/lib/matplotlib/tests/test_image.py +++ b/lib/matplotlib/tests/test_image.py @@ -677,6 +677,21 @@ def test_mask_image(): ax2.imshow(A, interpolation='nearest') -if __name__=='__main__': - import nose - nose.runmodule(argv=['-s','--with-doctest'], exit=False) +@image_comparison(baseline_images=['imshow_endianess'], + remove_text=True, extensions=['png']) +def test_imshow_endianess(): + x = np.arange(10) + X, Y = np.meshgrid(x, x) + Z = ((X-5)**2 + (Y-5)**2)**0.5 + + fig, (ax1, ax2) = plt.subplots(1, 2) + + kwargs = dict(origin="lower", interpolation='nearest', + cmap='viridis') + + ax1.imshow(Z.astype('<f8'), **kwargs) + ax2.imshow(Z.astype('>f8'), **kwargs) + + +if __name__ == '__main__': + nose.runmodule(argv=['-s', '--with-doctest'], exit=False)