Index: TiffImagePlugin.py
===================================================================
--- TiffImagePlugin.py  (revision 451)
+++ TiffImagePlugin.py  (working copy)
@@ -74,7 +74,12 @@
     return ord(c[o+1]) + (ord(c[o])<<8)
def ib32(c,o=0):
     return ord(c[o+3]) + (ord(c[o+2])<<8) + (ord(c[o+1])<<16) + (ord(c[o])<<24)
+def ob16(i):
+    return chr(i>>8&255) + chr(i&255)
+def ob32(i):
+    return chr(i>>24&255) + chr(i>>16&255) + chr(i>>8&255) + chr(i&255)
+
# a few tag names, just to make the code below a bit more readable
IMAGEWIDTH = 256
IMAGELENGTH = 257
@@ -116,40 +121,74 @@
     32773: "packbits"
}
+
OPEN_INFO = {
-    # (PhotoInterpretation, SampleFormat, FillOrder, BitsPerSample,
+    # (Prefix, PhotoInterpretation, SampleFormat, FillOrder, BitsPerSample,
     #  ExtraSamples) => mode, rawmode
-    (0, 1, 1, (1,), ()): ("1", "1;I"),
-    (0, 1, 2, (1,), ()): ("1", "1;IR"),
-    (0, 1, 1, (8,), ()): ("L", "L;I"),
-    (0, 1, 2, (8,), ()): ("L", "L;IR"),
-    (1, 1, 1, (1,), ()): ("1", "1"),
-    (1, 1, 2, (1,), ()): ("1", "1;R"),
-    (1, 1, 1, (8,), ()): ("L", "L"),
-    (1, 1, 1, (8,8), (2,)): ("LA", "LA"),
-    (1, 1, 2, (8,), ()): ("L", "L;R"),
-    (1, 1, 1, (16,), ()): ("I;16", "I;16"),
-    (1, 2, 1, (16,), ()): ("I;16S", "I;16S"),
-    (1, 2, 1, (32,), ()): ("I", "I;32S"),
-    (1, 3, 1, (32,), ()): ("F", "F;32F"),
-    (2, 1, 1, (8,8,8), ()): ("RGB", "RGB"),
-    (2, 1, 2, (8,8,8), ()): ("RGB", "RGB;R"),
-    (2, 1, 1, (8,8,8,8), (0,)): ("RGBX", "RGBX"),
-    (2, 1, 1, (8,8,8,8), (1,)): ("RGBA", "RGBa"),
-    (2, 1, 1, (8,8,8,8), (2,)): ("RGBA", "RGBA"),
-    (2, 1, 1, (8,8,8,8), (999,)): ("RGBA", "RGBA"), # corel draw 10
-    (3, 1, 1, (1,), ()): ("P", "P;1"),
-    (3, 1, 2, (1,), ()): ("P", "P;1R"),
-    (3, 1, 1, (2,), ()): ("P", "P;2"),
-    (3, 1, 2, (2,), ()): ("P", "P;2R"),
-    (3, 1, 1, (4,), ()): ("P", "P;4"),
-    (3, 1, 2, (4,), ()): ("P", "P;4R"),
-    (3, 1, 1, (8,), ()): ("P", "P"),
-    (3, 1, 1, (8,8), (2,)): ("PA", "PA"),
-    (3, 1, 2, (8,), ()): ("P", "P;R"),
-    (5, 1, 1, (8,8,8,8), ()): ("CMYK", "CMYK"),
-    (6, 1, 1, (8,8,8), ()): ("YCbCr", "YCbCr"),
-    (8, 1, 1, (8,8,8), ()): ("LAB", "LAB"),
+    # 'MM' prefix = big endian; 'II' prefix = little endian (from 'M'otorola and 'I'ntel)
+    ('II', 0, 1, 1, (1,), ()): ("1", "1;I"),
+    ('II', 0, 1, 2, (1,), ()): ("1", "1;IR"),
+    ('II', 0, 1, 1, (8,), ()): ("L", "L;I"),
+    ('II', 0, 1, 2, (8,), ()): ("L", "L;IR"),
+    ('II', 1, 1, 1, (1,), ()): ("1", "1"),
+    ('II', 1, 1, 2, (1,), ()): ("1", "1;R"),
+    ('II', 1, 1, 1, (8,), ()): ("L", "L"),
+    ('II', 1, 1, 1, (8,8), (2,)): ("LA", "LA"),
+    ('II', 1, 1, 2, (8,), ()): ("L", "L;R"),
+    ('II', 1, 1, 1, (16,), ()): ("I;16", "I;16"),
+    ('II', 1, 2, 1, (16,), ()): ("I", "I;16S"),
+    ('II', 1, 2, 1, (32,), ()): ("I", "I;32S"),
+    ('II', 1, 3, 1, (32,), ()): ("F", "F;32F"),
+    ('II', 2, 1, 1, (8,8,8), ()): ("RGB", "RGB"),
+    ('II', 2, 1, 2, (8,8,8), ()): ("RGB", "RGB;R"),
+    ('II', 2, 1, 1, (8,8,8,8), (0,)): ("RGBX", "RGBX"),
+    ('II', 2, 1, 1, (8,8,8,8), (1,)): ("RGBA", "RGBa"),
+    ('II', 2, 1, 1, (8,8,8,8), (2,)): ("RGBA", "RGBA"),
+    ('II', 2, 1, 1, (8,8,8,8), (999,)): ("RGBA", "RGBA"), # corel draw 10
+    ('II', 3, 1, 1, (1,), ()): ("P", "P;1"),
+    ('II', 3, 1, 2, (1,), ()): ("P", "P;1R"),
+    ('II', 3, 1, 1, (2,), ()): ("P", "P;2"),
+    ('II', 3, 1, 2, (2,), ()): ("P", "P;2R"),
+    ('II', 3, 1, 1, (4,), ()): ("P", "P;4"),
+    ('II', 3, 1, 2, (4,), ()): ("P", "P;4R"),
+    ('II', 3, 1, 1, (8,), ()): ("P", "P"),
+    ('II', 3, 1, 1, (8,8), (2,)): ("PA", "PA"),
+    ('II', 3, 1, 2, (8,), ()): ("P", "P;R"),
+    ('II', 5, 1, 1, (8,8,8,8), ()): ("CMYK", "CMYK"),
+    ('II', 6, 1, 1, (8,8,8), ()): ("YCbCr", "YCbCr"),
+    ('II', 8, 1, 1, (8,8,8), ()): ("LAB", "LAB"),
+
+    ('MM', 0, 1, 1, (1,), ()): ("1", "1;I"),
+    ('MM', 0, 1, 2, (1,), ()): ("1", "1;IR"),
+    ('MM', 0, 1, 1, (8,), ()): ("L", "L;I"),
+    ('MM', 0, 1, 2, (8,), ()): ("L", "L;IR"),
+    ('MM', 1, 1, 1, (1,), ()): ("1", "1"),
+    ('MM', 1, 1, 2, (1,), ()): ("1", "1;R"),
+    ('MM', 1, 1, 1, (8,), ()): ("L", "L"),
+    ('MM', 1, 1, 1, (8,8), (2,)): ("LA", "LA"),
+    ('MM', 1, 1, 2, (8,), ()): ("L", "L;R"),
+    ('MM', 1, 1, 1, (16,), ()): ("I;16", "I;16B"),
+    ('MM', 1, 2, 1, (16,), ()): ("I", "I;16BS"),
+    ('MM', 1, 2, 1, (32,), ()): ("I", "I;32BS"),
+    ('MM', 1, 3, 1, (32,), ()): ("F", "F;32BF"),
+    ('MM', 2, 1, 1, (8,8,8), ()): ("RGB", "RGB"),
+    ('MM', 2, 1, 2, (8,8,8), ()): ("RGB", "RGB;R"),
+    ('MM', 2, 1, 1, (8,8,8,8), (0,)): ("RGBX", "RGBX"),
+    ('MM', 2, 1, 1, (8,8,8,8), (1,)): ("RGBA", "RGBa"),
+    ('MM', 2, 1, 1, (8,8,8,8), (2,)): ("RGBA", "RGBA"),
+    ('MM', 2, 1, 1, (8,8,8,8), (999,)): ("RGBA", "RGBA"), # corel draw 10
+    ('MM', 3, 1, 1, (1,), ()): ("P", "P;1"),
+    ('MM', 3, 1, 2, (1,), ()): ("P", "P;1R"),
+    ('MM', 3, 1, 1, (2,), ()): ("P", "P;2"),
+    ('MM', 3, 1, 2, (2,), ()): ("P", "P;2R"),
+    ('MM', 3, 1, 1, (4,), ()): ("P", "P;4"),
+    ('MM', 3, 1, 2, (4,), ()): ("P", "P;4R"),
+    ('MM', 3, 1, 1, (8,), ()): ("P", "P"),
+    ('MM', 3, 1, 1, (8,8), (2,)): ("PA", "PA"),
+    ('MM', 3, 1, 2, (8,), ()): ("P", "P;R"),
+    ('MM', 5, 1, 1, (8,8,8,8), ()): ("CMYK", "CMYK"),
+    ('MM', 6, 1, 1, (8,8,8), ()): ("YCbCr", "YCbCr"),
+    ('MM', 8, 1, 1, (8,8,8), ()): ("LAB", "LAB"),
}
PREFIXES = ["MM\000\052", "II\052\000", "II\xBC\000"]
@@ -165,11 +204,11 @@
     # represents a TIFF tag directory.  to speed things up,
     # we don't decode tags unless they're asked for.
-    def __init__(self, prefix="II"):
+    def __init__(self, prefix):
         self.prefix = prefix[:2]
         if self.prefix == "MM":
             self.i16, self.i32 = ib16, ib32
-            # FIXME: save doesn't yet support big-endian mode...
+            self.o16, self.o32 = ob16, ob32
         elif self.prefix == "II":
             self.i16, self.i32 = il16, il32
             self.o16, self.o32 = ol16, ol32
@@ -555,7 +594,7 @@
         # mode: check photometric interpretation and bits per pixel
         key = (
-            photo, format, fillorder,
+            self.tag.prefix, photo, format, fillorder,
             self.tag.get(BITSPERSAMPLE, (1,)),
             self.tag.get(EXTRASAMPLES, ())
             )
@@ -640,22 +679,22 @@
# little endian is default
SAVE_INFO = {
-    # mode => rawmode, photometrics, sampleformat, bitspersample, extra
-    "1": ("1", 1, 1, (1,), None),
-    "L": ("L", 1, 1, (8,), None),
-    "LA": ("LA", 1, 1, (8,8), 2),
-    "P": ("P", 3, 1, (8,), None),
-    "PA": ("PA", 3, 1, (8,8), 2),
-    "I": ("I;32S", 1, 2, (32,), None),
-    "I;16": ("I;16", 1, 1, (16,), None),
-    "I;16S": ("I;16S", 1, 2, (16,), None),
-    "F": ("F;32F", 1, 3, (32,), None),
-    "RGB": ("RGB", 2, 1, (8,8,8), None),
-    "RGBX": ("RGBX", 2, 1, (8,8,8,8), 0),
-    "RGBA": ("RGBA", 2, 1, (8,8,8,8), 2),
-    "CMYK": ("CMYK", 5, 1, (8,8,8,8), None),
-    "YCbCr": ("YCbCr", 6, 1, (8,8,8), None),
-    "LAB": ("LAB", 8, 1, (8,8,8), None),
+    # mode => rawmode, photometrics, sampleformat, bitspersample, extra, prefix
+    "1": ("1", 1, 1, (1,), None, 'II'),
+    "L": ("L", 1, 1, (8,), None, 'II'),
+    "LA": ("LA", 1, 1, (8,8), 2, 'II'),
+    "P": ("P", 3, 1, (8,), None, 'II'),
+    "PA": ("PA", 3, 1, (8,8), 2, 'II'),
+    "I": ("I;32S", 1, 2, (32,), None, 'II'),
+    "I;16": ("I;16", 1, 1, (16,), None, 'II'),
+    "I;16B": ("I;16B", 1, 2, (16,), None, 'MM'),
+    "F": ("F;32F", 1, 3, (32,), None, 'II'),
+    "RGB": ("RGB", 2, 1, (8,8,8), None, 'II'),
+    "RGBX": ("RGBX", 2, 1, (8,8,8,8), 0, 'II'),
+    "RGBA": ("RGBA", 2, 1, (8,8,8,8), 2, 'II'),
+    "CMYK": ("CMYK", 5, 1, (8,8,8,8), None, 'II'),
+    "YCbCr": ("YCbCr", 6, 1, (8,8,8), None, 'II'),
+    "LAB": ("LAB", 8, 1, (8,8,8), None, 'II'),
}
def _cvt_res(value):
@@ -671,11 +710,11 @@
def _save(im, fp, filename):
     try:
-        rawmode, photo, format, bits, extra = SAVE_INFO[im.mode]
+        rawmode, photo, format, bits, extra, prefix = SAVE_INFO[im.mode]
     except KeyError:
         raise IOError, "cannot write mode %s as TIFF" % im.mode
-    ifd = ImageFileDirectory()
+    ifd = ImageFileDirectory(prefix)
     # tiff header (write via IFD to get everything right)
     fp.write(ifd.prefix + ifd.o16(42) + ifd.o32(8))