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 / EpsImagePlugin.pyc (.txt) < prev    next >
Python Compiled Bytecode  |  2001-12-25  |  10KB  |  296 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.2)
  3.  
  4. __version__ = '0.4'
  5. import re
  6. import string
  7. import Image
  8. import ImageFile
  9.  
  10. def i32(c):
  11.     return ord(c[0]) + (ord(c[1]) << 8) + (ord(c[2]) << 16) + (ord(c[3]) << 24)
  12.  
  13.  
  14. def o32(i):
  15.     return chr(i & 255) + chr(i >> 8 & 255) + chr(i >> 16 & 255) + chr(i >> 24 & 255)
  16.  
  17. split = re.compile('^%%([^:]*):[ \\t]*(.*)[ \\t]*$')
  18. field = re.compile('^%[%!\\w]([^:]*)[ \\t]*$')
  19.  
  20. def Ghostscript(tile, size, fp):
  21.     '''Render an image using Ghostscript (Unix only)'''
  22.     (decoder, tile, offset, data) = tile[0]
  23.     (length, bbox) = data
  24.     import tempfile
  25.     import os
  26.     file = tempfile.mktemp()
  27.     command = [
  28.         'gs',
  29.         '-q',
  30.         '-g%dx%d' % size,
  31.         '-dNOPAUSE -dSAFER',
  32.         '-sDEVICE=ppmraw',
  33.         '-sOutputFile=%s' % file,
  34.         '- >/dev/tty 2>/dev/tty']
  35.     command = string.join(command)
  36.     
  37.     try:
  38.         gs = os.popen(command, 'w')
  39.         if bbox[0] != 0 or bbox[1] != 0:
  40.             gs.write('%d %d translate\n' % (-bbox[0], -bbox[1]))
  41.         
  42.         fp.seek(offset)
  43.         while length > 0:
  44.             s = fp.read(8192)
  45.             if not s:
  46.                 break
  47.             
  48.             length = length - len(s)
  49.             gs.write(s)
  50.         gs.close()
  51.         im = Image.core.open_ppm(file)
  52.     finally:
  53.         
  54.         try:
  55.             os.unlink(file)
  56.         except:
  57.             pass
  58.  
  59.  
  60.     return im
  61.  
  62.  
  63. class PSFile:
  64.     '''Wrapper that treats either CR or LF as end of line.'''
  65.     
  66.     def __init__(self, fp):
  67.         self.fp = fp
  68.         self.char = None
  69.  
  70.     
  71.     def __getattr__(self, id):
  72.         v = getattr(self.fp, id)
  73.         setattr(self, id, v)
  74.         return v
  75.  
  76.     
  77.     def seek(self, offset, whence = 0):
  78.         self.char = None
  79.         self.fp.seek(offset, whence)
  80.  
  81.     
  82.     def tell(self):
  83.         pos = self.fp.tell()
  84.         if self.char:
  85.             pos = pos - 1
  86.         
  87.         return pos
  88.  
  89.     
  90.     def readline(self):
  91.         s = ''
  92.         if self.char:
  93.             c = self.char
  94.             self.char = None
  95.         else:
  96.             c = self.fp.read(1)
  97.         while c not in '\r\n':
  98.             s = s + c
  99.             c = self.fp.read(1)
  100.         if c == '\r':
  101.             self.char = self.fp.read(1)
  102.             if self.char == '\n':
  103.                 self.char = None
  104.             
  105.         
  106.         return s + '\n'
  107.  
  108.  
  109.  
  110. def _accept(prefix):
  111.     if not prefix[:4] == '%!PS':
  112.         pass
  113.     return i32(prefix) == -959196987
  114.  
  115.  
  116. class EpsImageFile(ImageFile.ImageFile):
  117.     '''EPS File Parser for the Python Imaging Library'''
  118.     format = 'EPS'
  119.     format_description = 'Encapsulated Postscript'
  120.     
  121.     def _open(self):
  122.         fp = PSFile(self.fp)
  123.         s = fp.read(512)
  124.         if s[:4] == '%!PS':
  125.             offset = 0
  126.             fp.seek(0, 2)
  127.             length = fp.tell()
  128.         elif i32(s) == -959196987:
  129.             offset = i32(s[4:])
  130.             length = i32(s[8:])
  131.             fp.seek(offset)
  132.         else:
  133.             raise SyntaxError, 'not an EPS file'
  134.         fp.seek(offset)
  135.         box = None
  136.         self.mode = 'RGB'
  137.         self.size = (1, 1)
  138.         s = fp.readline()
  139.         while s:
  140.             if len(s) > 255:
  141.                 raise SyntaxError, 'not an EPS file'
  142.             
  143.             if s[-2:] == '\r\n':
  144.                 s = s[:-2]
  145.             elif s[-1:] == '\n':
  146.                 s = s[:-1]
  147.             
  148.             
  149.             try:
  150.                 m = split.match(s)
  151.             except re.error:
  152.                 v = None
  153.                 raise SyntaxError, 'not an EPS file'
  154.  
  155.             if m:
  156.                 (k, v) = m.group(1, 2)
  157.                 self.info[k] = v
  158.                 if k == 'BoundingBox':
  159.                     
  160.                     try:
  161.                         box = map(int, map(string.atof, string.split(v)))
  162.                         self.size = (box[2] - box[0], box[3] - box[1])
  163.                         self.tile = [
  164.                             ('eps', (0, 0) + self.size, offset, (length, box))]
  165.                     except:
  166.                         pass
  167.  
  168.                 
  169.             else:
  170.                 m = field.match(s)
  171.                 if m:
  172.                     k = m.group(1)
  173.                     if k == 'EndComments':
  174.                         break
  175.                     
  176.                     if k[:8] == 'PS-Adobe':
  177.                         self.info[k[:8]] = k[9:]
  178.                     else:
  179.                         self.info[k] = ''
  180.                 else:
  181.                     raise IOError, 'bad EPS header'
  182.             s = fp.readline()
  183.             if s[:1] != '%':
  184.                 break
  185.             
  186.         while s[0] == '%':
  187.             if len(s) > 255:
  188.                 raise SyntaxError, 'not an EPS file'
  189.             
  190.             if s[-2:] == '\r\n':
  191.                 s = s[:-2]
  192.             elif s[-1:] == '\n':
  193.                 s = s[:-1]
  194.             
  195.             if s[:11] == '%ImageData:':
  196.                 (x, y, bi, mo, z3, z4, en, id) = string.split(s[11:], maxsplit = 7)
  197.                 x = int(x)
  198.                 y = int(y)
  199.                 bi = int(bi)
  200.                 mo = int(mo)
  201.                 en = int(en)
  202.                 if en == 1:
  203.                     decoder = 'eps_binary'
  204.                 elif en == 2:
  205.                     decoder = 'eps_hex'
  206.                 else:
  207.                     break
  208.                 if bi != 8:
  209.                     break
  210.                 
  211.                 if mo == 1:
  212.                     self.mode = 'L'
  213.                 elif mo == 2:
  214.                     self.mode = 'LAB'
  215.                 elif mo == 3:
  216.                     self.mode = 'RGB'
  217.                 else:
  218.                     break
  219.                 if id[-1:] == id[-1:]:
  220.                     pass
  221.                 elif id[-1:] == '"':
  222.                     id = id[1:-1]
  223.                 
  224.                 while 1:
  225.                     s = fp.readline()
  226.                     if not s:
  227.                         break
  228.                     
  229.                     if s[:len(id)] == id:
  230.                         self.size = (x, y)
  231.                         self.tile2 = [
  232.                             (decoder, (0, 0, x, y), fp.tell(), 0)]
  233.                         return None
  234.                     
  235.             
  236.             s = fp.readline()
  237.             if not s:
  238.                 break
  239.             
  240.         if not box:
  241.             raise IOError, 'cannot determine EPS bounding box'
  242.         
  243.  
  244.     
  245.     def load(self):
  246.         if not (self.tile):
  247.             return None
  248.         
  249.         self.im = Ghostscript(self.tile, self.size, self.fp)
  250.         self.mode = self.im.mode
  251.         self.size = self.im.size
  252.         self.tile = []
  253.  
  254.  
  255.  
  256. def _save(im, fp, filename, eps = 1):
  257.     '''EPS Writer for the Python Imaging Library.'''
  258.     im.load()
  259.     if im.mode == 'L':
  260.         operator = (8, 1, 'image')
  261.     elif im.mode == 'RGB':
  262.         operator = (8, 3, 'false 3 colorimage')
  263.     elif im.mode == 'CMYK':
  264.         operator = (8, 4, 'false 4 colorimage')
  265.     else:
  266.         raise ValueError, 'image mode is not supported'
  267.     if eps:
  268.         fp.write('%!PS-Adobe-3.0 EPSF-3.0\n')
  269.         fp.write('%%Creator: PIL 0.1 EpsEncode\n')
  270.         fp.write('%%%%BoundingBox: 0 0 %d %d\n' % im.size)
  271.         fp.write('%%Pages: 1\n')
  272.         fp.write('%%EndComments\n')
  273.         fp.write('%%Page: 1 1\n')
  274.         fp.write('%%ImageData: %d %d ' % im.size)
  275.         fp.write('%d %d 0 1 1 "%s"\n' % operator)
  276.     
  277.     fp.write('gsave\n')
  278.     fp.write('10 dict begin\n')
  279.     fp.write('/buf %d string def\n' % im.size[0] * operator[1])
  280.     fp.write('%d %d scale\n' % im.size)
  281.     fp.write('%d %d 8\n' % im.size)
  282.     fp.write('[%d 0 0 -%d 0 %d]\n' % (im.size[0], im.size[1], im.size[1]))
  283.     fp.write('{ currentfile buf readhexstring pop } bind\n')
  284.     fp.write('%s\n' % operator[2])
  285.     ImageFile._save(im, fp, [
  286.         ('eps', (0, 0) + im.size, 0, None)])
  287.     fp.write('\n%%%%EndBinary\n')
  288.     fp.write('grestore end\n')
  289.     fp.flush()
  290.  
  291. Image.register_open(EpsImageFile.format, EpsImageFile, _accept)
  292. Image.register_save(EpsImageFile.format, _save)
  293. Image.register_extension(EpsImageFile.format, '.ps')
  294. Image.register_extension(EpsImageFile.format, '.eps')
  295. Image.register_mime(EpsImageFile.format, 'application/postscript')
  296.