home *** CD-ROM | disk | FTP | other *** search
/ Enter 2004 April / enter-2004-04.iso / files / EVE_1424_100181.exe / ImageDraw.py < prev    next >
Encoding:
Python Source  |  2004-04-20  |  5.0 KB  |  170 lines

  1. #
  2. # The Python Imaging Library
  3. # $Id: //modules/pil/PIL/ImageDraw.py#2 $
  4. #
  5. # drawing interface operations
  6. #
  7. # History:
  8. # 1996-04-13 fl   Created (experimental)
  9. # 1996-08-07 fl   Filled polygons, ellipses.
  10. # 1996-08-13 fl   Added text support
  11. # 1998-06-28 fl   Handle I and F images
  12. # 1998-12-29 fl   Added arc; use arc primitive to draw ellipses
  13. # 1999-01-10 fl   Added shape stuff (experimental)
  14. # 1999-02-06 fl   Added bitmap support
  15. # 1999-02-11 fl   Changed all primitives to take options
  16. # 1999-02-20 fl   Fixed backwards compatibility
  17. # 2000-10-12 fl   Copy on write, when necessary
  18. # 2001-02-18 fl   Use default ink for bitmap/text also in fill mode
  19. #
  20. # Copyright (c) 1997-2001 by Secret Labs AB
  21. # Copyright (c) 1996-2001 by Fredrik Lundh
  22. #
  23. # See the README file for information on usage and redistribution.
  24. #
  25.  
  26. import Image
  27.  
  28. class Draw:
  29.  
  30.     def __init__(self, im):
  31.         im.load()
  32.         if im.readonly:
  33.             im._copy() # make it writable
  34.         self.im = im.im
  35.         if im.mode in ("I", "F"):
  36.             self.ink = self.im.draw_ink(1)
  37.         else:
  38.             self.ink = self.im.draw_ink(-1)
  39.         self.fill = 0
  40.         self.font = None
  41.  
  42.     #
  43.     # attributes
  44.  
  45.     def setink(self, ink):
  46.         # compatibility
  47.         self.ink = self.im.draw_ink(ink)
  48.  
  49.     def setfill(self, onoff):
  50.         # compatibility
  51.         self.fill = onoff
  52.  
  53.     def setfont(self, font):
  54.         # compatibility
  55.         self.font = font
  56.  
  57.     def getfont(self):
  58.         if not self.font:
  59.             # FIXME: should add a font repository
  60.             import ImageFont
  61.             import blue
  62.             self.font = ImageFont.load(blue.os.stdlibpath+"PIL/BDF/courB08.pil")
  63.         return self.font
  64.  
  65.     def textsize(self, text, font=None):
  66.         if font is None:
  67.             font = self.getfont()
  68.         return font.getsize(text)
  69.  
  70.     def _getink(self, ink, fill=None):
  71.         if ink is None and fill is None:
  72.             if self.fill:
  73.                 fill = self.ink
  74.             else:
  75.                 ink = self.ink
  76.         else:
  77.             if ink is not None:
  78.                 ink = self.im.draw_ink(ink)
  79.             if fill is not None:
  80.                 fill = self.im.draw_ink(fill)
  81.         return ink, fill
  82.  
  83.     #
  84.     # primitives
  85.  
  86.     def arc(self, xy, start, end, fill=None):
  87.         ink, fill = self._getink(fill)
  88.         if ink is not None:
  89.             self.im.draw_arc(xy, start, end, ink)
  90.  
  91.     def bitmap(self, xy, bitmap, fill=None):
  92.         bitmap.load()
  93.         ink, fill = self._getink(fill)
  94.         if ink is None:
  95.             ink = fill
  96.         if ink is not None:
  97.             self.im.draw_bitmap(xy, bitmap.im, ink)
  98.  
  99.     def chord(self, xy, start, end, fill=None, outline=None):
  100.         ink, fill = self._getink(outline, fill)
  101.         if fill is not None:
  102.             self.im.draw_chord(xy, start, end, fill, 1)
  103.         if ink is not None:
  104.             self.im.draw_chord(xy, start, end, ink, 0)
  105.  
  106.     def ellipse(self, xy, fill=None, outline=None):
  107.         ink, fill = self._getink(outline, fill)
  108.         if fill is not None:
  109.             self.im.draw_ellipse(xy, fill, 1)
  110.         if ink is not None:
  111.             self.im.draw_ellipse(xy, ink, 0)
  112.  
  113.     def line(self, xy, fill=None):
  114.         ink, fill = self._getink(fill)
  115.         if ink is not None:
  116.             self.im.draw_lines(xy, ink)
  117.  
  118.     def shape(self, shape, fill=None, outline=None):
  119.         # experimental
  120.         shape.close()
  121.         ink, fill = self._getink(outline, fill)
  122.         if fill is not None:
  123.             self.im.draw_outline(shape, fill, 1)
  124.         if ink is not None:
  125.             self.im.draw_outline(shape, ink, 0)
  126.  
  127.     def pieslice(self, xy, start, end, fill=None, outline=None):
  128.         ink, fill = self._getink(outline, fill)
  129.         if fill is not None:
  130.             self.im.draw_pieslice(xy, start, end, fill, 1)
  131.         if ink is not None:
  132.             self.im.draw_pieslice(xy, start, end, ink, 0)
  133.  
  134.     def point(self, xy, fill=None):
  135.         ink, fill = self._getink(fill)
  136.         if ink is not None:
  137.             self.im.draw_points(xy, ink)
  138.  
  139.     def polygon(self, xy, fill=None, outline=None):
  140.         ink, fill = self._getink(outline, fill)
  141.         if fill is not None:
  142.             self.im.draw_polygon(xy, fill, 1)
  143.         if ink is not None:
  144.             self.im.draw_polygon(xy, ink, 0)
  145.  
  146.     def rectangle(self, xy, fill=None, outline=None):
  147.         ink, fill = self._getink(outline, fill)
  148.         if fill is not None:
  149.             self.im.draw_rectangle(xy, fill, 1)
  150.         if ink is not None:
  151.             self.im.draw_rectangle(xy, ink, 0)
  152.  
  153.     def text(self, xy, text, fill=None, font=None, anchor=None):
  154.         ink, fill = self._getink(fill)
  155.         if font is None:
  156.             font = self.getfont()
  157.         if ink is None:
  158.             ink = fill
  159.         if ink is not None:
  160.             self.im.draw_bitmap(xy, font.getmask(text), ink)
  161.  
  162. # backwards compatibility
  163. ImageDraw = Draw
  164.  
  165. # experimental access to the outline API
  166. try:
  167.     Outline = Image.core.outline
  168. except:
  169.     Outline = None
  170.