home *** CD-ROM | disk | FTP | other *** search
/ Enter 2004 April / enter-2004-04.iso / files / EVE_1424_100181.exe / MspImagePlugin.py < prev    next >
Encoding:
Text File  |  2004-04-20  |  2.2 KB  |  100 lines

  1. #
  2. # The Python Imaging Library.
  3. # $Id: //modules/pil/PIL/MspImagePlugin.py#3 $
  4. #
  5. # MSP file handling
  6. #
  7. # This is the format used by the Paint program in Windows 1 and 2.
  8. #
  9. # History:
  10. #       95-09-05 fl     Created
  11. #       97-01-03 fl     Read/write MSP images
  12. #
  13. # Copyright (c) Secret Labs AB 1997.
  14. # Copyright (c) Fredrik Lundh 1995-97.
  15. #
  16. # See the README file for information on usage and redistribution.
  17. #
  18.  
  19.  
  20. __version__ = "0.1"
  21.  
  22. import Image, ImageFile
  23.  
  24.  
  25. #
  26. # read MSP files
  27.  
  28. def i16(c):
  29.     return ord(c[0]) + (ord(c[1])<<8)
  30.  
  31. def _accept(prefix):
  32.     return prefix[:4] in ["DanM", "LinS"]
  33.  
  34. class MspImageFile(ImageFile.ImageFile):
  35.  
  36.     format = "MSP"
  37.     format_description = "Windows Paint"
  38.  
  39.     def _open(self):
  40.  
  41.         # Header
  42.         s = self.fp.read(32)
  43.         if s[:4] not in ["DanM", "LinS"]:
  44.             raise SyntaxError, "not an MSP file"
  45.  
  46.         # Header checksum
  47.         sum = 0
  48.         for i in range(0, 32, 2):
  49.             sum = sum ^ i16(s[i:i+2])
  50.         if sum != 0:
  51.             raise SyntaxError, "bad MSP checksum"
  52.  
  53.         self.mode = "1"
  54.         self.size = i16(s[4:]), i16(s[6:])
  55.  
  56.         if s[:4] == "DanM":
  57.             self.tile = [("raw", (0,0)+self.size, 32, ("1", 0, 1))]
  58.         else:
  59.             self.tile = [("msp", (0,0)+self.size, 32+2*self.size[1], None)]
  60.  
  61. #
  62. # write MSP files (uncompressed only)
  63.  
  64. def o16(i):
  65.     return chr(i&255) + chr(i>>8&255)
  66.  
  67. def _save(im, fp, filename):
  68.  
  69.     if im.mode != "1":
  70.         raise IOError, "cannot write mode %s as MSP" % im.mode
  71.  
  72.     # create MSP header
  73.     header = [0] * 16
  74.  
  75.     header[0], header[1] = i16("Da"), i16("nM") # version 1
  76.     header[2], header[3] = im.size
  77.     header[4], header[5] = 1, 1
  78.     header[6], header[7] = 1, 1
  79.     header[8], header[9] = im.size
  80.  
  81.     sum = 0
  82.     for h in header:
  83.         sum = sum ^ h
  84.     header[12] = sum # FIXME: is this the right field?
  85.  
  86.     # header
  87.     for h in header:
  88.         fp.write(o16(h))
  89.  
  90.     # image body
  91.     ImageFile._save(im, fp, [("raw", (0,0)+im.size, 32, ("1", 0, 1))])
  92.  
  93. #
  94. # registry
  95.  
  96. Image.register_open("MSP", MspImageFile, _accept)
  97. Image.register_save("MSP", _save)
  98.  
  99. Image.register_extension("MSP", ".msp")
  100.