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)