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 / PSDraw.py < prev    next >
Text File  |  2001-05-03  |  6KB  |  196 lines

  1. #
  2. # The Python Imaging Library
  3. # $Id$
  4. #
  5. # simple postscript graphics interface
  6. #
  7. # History:
  8. # 96-04-20 fl   Created
  9. # 99-01-10 fl   Added gsave/grestore to image method
  10. #
  11. # Copyright (c) Secret Labs AB 1997-99.
  12. # Copyright (c) Fredrik Lundh 1996.
  13. #
  14. # See the README file for information on usage and redistribution.
  15. #
  16.  
  17. import EpsImagePlugin
  18. import string
  19.  
  20. class PSDraw:
  21.     def __init__(self, fp = None):
  22.         if not fp:
  23.             import sys
  24.             fp = sys.stdout
  25.         self.fp = fp
  26.  
  27.     def begin_document(self, id = None):
  28.         "Write Postscript DSC header"
  29.         # FIXME: incomplete
  30.         self.fp.write("%!PS-Adobe-3.0\n"
  31.                       "save\n"
  32.                       "/showpage { } def\n"
  33.                       "%%EndComments\n"
  34.                       "%%BeginDocument\n")
  35.         #self.fp.write(ERROR_PS) # debugging!
  36.         self.fp.write(EDROFF_PS)
  37.         self.fp.write(VDI_PS)
  38.         self.fp.write("%%EndProlog\n")
  39.         self.isofont = {}
  40.  
  41.     def end_document(self):
  42.         "Write Postscript DSC footer"
  43.         self.fp.write("%%EndDocument\n"
  44.                       "restore showpage\n"
  45.                       "%%End\n")
  46.         if hasattr(self.fp, "flush"):
  47.             self.fp.flush()
  48.  
  49.     def setfont(self, font, size):
  50.         if not self.isofont.has_key(font):
  51.             # reencode font
  52.             self.fp.write("/PSDraw-%s ISOLatin1Encoding /%s E\n" %\
  53.                           (font, font))
  54.             self.isofont[font] = 1
  55.         # rough
  56.         self.fp.write("/F0 %d /PSDraw-%s F\n" % (size, font))
  57.  
  58.     def setink(self, ink):
  59.         print "*** NOT YET IMPLEMENTED ***"
  60.  
  61.     def line(self, xy0, xy1):
  62.         xy = xy0 + xy1
  63.         self.fp.write("%d %d %d %d Vl\n" % xy)
  64.  
  65.     def rectangle(self, box):
  66.         self.fp.write("%d %d M %d %d 0 Vr\n" % box)
  67.  
  68.     def text(self, xy, text):
  69.         text = string.joinfields(string.splitfields(text, "("), "\\(")
  70.         text = string.joinfields(string.splitfields(text, ")"), "\\)")
  71.         xy = xy + (text,)
  72.         self.fp.write("%d %d M (%s) S\n" % xy)
  73.  
  74.     def image(self, box, im, dpi = None):
  75.         "Write an PIL image"
  76.         # default resolution depends on mode
  77.         if not dpi:
  78.             if im.mode == "1":
  79.                 dpi = 200 # fax
  80.             else:
  81.                 dpi = 100 # greyscale
  82.         # image size (on paper)
  83.         x = float(im.size[0] * 72) / dpi
  84.         y = float(im.size[1] * 72) / dpi
  85.         # max allowed size
  86.         xmax = box[2] - box[0]
  87.         ymax = box[3] - box[1]
  88.         if x > xmax:
  89.             y = y * xmax / x; x = xmax
  90.         if y > ymax:
  91.             x = x * ymax / y; y = ymax
  92.         dx = (xmax - x) / 2 + box[0]
  93.         dy = (ymax - y) / 2 + box[1]
  94.         self.fp.write("gsize\n%f %f translate\n" % (dx, dy))
  95.         if (x, y) != im.size:
  96.             # EpsImagePlugin._save prints the image at (0,0,xsize,ysize)
  97.             sx = x / im.size[0]
  98.             sy = y / im.size[1]
  99.             self.fp.write("%f %f scale\n" % (sx, sy))
  100.         EpsImagePlugin._save(im, self.fp, None, 0)
  101.         self.fp.write("\ngrestore\n")
  102.  
  103. # --------------------------------------------------------------------
  104. # Postscript driver
  105.  
  106. #
  107. # EDROFF.PS -- Postscript driver for Edroff 2
  108. #
  109. # History:
  110. # 94-01-25 fl: created (edroff 2.04)
  111. #
  112. # Copyright (c) Fredrik Lundh 1994.
  113. #
  114.  
  115. EDROFF_PS = """\
  116. /S { show } bind def
  117. /P { moveto show } bind def 
  118. /M { moveto } bind def 
  119. /X { 0 rmoveto } bind def 
  120. /Y { 0 exch rmoveto } bind def 
  121. /E {    findfont
  122.         dup maxlength dict begin
  123.         {
  124.                 1 index /FID ne { def } { pop pop } ifelse
  125.         } forall
  126.         /Encoding exch def
  127.         dup /FontName exch def
  128.         currentdict end definefont pop
  129. } bind def
  130. /F {    findfont exch scalefont dup setfont
  131.         [ exch /setfont cvx ] cvx bind def
  132. } bind def
  133. """
  134.  
  135. #
  136. # VDI.PS -- Postscript driver for VDI meta commands
  137. #
  138. # History:
  139. # 94-01-25 fl: created (edroff 2.04)
  140. #
  141. # Copyright (c) Fredrik Lundh 1994.
  142. #
  143.  
  144. VDI_PS = """\
  145. /Vm { moveto } bind def
  146. /Va { newpath arcn stroke } bind def
  147. /Vl { moveto lineto stroke } bind def
  148. /Vc { newpath 0 360 arc closepath } bind def
  149. /Vr {   exch dup 0 rlineto
  150.         exch dup neg 0 exch rlineto
  151.         exch neg 0 rlineto
  152.         0 exch rlineto
  153.         100 div setgray fill 0 setgray } bind def
  154. /Tm matrix def
  155. /Ve {   Tm currentmatrix pop
  156.         translate scale newpath 0 0 .5 0 360 arc closepath
  157.         Tm setmatrix
  158. } bind def
  159. /Vf { currentgray exch setgray fill setgray } bind def
  160. """
  161.  
  162. #
  163. # ERROR.PS -- Error handler
  164. #
  165. # History:
  166. # 89-11-21 fl: created (pslist 1.10)
  167. #
  168.  
  169. ERROR_PS = """\
  170. /landscape false def
  171. /errorBUF 200 string def
  172. /errorNL { currentpoint 10 sub exch pop 72 exch moveto } def
  173. errordict begin /handleerror {
  174.     initmatrix /Courier findfont 10 scalefont setfont
  175.     newpath 72 720 moveto $error begin /newerror false def
  176.     (PostScript Error) show errorNL errorNL
  177.     (Error: ) show
  178.         /errorname load errorBUF cvs show errorNL errorNL
  179.     (Command: ) show
  180.         /command load dup type /stringtype ne { errorBUF cvs } if show
  181.         errorNL errorNL
  182.     (VMstatus: ) show
  183.         vmstatus errorBUF cvs show ( bytes available, ) show 
  184.         errorBUF cvs show ( bytes used at level ) show
  185.         errorBUF cvs show errorNL errorNL
  186.     (Operand stargck: ) show errorNL /ostargck load { 
  187.         dup type /stringtype ne { errorBUF cvs } if 72 0 rmoveto show errorNL
  188.     } forall errorNL
  189.     (Execution stargck: ) show errorNL /estargck load {
  190.         dup type /stringtype ne { errorBUF cvs } if 72 0 rmoveto show errorNL
  191.     } forall
  192.     end showpage
  193. } def end
  194. """
  195.  
  196.