home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / lib / python2.6 / dist-packages / PIL / IcnsImagePlugin.pyc (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2009-04-20  |  6.6 KB  |  211 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.6)
  3.  
  4. import Image
  5. import ImageFile
  6. import string
  7. import struct
  8. HEADERSIZE = 8
  9.  
  10. def nextheader(fobj):
  11.     return struct.unpack('>4sI', fobj.read(HEADERSIZE))
  12.  
  13.  
  14. def read_32t(fobj, .1, .2):
  15.     (start, length) = .1
  16.     (width, height) = .2
  17.     fobj.seek(start)
  18.     sig = fobj.read(4)
  19.     if sig != '\x00\x00\x00\x00':
  20.         raise SyntaxError, 'Unknown signature, expecting 0x00000000'
  21.     sig != '\x00\x00\x00\x00'
  22.     return read_32(fobj, (start + 4, length - 4), (width, height))
  23.  
  24.  
  25. def read_32(fobj, .1, size):
  26.     '''
  27.     Read a 32bit RGB icon resource.  Seems to be either uncompressed or
  28.     an RLE packbits-like scheme.
  29.     '''
  30.     (start, length) = .1
  31.     fobj.seek(start)
  32.     sizesq = size[0] * size[1]
  33.     if length == sizesq * 3:
  34.         indata = fobj.read(length)
  35.         im = Image.frombuffer('RGB', size, indata, 'raw', 'RGB', 0, 1)
  36.     else:
  37.         im = Image.new('RGB', size, None)
  38.         for band_ix in range(3):
  39.             data = []
  40.             bytesleft = sizesq
  41.             while bytesleft > 0:
  42.                 byte = fobj.read(1)
  43.                 if not byte:
  44.                     break
  45.                 
  46.                 byte = ord(byte)
  47.                 if byte & 128:
  48.                     blocksize = byte - 125
  49.                     byte = fobj.read(1)
  50.                     for i in range(blocksize):
  51.                         data.append(byte)
  52.                     
  53.                 else:
  54.                     blocksize = byte + 1
  55.                     data.append(fobj.read(blocksize))
  56.                 bytesleft = bytesleft - blocksize
  57.                 if bytesleft <= 0:
  58.                     break
  59.                     continue
  60.             if bytesleft != 0:
  61.                 raise SyntaxError('Error reading %r channel [%r]' % (channel, bytesleft))
  62.             bytesleft != 0
  63.             band = Image.frombuffer('L', size, string.join(data, ''), 'raw', 'L', 0, 1)
  64.             im.im.putband(band.im, band_ix)
  65.         
  66.     return {
  67.         'RGB': im }
  68.  
  69.  
  70. def read_mk(fobj, .1, size):
  71.     (start, length) = .1
  72.     fobj.seek(start)
  73.     band = Image.frombuffer('L', size, fobj.read(size[0] * size[1]), 'raw', 'L', 0, 1)
  74.     return {
  75.         'A': band }
  76.  
  77.  
  78. class IcnsFile:
  79.     SIZES = {
  80.         (128, 128): [
  81.             ('it32', read_32t),
  82.             ('t8mk', read_mk)],
  83.         (48, 48): [
  84.             ('ih32', read_32),
  85.             ('h8mk', read_mk)],
  86.         (32, 32): [
  87.             ('il32', read_32),
  88.             ('l8mk', read_mk)],
  89.         (16, 16): [
  90.             ('is32', read_32),
  91.             ('s8mk', read_mk)] }
  92.     
  93.     def __init__(self, fobj):
  94.         '''
  95.         fobj is a file-like object as an icns resource
  96.         '''
  97.         self.dct = dct = { }
  98.         self.fobj = fobj
  99.         (sig, filesize) = nextheader(fobj)
  100.         if sig != 'icns':
  101.             raise SyntaxError, 'not an icns file'
  102.         sig != 'icns'
  103.         i = HEADERSIZE
  104.         while i < filesize:
  105.             (sig, blocksize) = nextheader(fobj)
  106.             i = i + HEADERSIZE
  107.             blocksize = blocksize - HEADERSIZE
  108.             dct[sig] = (i, blocksize)
  109.             fobj.seek(blocksize, 1)
  110.             i = i + blocksize
  111.  
  112.     
  113.     def itersizes(self):
  114.         sizes = []
  115.         for size, fmts in self.SIZES.items():
  116.             for fmt, reader in fmts:
  117.                 if self.dct.has_key(fmt):
  118.                     sizes.append(size)
  119.                     break
  120.                     continue
  121.             
  122.         
  123.         return sizes
  124.  
  125.     
  126.     def bestsize(self):
  127.         sizes = self.itersizes()
  128.         if not sizes:
  129.             raise SyntaxError, 'No 32bit icon resources found'
  130.         sizes
  131.         return max(sizes)
  132.  
  133.     
  134.     def dataforsize(self, size):
  135.         '''
  136.         Get an icon resource as {channel: array}.  Note that
  137.         the arrays are bottom-up like windows bitmaps and will likely
  138.         need to be flipped or transposed in some way.
  139.         '''
  140.         dct = { }
  141.         for code, reader in self.SIZES[size]:
  142.             desc = self.dct.get(code)
  143.             if desc is not None:
  144.                 dct.update(reader(self.fobj, desc, size))
  145.                 continue
  146.         
  147.         return dct
  148.  
  149.     
  150.     def getimage(self, size = None):
  151.         if size is None:
  152.             size = self.bestsize()
  153.         
  154.         channels = self.dataforsize(size)
  155.         im = channels.get('RGB').copy()
  156.         
  157.         try:
  158.             im.putalpha(channels['A'])
  159.         except KeyError:
  160.             pass
  161.  
  162.         return im
  163.  
  164.  
  165.  
  166. class IcnsImageFile(ImageFile.ImageFile):
  167.     """
  168.     PIL read-only image support for Mac OS .icns files.
  169.     Chooses the best resolution, but will possibly load
  170.     a different size image if you mutate the size attribute
  171.     before calling 'load'.
  172.  
  173.     The info dictionary has a key 'sizes' that is a list
  174.     of sizes that the icns file has.
  175.     """
  176.     format = 'ICNS'
  177.     format_description = 'Mac OS icns resource'
  178.     
  179.     def _open(self):
  180.         self.icns = IcnsFile(self.fp)
  181.         self.mode = 'RGBA'
  182.         self.size = self.icns.bestsize()
  183.         self.info['sizes'] = self.icns.itersizes()
  184.         self.tile = ('',)
  185.  
  186.     
  187.     def load(self):
  188.         Image.Image.load(self)
  189.         if not self.tile:
  190.             return None
  191.         self.load_prepare()
  192.         im = self.icns.getimage(self.size)
  193.         self.im = im.im
  194.         self.mode = im.mode
  195.         self.size = im.size
  196.         self.fp = None
  197.         self.icns = None
  198.         self.tile = ()
  199.         self.load_end()
  200.  
  201.  
  202. Image.register_open('ICNS', IcnsImageFile, (lambda x: x[:4] == 'icns'))
  203. Image.register_extension('ICNS', '.icns')
  204. if __name__ == '__main__':
  205.     import os
  206.     import sys
  207.     im = Image.open(open(sys.argv[1], 'rb'))
  208.     im.save('out.png')
  209.     os.startfile('out.png')
  210.  
  211.