home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / pypil112.zip / PIL-1.1.2.zip / Lib / site-packages / PIL / GifImagePlugin.pyc (.txt) < prev    next >
Python Compiled Bytecode  |  2001-12-25  |  9KB  |  254 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.2)
  3.  
  4. __version__ = '0.5'
  5. import Image
  6. import ImageFile
  7. import ImagePalette
  8.  
  9. def i16(c):
  10.     return ord(c[0]) + (ord(c[1]) << 8)
  11.  
  12.  
  13. def o16(i):
  14.     return chr(i & 255) + chr(i >> 8 & 255)
  15.  
  16.  
  17. def _accept(prefix):
  18.     return prefix[:6] in [
  19.         'GIF87a',
  20.         'GIF89a']
  21.  
  22.  
  23. class GifImageFile(ImageFile.ImageFile):
  24.     format = 'GIF'
  25.     format_description = 'Compuserve GIF'
  26.     
  27.     def data(self):
  28.         s = self.fp.read(1)
  29.         if s and ord(s):
  30.             return self.fp.read(ord(s))
  31.         
  32.         return None
  33.  
  34.     
  35.     def _open(self):
  36.         s = self.fp.read(13)
  37.         if s[:6] not in [
  38.             'GIF87a',
  39.             'GIF89a']:
  40.             raise SyntaxError, 'not a GIF file'
  41.         
  42.         self.info['version'] = s[:6]
  43.         self.size = (i16(s[6:]), i16(s[8:]))
  44.         self.tile = []
  45.         flags = ord(s[10])
  46.         bits = (flags & 7) + 1
  47.         if flags & 128:
  48.             self.info['background'] = ord(s[11])
  49.             self.global_palette = self.palette = ImagePalette.raw('RGB', self.fp.read(3 << bits))
  50.         
  51.         self._GifImageFile__fp = self.fp
  52.         self._GifImageFile__offset = 0
  53.         self.dispose = None
  54.         self.frame = -1
  55.         self.seek(0)
  56.  
  57.     
  58.     def seek(self, frame):
  59.         if frame != self.frame + 1:
  60.             raise ValueError, 'cannot seek to frame %d' % frame
  61.         
  62.         self.frame = frame
  63.         self.tile = []
  64.         self.fp = self._GifImageFile__fp
  65.         if self._GifImageFile__offset:
  66.             self.fp.seek(self._GifImageFile__offset)
  67.             while self.data():
  68.                 pass
  69.             self._GifImageFile__offset = 0
  70.         
  71.         if self.dispose:
  72.             self.im = self.dispose
  73.             self.dispose = None
  74.         
  75.         self.palette = self.global_palette
  76.         while 1:
  77.             s = self.fp.read(1)
  78.             if not s or s == ';':
  79.                 break
  80.             elif s == '!':
  81.                 s = self.fp.read(1)
  82.                 block = self.data()
  83.                 if ord(s) == 249:
  84.                     flags = ord(block[0])
  85.                     if flags & 1:
  86.                         self.info['transparency'] = ord(block[3])
  87.                     
  88.                     self.info['duration'] = i16(block[1:3]) * 10
  89.                     
  90.                     try:
  91.                         if flags & 8:
  92.                             self.dispose = Image.core.fill('P', self.size, self.info['background'])
  93.                         elif flags & 16:
  94.                             self.dispose = self.im.copy()
  95.                     except (AttributeError, KeyError):
  96.                         pass
  97.  
  98.                 elif ord(s) == 255:
  99.                     self.info['extension'] = (block, self.fp.tell())
  100.                     if block[:11] == 'NETSCAPE2.0':
  101.                         self.info['loop'] = 1
  102.                     
  103.                 
  104.                 while self.data():
  105.                     pass
  106.             elif s == ',':
  107.                 s = self.fp.read(9)
  108.                 (x0, y0) = (i16(s[0:]), i16(s[2:]))
  109.                 (x1, y1) = (x0 + i16(s[4:]), y0 + i16(s[6:]))
  110.                 flags = ord(s[8])
  111.                 interlace = flags & 64 != 0
  112.                 if flags & 128:
  113.                     bits = (flags & 7) + 1
  114.                     self.palette = ImagePalette.raw('RGB', self.fp.read(3 << bits))
  115.                 
  116.                 bits = ord(self.fp.read(1))
  117.                 self._GifImageFile__offset = self.fp.tell()
  118.                 self.tile = [
  119.                     ('gif', (x0, y0, x1, y1), self._GifImageFile__offset, (bits, interlace))]
  120.                 break
  121.             
  122.         if not (self.tile):
  123.             self._GifImageFile__fp = None
  124.             raise EOFError, 'no more images in GIF file'
  125.         
  126.         self.mode = 'L'
  127.         if self.palette:
  128.             self.mode = 'P'
  129.         
  130.  
  131.     
  132.     def tell(self):
  133.         return self.frame
  134.  
  135.  
  136.  
  137. try:
  138.     import _imaging_gif
  139. except ImportError:
  140.     _imaging_gif = None
  141.  
  142. RAWMODE = {
  143.     '1': 'L',
  144.     'L': 'L',
  145.     'P': 'P' }
  146.  
  147. def _save(im, fp, filename):
  148.     if _imaging_gif:
  149.         
  150.         try:
  151.             _imaging_gif.save(im, fp, filename)
  152.             return None
  153.         except IOError:
  154.             pass
  155.  
  156.     
  157.     
  158.     try:
  159.         rawmode = RAWMODE[im.mode]
  160.         imOut = im
  161.     except KeyError:
  162.         if Image.getmodebase(im.mode) == 'RGB':
  163.             imOut = im.convert('P')
  164.             rawmode = 'P'
  165.         else:
  166.             imOut = im.convert('L')
  167.             rawmode = 'L'
  168.     except:
  169.         Image.getmodebase(im.mode) == 'RGB'
  170.  
  171.     for s in getheader(imOut):
  172.         fp.write(s)
  173.     
  174.     flags = 0
  175.     
  176.     try:
  177.         interlace = im.encoderinfo['interlace']
  178.     except:
  179.         interlace = 1
  180.         flags = flags | 64
  181.  
  182.     fp.write(',' + o16(0) + o16(0) + o16(im.size[0]) + o16(im.size[1]) + chr(flags) + chr(8))
  183.     imOut.encoderconfig = (8, interlace)
  184.     ImageFile._save(imOut, fp, [
  185.         ('gif', (0, 0) + im.size, 0, rawmode)])
  186.     fp.write('\x00')
  187.     fp.write(';')
  188.     
  189.     try:
  190.         fp.flush()
  191.     except:
  192.         pass
  193.  
  194.  
  195.  
  196. def _save_netpbm(im, fp, filename):
  197.     import os
  198.     file = im._dump()
  199.     if im.mode != 'RGB':
  200.         os.system('ppmtogif %s >%s' % (file, filename))
  201.     else:
  202.         os.system('ppmquant 256 %s | ppmtogif >%s' % (file, filename))
  203.     
  204.     try:
  205.         os.unlink(file)
  206.     except:
  207.         pass
  208.  
  209.  
  210.  
  211. def getheader(im):
  212.     '''Return a list of strings representing a GIF header'''
  213.     s = [
  214.         'GIF87a' + o16(im.size[0]) + o16(im.size[1]) + chr(7 + 128) + chr(0) + chr(0)]
  215.     if im.mode == 'P':
  216.         s.append(im.im.getpalette('RGB'))
  217.     else:
  218.         for i in range(256):
  219.             s.append(chr(i) * 3)
  220.         
  221.     return s
  222.  
  223.  
  224. def getdata(im, offset = (0, 0), **params):
  225.     '''Return a list of strings representing this image.
  226.        The first string is a local image header, the rest contains
  227.        encoded image data.'''
  228.     
  229.     class collector:
  230.         data = []
  231.         
  232.         def write(self, data):
  233.             self.data.append(data)
  234.  
  235.  
  236.     im.load()
  237.     fp = collector()
  238.     
  239.     try:
  240.         im.encoderinfo = params
  241.         fp.write(',' + o16(offset[0]) + o16(offset[1]) + o16(im.size[0]) + o16(im.size[1]) + chr(0) + chr(8))
  242.         ImageFile._save(im, fp, [
  243.             ('gif', (0, 0) + im.size, 0, RAWMODE[im.mode])])
  244.         fp.write('\x00')
  245.     finally:
  246.         del im.encoderinfo
  247.  
  248.     return fp.data
  249.  
  250. Image.register_open(GifImageFile.format, GifImageFile, _accept)
  251. Image.register_save(GifImageFile.format, _save)
  252. Image.register_extension(GifImageFile.format, '.gif')
  253. Image.register_mime(GifImageFile.format, 'image/gif')
  254.