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

  1. #
  2. # The Python Imaging Library.
  3. # $Id: //modules/pil/PIL/FliImagePlugin.py#3 $
  4. #
  5. # FLI/FLC file handling.
  6. #
  7. # History:
  8. #       95-09-01 fl     Created
  9. #       97-01-03 fl     Fixed parser, setup decoder tile
  10. #       98-07-15 fl     Renamed offset attribute to avoid name clash
  11. #
  12. # Copyright (c) Secret Labs AB 1997-98.
  13. # Copyright (c) Fredrik Lundh 1995-97.
  14. #
  15. # See the README file for information on usage and redistribution.
  16. #
  17.  
  18.  
  19. __version__ = "0.2"
  20.  
  21. import Image, ImageFile, ImagePalette
  22. import string
  23.  
  24.  
  25. def i16(c):
  26.     return ord(c[0]) + (ord(c[1])<<8)
  27.  
  28. def i32(c):
  29.     return ord(c[0]) + (ord(c[1])<<8) + (ord(c[2])<<16) + (ord(c[3])<<24)
  30.  
  31. #
  32. # decoder
  33.  
  34. def _accept(prefix):
  35.     return i16(prefix[4:6]) in [0xAF11, 0xAF12]
  36.  
  37. class FliImageFile(ImageFile.ImageFile):
  38.  
  39.     format = "FLI"
  40.     format_description = "Autodesk FLI/FLC Animation"
  41.  
  42.     def _open(self):
  43.  
  44.         # HEAD
  45.         s = self.fp.read(128)
  46.         magic = i16(s[4:6])
  47.         if magic not in [0xAF11, 0xAF12]:
  48.             raise SyntaxError, "not an FLI/FLC file"
  49.  
  50.         # image characteristics
  51.         self.mode = "P"
  52.         self.size = i16(s[8:10]), i16(s[10:12]) 
  53.  
  54.         # animation speed
  55.         duration = i32(s[16:20])
  56.         if magic == 0xAF11:
  57.             duration = (duration * 1000) / 70 
  58.         self.info["duration"] = duration
  59.  
  60.         # look for palette
  61.         palette = map(lambda a: (a,a,a), range(256))
  62.  
  63.         s = self.fp.read(16)
  64.  
  65.         self.__offset = 128
  66.  
  67.         if i16(s[4:6]) == 0xF100:
  68.             # prefix chunk; ignore it
  69.             self.__offset = self.__offset + i32(s)
  70.             s = self.fp.read(16)
  71.  
  72.         if i16(s[4:6]) == 0xF1FA:
  73.             # look for palette chunk
  74.             s = self.fp.read(6)
  75.             if i16(s[4:6]) == 11:
  76.                 self._palette(palette, 2)
  77.             elif i16(s[4:6]) == 4:
  78.                 self._palette(palette, 0)
  79.  
  80.         palette = map(lambda (r,g,b): chr(r)+chr(g)+chr(b), palette)
  81.         self.palette = ImagePalette.raw("RGB", string.join(palette, ""))
  82.  
  83.         # set things up to decode first frame
  84.         self.frame = -1
  85.         self.__fp = self.fp
  86.  
  87.         self.seek(0)
  88.  
  89.     def _palette(self, palette, shift):
  90.         # load palette
  91.  
  92.         i = 0
  93.         for e in range(i16(self.fp.read(2))):
  94.             s = self.fp.read(2)
  95.             i = i + ord(s[0])
  96.             n = ord(s[1])
  97.             if n == 0:
  98.                 n = 256
  99.             s = self.fp.read(n * 3)
  100.             for n in range(0, len(s), 3):
  101.                 r = ord(s[n]) << shift
  102.                 g = ord(s[n+1]) << shift
  103.                 b = ord(s[n+2]) << shift
  104.                 palette[i] = (r, g, b)
  105.                 i = i + 1
  106.  
  107.     def seek(self, frame):
  108.  
  109.         if frame != self.frame + 1:
  110.             raise ValueError, "cannot seek to frame %d" % frame
  111.         self.frame = frame
  112.  
  113.         # move to next frame
  114.         self.fp = self.__fp
  115.         self.fp.seek(self.__offset)
  116.  
  117.         s = self.fp.read(4)
  118.         if not s:
  119.             raise EOFError
  120.  
  121.         framesize = i32(s)
  122.  
  123.         self.decodermaxblock = framesize
  124.         self.tile = [("fli", (0,0)+self.size, self.__offset, None)]
  125.  
  126.         self.__offset = self.__offset + framesize
  127.  
  128.     def tell(self):
  129.  
  130.         return self.frame
  131.  
  132. #
  133. # registry
  134.  
  135. Image.register_open("FLI", FliImageFile, _accept)
  136.  
  137. Image.register_extension("FLI", ".fli")
  138. Image.register_extension("FLI", ".flc")
  139.