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 / ImageDraw.py < prev    next >
Text File  |  2001-05-03  |  5KB  |  169 lines

  1. #
  2. # The Python Imaging Library
  3. # $Id$
  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.             self.font = ImageFont.load_path("BDF/courR14.pil")
  62.         return self.font
  63.  
  64.     def textsize(self, text, font=None):
  65.         if font is None:
  66.             font = self.getfont()
  67.         return font.getsize(text)
  68.  
  69.     def _getink(self, ink, fill=None):
  70.         if ink is None and fill is None:
  71.             if self.fill:
  72.                 fill = self.ink
  73.             else:
  74.                 ink = self.ink
  75.         else:
  76.             if ink is not None:
  77.                 ink = self.im.draw_ink(ink)
  78.             if fill is not None:
  79.                 fill = self.im.draw_ink(fill)
  80.         return ink, fill
  81.  
  82.     #
  83.     # primitives
  84.  
  85.     def arc(self, xy, start, end, fill=None):
  86.         ink, fill = self._getink(fill)
  87.         if ink is not None:
  88.             self.im.draw_arc(xy, start, end, ink)
  89.  
  90.     def bitmap(self, xy, bitmap, fill=None):
  91.         bitmap.load()
  92.         ink, fill = self._getink(fill)
  93.         if ink is None:
  94.             ink = fill
  95.         if ink is not None:
  96.             self.im.draw_bitmap(xy, bitmap.im, ink)
  97.  
  98.     def chord(self, xy, start, end, fill=None, outline=None):
  99.         ink, fill = self._getink(outline, fill)
  100.         if fill is not None:
  101.             self.im.draw_chord(xy, start, end, fill, 1)
  102.         if ink is not None:
  103.             self.im.draw_chord(xy, start, end, ink, 0)
  104.  
  105.     def ellipse(self, xy, fill=None, outline=None):
  106.         ink, fill = self._getink(outline, fill)
  107.         if fill is not None:
  108.             self.im.draw_ellipse(xy, fill, 1)
  109.         if ink is not None:
  110.             self.im.draw_ellipse(xy, ink, 0)
  111.  
  112.     def line(self, xy, fill=None):
  113.         ink, fill = self._getink(fill)
  114.         if ink is not None:
  115.             self.im.draw_lines(xy, ink)
  116.  
  117.     def shape(self, shape, fill=None, outline=None):
  118.         # experimental
  119.         shape.close()
  120.         ink, fill = self._getink(outline, fill)
  121.         if fill is not None:
  122.             self.im.draw_outline(shape, fill, 1)
  123.         if ink is not None:
  124.             self.im.draw_outline(shape, ink, 0)
  125.  
  126.     def pieslice(self, xy, start, end, fill=None, outline=None):
  127.         ink, fill = self._getink(outline, fill)
  128.         if fill is not None:
  129.             self.im.draw_pieslice(xy, start, end, fill, 1)
  130.         if ink is not None:
  131.             self.im.draw_pieslice(xy, start, end, ink, 0)
  132.  
  133.     def point(self, xy, fill=None):
  134.         ink, fill = self._getink(fill)
  135.         if ink is not None:
  136.             self.im.draw_points(xy, ink)
  137.  
  138.     def polygon(self, xy, fill=None, outline=None):
  139.         ink, fill = self._getink(outline, fill)
  140.         if fill is not None:
  141.             self.im.draw_polygon(xy, fill, 1)
  142.         if ink is not None:
  143.             self.im.draw_polygon(xy, ink, 0)
  144.  
  145.     def rectangle(self, xy, fill=None, outline=None):
  146.         ink, fill = self._getink(outline, fill)
  147.         if fill is not None:
  148.             self.im.draw_rectangle(xy, fill, 1)
  149.         if ink is not None:
  150.             self.im.draw_rectangle(xy, ink, 0)
  151.  
  152.     def text(self, xy, text, fill=None, font=None, anchor=None):
  153.         ink, fill = self._getink(fill)
  154.         if font is None:
  155.             font = self.getfont()
  156.         if ink is None:
  157.             ink = fill
  158.         if ink is not None:
  159.             self.im.draw_bitmap(xy, font.getmask(text), ink)
  160.  
  161. # backwards compatibility
  162. ImageDraw = Draw
  163.  
  164. # experimental access to the outline API
  165. try:
  166.     Outline = Image.core.outline
  167. except:
  168.     Outline = None
  169.