Revision: 7417
          http://matplotlib.svn.sourceforge.net/matplotlib/?rev=7417&view=rev
Author:   mdboom
Date:     2009-08-07 17:02:28 +0000 (Fri, 07 Aug 2009)

Log Message:
-----------
Refactor some backend methods for consistency and to reduce explosion of the 
number of arguments.  A first crack at Gouraud shading in the Agg backend (not 
hooked up to anything).

Modified Paths:
--------------
    trunk/matplotlib/CHANGELOG
    trunk/matplotlib/doc/api/api_changes.rst
    trunk/matplotlib/examples/pylab_examples/quadmesh_demo.py
    trunk/matplotlib/lib/matplotlib/axes.py
    trunk/matplotlib/lib/matplotlib/backend_bases.py
    trunk/matplotlib/lib/matplotlib/backends/backend_agg.py
    trunk/matplotlib/lib/matplotlib/backends/backend_cairo.py
    trunk/matplotlib/lib/matplotlib/backends/backend_gdk.py
    trunk/matplotlib/lib/matplotlib/backends/backend_macosx.py
    trunk/matplotlib/lib/matplotlib/backends/backend_mixed.py
    trunk/matplotlib/lib/matplotlib/backends/backend_pdf.py
    trunk/matplotlib/lib/matplotlib/backends/backend_ps.py
    trunk/matplotlib/lib/matplotlib/backends/backend_svg.py
    trunk/matplotlib/lib/matplotlib/backends/backend_template.py
    trunk/matplotlib/lib/matplotlib/backends/backend_wx.py
    trunk/matplotlib/lib/matplotlib/collections.py
    trunk/matplotlib/lib/matplotlib/figure.py
    trunk/matplotlib/lib/matplotlib/font_manager.py
    trunk/matplotlib/lib/matplotlib/image.py
    trunk/matplotlib/src/_backend_agg.cpp
    trunk/matplotlib/src/_backend_agg.h

Modified: trunk/matplotlib/CHANGELOG
===================================================================
--- trunk/matplotlib/CHANGELOG  2009-08-07 15:40:56 UTC (rev 7416)
+++ trunk/matplotlib/CHANGELOG  2009-08-07 17:02:28 UTC (rev 7417)
@@ -1,3 +1,41 @@
+2009-08-07 In an effort to simplify the backend API, all clipping rectangles
+           and paths are now passed in using GraphicsContext objects, even
+           on collections and images.  Therefore:
+
+             draw_path_collection(self, master_transform, cliprect, clippath,
+                                  clippath_trans, paths, all_transforms, 
offsets,
+                                  offsetTrans, facecolors, edgecolors, 
linewidths,
+                                  linestyles, antialiaseds, urls)
+
+                                             becomes:
+
+             draw_path_collection(self, gc, master_transform, paths, 
all_transforms,
+                                  offsets, offsetTrans, facecolors, edgecolors,
+                                  linewidths, linestyles, antialiaseds, urls)
+
+
+
+             draw_quad_mesh(self, master_transform, cliprect, clippath,
+                            clippath_trans, meshWidth, meshHeight, coordinates,
+                            offsets, offsetTrans, facecolors, antialiased,
+                            showedges)
+
+                                             becomes:
+
+             draw_quad_mesh(self, gc, master_transform, meshWidth, meshHeight,
+                            coordinates, offsets, offsetTrans, facecolors,
+                            antialiased, showedges)
+
+
+
+             draw_image(self, x, y, im, bbox, clippath=None, 
clippath_trans=None)
+
+                                             becomes:
+
+             draw_image(self, gc, x, y, im)
+
+           - MGD
+
 2009-08-06 Tagging the 0.99.0 release at svn r7397 - JDH
 
           * fixed an alpha colormapping bug posted on sf 2832575
@@ -30,7 +68,6 @@
 
           * apply sf patches 2830233 and 2823885 for osx setup and 64 bit;  
thanks Michiel
 
-
 2009-08-04 Made cbook.get_sample_data make use of the ETag and Last-Modified
            headers of mod_dav_svn. - JKS
 

Modified: trunk/matplotlib/doc/api/api_changes.rst
===================================================================
--- trunk/matplotlib/doc/api/api_changes.rst    2009-08-07 15:40:56 UTC (rev 
7416)
+++ trunk/matplotlib/doc/api/api_changes.rst    2009-08-07 17:02:28 UTC (rev 
7417)
@@ -18,6 +18,43 @@
 .. _configobj: http://www.voidspace.org.uk/python/configobj.html
 .. _`enthought.traits`: http://code.enthought.com/projects/traits
 
+Changes beyond 0.99.x
+=====================
+
+In an effort to simplify the backend API, all clipping rectangles
+and paths are now passed in using GraphicsContext objects, even
+on collections and images.  Therefore::
+
+  draw_path_collection(self, master_transform, cliprect, clippath,
+                       clippath_trans, paths, all_transforms, offsets,
+                       offsetTrans, facecolors, edgecolors, linewidths,
+                       linestyles, antialiaseds, urls)
+
+  # is now
+
+  draw_path_collection(self, gc, master_transform, paths, all_transforms,
+                       offsets, offsetTrans, facecolors, edgecolors,
+                       linewidths, linestyles, antialiaseds, urls)
+
+
+  draw_quad_mesh(self, master_transform, cliprect, clippath,
+                 clippath_trans, meshWidth, meshHeight, coordinates,
+                 offsets, offsetTrans, facecolors, antialiased,
+                 showedges)
+
+  # is now
+
+  draw_quad_mesh(self, gc, master_transform, meshWidth, meshHeight,
+                 coordinates, offsets, offsetTrans, facecolors,
+                 antialiased, showedges)
+
+
+  draw_image(self, x, y, im, bbox, clippath=None, clippath_trans=None)
+
+  # is now
+
+  draw_image(self, gc, x, y, im)
+
 Changes in 0.99
 ======================
 

Modified: trunk/matplotlib/examples/pylab_examples/quadmesh_demo.py
===================================================================
--- trunk/matplotlib/examples/pylab_examples/quadmesh_demo.py   2009-08-07 
15:40:56 UTC (rev 7416)
+++ trunk/matplotlib/examples/pylab_examples/quadmesh_demo.py   2009-08-07 
17:02:28 UTC (rev 7417)
@@ -11,7 +11,7 @@
 from matplotlib import cm, colors
 from numpy import ma
 
-n = 56
+n = 12
 x = np.linspace(-1.5,1.5,n)
 y = np.linspace(-1.5,1.5,n*2)
 X,Y = np.meshgrid(x,y);

Modified: trunk/matplotlib/lib/matplotlib/axes.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/axes.py     2009-08-07 15:40:56 UTC (rev 
7416)
+++ trunk/matplotlib/lib/matplotlib/axes.py     2009-08-07 17:02:28 UTC (rev 
7417)
@@ -1705,12 +1705,14 @@
             l, b, w, h = self.bbox.bounds
             # composite images need special args so they will not
             # respect z-order for now
-            renderer.draw_image(
-                round(l), round(b), im, self.bbox,
-                self.patch.get_path(),
-                self.patch.get_transform())
 
+            gc = renderer.new_gc()
+            gc.set_clip_rectangle(self.bbox)
+            gc.set_clip_path(mtransforms.TransformedPath(
+                    self.patch.get_path(),
+                    self.patch.get_transform()))
 
+            renderer.draw_image(gc, round(l), round(b), im)
 
         if dsu_rasterized:
             for zorder, i, a in dsu_rasterized:

Modified: trunk/matplotlib/lib/matplotlib/backend_bases.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/backend_bases.py    2009-08-07 15:40:56 UTC 
(rev 7416)
+++ trunk/matplotlib/lib/matplotlib/backend_bases.py    2009-08-07 17:02:28 UTC 
(rev 7417)
@@ -108,24 +108,23 @@
                                marker_trans + 
transforms.Affine2D().translate(x, y),
                                rgbFace)
 
-    def draw_path_collection(self, master_transform, cliprect, clippath,
-                             clippath_trans, paths, all_transforms, offsets,
-                             offsetTrans, facecolors, edgecolors, linewidths,
-                             linestyles, antialiaseds, urls):
+    def draw_path_collection(self, gc, master_transform, paths, all_transforms,
+                             offsets, offsetTrans, facecolors, edgecolors,
+                             linewidths, linestyles, antialiaseds, urls):
         """
-        Draws a collection of paths, selecting drawing properties from
+        Draws a collection of paths selecting drawing properties from
         the lists *facecolors*, *edgecolors*, *linewidths*,
         *linestyles* and *antialiaseds*. *offsets* is a list of
         offsets to apply to each of the paths.  The offsets in
-        *offsets* are first transformed by *offsetTrans* before
-        being applied.
+        *offsets* are first transformed by *offsetTrans* before being
+        applied.
 
         This provides a fallback implementation of
         :meth:`draw_path_collection` that makes multiple calls to
-        draw_path.  Some backends may want to override this in order
-        to render each set of path data only once, and then reference
-        that path multiple times with the different offsets, colors,
-        styles etc.  The generator methods
+        :meth:`draw_path`.  Some backends may want to override this in
+        order to render each set of path data only once, and then
+        reference that path multiple times with the different offsets,
+        colors, styles etc.  The generator methods
         :meth:`_iter_collection_raw_paths` and
         :meth:`_iter_collection` are provided to help with (and
         standardize) the implementation across backends.  It is highly
@@ -137,18 +136,16 @@
             master_transform, paths, all_transforms):
             path_ids.append((path, transform))
 
-        for xo, yo, path_id, gc, rgbFace in self._iter_collection(
-            path_ids, cliprect, clippath, clippath_trans,
-            offsets, offsetTrans, facecolors, edgecolors,
+        for xo, yo, path_id, gc0, rgbFace in self._iter_collection(
+            gc, path_ids, offsets, offsetTrans, facecolors, edgecolors,
             linewidths, linestyles, antialiaseds, urls):
             path, transform = path_id
             transform = 
transforms.Affine2D(transform.get_matrix()).translate(xo, yo)
-            self.draw_path(gc, path, transform, rgbFace)
+            self.draw_path(gc0, path, transform, rgbFace)
 
-    def draw_quad_mesh(self, master_transform, cliprect, clippath,
-                       clippath_trans, meshWidth, meshHeight, coordinates,
-                       offsets, offsetTrans, facecolors, antialiased,
-                       showedges):
+    def draw_quad_mesh(self, gc, master_transform, meshWidth, meshHeight,
+                       coordinates, offsets, offsetTrans, facecolors,
+                       antialiased, showedges):
         """
         This provides a fallback implementation of
         :meth:`draw_quad_mesh` that generates paths and then calls
@@ -166,11 +163,11 @@
             linewidths = np.array([0.0], np.float_)
 
         return self.draw_path_collection(
-            master_transform, cliprect, clippath, clippath_trans,
-            paths, [], offsets, offsetTrans, facecolors, edgecolors,
-            linewidths, [], [antialiased], [None])
+            gc, master_transform, paths, [], offsets, offsetTrans, facecolors,
+            edgecolors, linewidths, [], [antialiased], [None])
 
-    def _iter_collection_raw_paths(self, master_transform, paths, 
all_transforms):
+    def _iter_collection_raw_paths(self, master_transform, paths,
+                                   all_transforms):
         """
         This is a helper method (along with :meth:`_iter_collection`) to make
         it easier to write a space-efficent :meth:`draw_path_collection`
@@ -200,9 +197,9 @@
                 transform = all_transforms[i % Ntransforms]
             yield path, transform + master_transform
 
-    def _iter_collection(self, path_ids, cliprect, clippath, clippath_trans,
-                         offsets, offsetTrans, facecolors, edgecolors,
-                         linewidths, linestyles, antialiaseds, urls):
+    def _iter_collection(self, gc, path_ids, offsets, offsetTrans, facecolors,
+                         edgecolors, linewidths, linestyles, antialiaseds,
+                         urls):
         """
         This is a helper method (along with
         :meth:`_iter_collection_raw_paths`) to make it easier to write
@@ -243,18 +240,14 @@
         if Noffsets:
             toffsets = offsetTrans.transform(offsets)
 
-        gc = self.new_gc()
+        gc0 = self.new_gc()
+        gc0.copy_properties(gc)
 
-        gc.set_clip_rectangle(cliprect)
-        if clippath is not None:
-            clippath = transforms.TransformedPath(clippath, clippath_trans)
-            gc.set_clip_path(clippath)
-
         if Nfacecolors == 0:
             rgbFace = None
 
         if Nedgecolors == 0:
-            gc.set_linewidth(0.0)
+            gc0.set_linewidth(0.0)
 
         xo, yo = 0, 0
         for i in xrange(N):
@@ -264,20 +257,20 @@
             if Nfacecolors:
                 rgbFace = facecolors[i % Nfacecolors]
             if Nedgecolors:
-                gc.set_foreground(edgecolors[i % Nedgecolors])
+                gc0.set_foreground(edgecolors[i % Nedgecolors])
                 if Nlinewidths:
-                    gc.set_linewidth(linewidths[i % Nlinewidths])
+                    gc0.set_linewidth(linewidths[i % Nlinewidths])
                 if Nlinestyles:
-                    gc.set_dashes(*linestyles[i % Nlinestyles])
+                    gc0.set_dashes(*linestyles[i % Nlinestyles])
             if rgbFace is not None and len(rgbFace)==4:
-                gc.set_alpha(rgbFace[-1])
+                gc0.set_alpha(rgbFace[-1])
                 rgbFace = rgbFace[:3]
-            gc.set_antialiased(antialiaseds[i % Naa])
+            gc0.set_antialiased(antialiaseds[i % Naa])
             if Nurls:
-                gc.set_url(urls[i % Nurls])
+                gc0.set_url(urls[i % Nurls])
 
-            yield xo, yo, path_id, gc, rgbFace
-        gc.restore()
+            yield xo, yo, path_id, gc0, rgbFace
+        gc0.restore()
 
     def get_image_magnification(self):
         """
@@ -287,10 +280,13 @@
         """
         return 1.0
 
-    def draw_image(self, x, y, im, bbox, clippath=None, clippath_trans=None):
+    def draw_image(self, gc, x, y, im):
         """
         Draw the image instance into the current axes;
 
+        *gc*
+            a GraphicsContext containing clipping information
+
         *x*
             is the distance in pixels from the left hand side of the canvas.
 
@@ -301,11 +297,6 @@
 
         *im*
             the :class:`matplotlib._image.Image` instance
-
-        *bbox*
-            a :class:`matplotlib.transforms.Bbox` instance for clipping, or
-            None
-
         """
         raise NotImplementedError
 

Modified: trunk/matplotlib/lib/matplotlib/backends/backend_agg.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/backends/backend_agg.py     2009-08-07 
15:40:56 UTC (rev 7416)
+++ trunk/matplotlib/lib/matplotlib/backends/backend_agg.py     2009-08-07 
17:02:28 UTC (rev 7417)
@@ -250,7 +250,7 @@
         >>> x1, y1, x2, y2 = region.get_extents()
         >>> renderer.restore_region(region, bbox=(x1+dx, y1, x2, y2),
                                     xy=(x1-dx, y1))
-        
+
         """
         if bbox is not None or xy is not None:
             if bbox is None:

Modified: trunk/matplotlib/lib/matplotlib/backends/backend_cairo.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/backends/backend_cairo.py   2009-08-07 
15:40:56 UTC (rev 7416)
+++ trunk/matplotlib/lib/matplotlib/backends/backend_cairo.py   2009-08-07 
17:02:28 UTC (rev 7417)
@@ -151,10 +151,12 @@
 
         self._fill_and_stroke(ctx, rgbFace, gc.get_alpha())
 
-    def draw_image(self, x, y, im, bbox, clippath=None, clippath_trans=None):
+    def draw_image(self, gc, x, y, im):
         # bbox - not currently used
         if _debug: print '%s.%s()' % (self.__class__.__name__, _fn_name())
 
+        clippath, clippath_trans = gc.get_clip_path()
+
         im.flipud_out()
 
         rows, cols, buf = im.color_conv (BYTE_FORMAT)

Modified: trunk/matplotlib/lib/matplotlib/backends/backend_gdk.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/backends/backend_gdk.py     2009-08-07 
15:40:56 UTC (rev 7416)
+++ trunk/matplotlib/lib/matplotlib/backends/backend_gdk.py     2009-08-07 
17:02:28 UTC (rev 7417)
@@ -97,7 +97,9 @@
             if gc.gdkGC.line_width > 0:
                 self.gdkDrawable.draw_lines(gc.gdkGC, polygon)
 
-    def draw_image(self, x, y, im, bbox, clippath=None, clippath_trans=None):
+    def draw_image(self, gc, x, y, im):
+        bbox = gc.get_clip_rectangle()
+
         if bbox != None:
             l,b,w,h = bbox.bounds
             #rectangle = (int(l), self.height-int(b+h),

Modified: trunk/matplotlib/lib/matplotlib/backends/backend_macosx.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/backends/backend_macosx.py  2009-08-07 
15:40:56 UTC (rev 7416)
+++ trunk/matplotlib/lib/matplotlib/backends/backend_macosx.py  2009-08-07 
17:02:28 UTC (rev 7417)
@@ -59,12 +59,19 @@
         gc.draw_markers(marker_path, marker_trans, path, trans, rgbFace)
 
     def draw_path_collection(self, *args):
-        gc = self.gc
-        args = args[:13]
+        # TODO: We should change this in the C code eventually, but this
+        # re-ordering of arguments should work for now
+        gc = args[0]
+        args = tuple([gc, args[1], gc.get_clip_rectangle()] + \
+            list(gc.get_clip_path()) + list(args[2:]))
         gc.draw_path_collection(*args)
 
     def draw_quad_mesh(self, *args):
-        gc = self.gc
+        # TODO: We should change this in the C code eventually, but this
+        # re-ordering of arguments should work for now
+        gc = args[0]
+        args = [gc, args[1], gc.get_clip_rectangle()] + \
+            list(gc.get_clip_path()) + list(args[2:])
         gc.draw_quad_mesh(*args)
 
     def new_gc(self):
@@ -72,12 +79,15 @@
         self.gc.set_hatch(None)
         return self.gc
 
-    def draw_image(self, x, y, im, bbox, clippath=None, clippath_trans=None):
+    def draw_image(self, gc, x, y, im):
+        # TODO: We should change this in the C code eventually, but this
+        # re-ordering of arguments should work for now
         im.flipud_out()
         nrows, ncols, data = im.as_rgba_str()
-        self.gc.draw_image(x, y, nrows, ncols, data, bbox, clippath, 
clippath_trans)
+        gc.draw_image(x, y, nrows, ncols, data, gc.get_clip_rectangle(),
+                      *gc.get_clip_path())
         im.flipud_out()
-    
+
     def draw_tex(self, gc, x, y, s, prop, angle):
         # todo, handle props, angle, origins
         size = prop.get_size_in_points()
@@ -128,7 +138,7 @@
 
     def flipy(self):
         return False
-    
+
     def points_to_pixels(self, points):
         return points/72.0 * self.dpi
 
@@ -168,7 +178,7 @@
         _macosx.GraphicsContext.set_clip_path(self, path)
 
 ########################################################################
-#    
+#
 # The following functions and classes are for pylab and implement
 # window/figure managers, etc...
 #
@@ -281,7 +291,7 @@
             self.toolbar = NavigationToolbar2Mac(canvas)
         else:
             self.toolbar = None
-        if self.toolbar is not None: 
+        if self.toolbar is not None:
             self.toolbar.update()
 
         def notify_axes_change(fig):
@@ -300,7 +310,7 @@
         Gcf.destroy(self.num)
 
 class NavigationToolbarMac(_macosx.NavigationToolbar):
- 
+
     def __init__(self, canvas):
         self.canvas = canvas
         basedir = os.path.join(matplotlib.rcParams['datapath'], "images")
@@ -331,7 +341,7 @@
         assert magic=="P6"
         assert len(imagedata)==width*height*3 # 3 colors in RGB
         return (width, height, imagedata)
-        
+
     def panx(self, direction):
         axes = self.canvas.figure.axes
         selected = self.get_active()
@@ -401,9 +411,9 @@
         _macosx.NavigationToolbar2.set_message(self, message.encode('utf-8'))
 
 ########################################################################
-#    
+#
 # Now just provide the standard names that backend.__init__ is expecting
-# 
+#
 ########################################################################
 
 

Modified: trunk/matplotlib/lib/matplotlib/backends/backend_mixed.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/backends/backend_mixed.py   2009-08-07 
15:40:56 UTC (rev 7416)
+++ trunk/matplotlib/lib/matplotlib/backends/backend_mixed.py   2009-08-07 
17:02:28 UTC (rev 7417)
@@ -14,7 +14,7 @@
                  raster_renderer_class=None,
                  bbox_inches_restore=None):
         """
-        figure: The figure instance. 
+        figure: The figure instance.
 
         width: The width of the canvas in logical units
 
@@ -49,7 +49,7 @@
         self.figure=figure
 
         self._bbox_inches_restore = bbox_inches_restore
-        
+
         self._set_current_renderer(vector_renderer)
 
     _methods = """
@@ -88,8 +88,8 @@
                                                mode="png")
 
             self._bbox_inches_restore = r
-            
-        
+
+
         if self._rasterizing == 0:
             self._raster_renderer = self._raster_renderer_class(
                 self._width*self.dpi, self._height*self.dpi, self.dpi)
@@ -117,9 +117,12 @@
                 image = frombuffer(buffer, w, h, True)
                 image.is_grayscale = False
                 image.flipud_out()
-                self._renderer.draw_image(int(float(l)/self.dpi*72.),
-                                          int((float(height) - b - 
h)/self.dpi*72.),
-                                          image, None)
+                gc = self._renderer.new_gc()
+                self._renderer.draw_image(
+                    gc,
+                    int(float(l)/self.dpi*72.),
+                    int((float(height) - b - h)/self.dpi*72.),
+                    image)
             self._raster_renderer = None
             self._rasterizing = False
 

Modified: trunk/matplotlib/lib/matplotlib/backends/backend_pdf.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/backends/backend_pdf.py     2009-08-07 
15:40:56 UTC (rev 7416)
+++ trunk/matplotlib/lib/matplotlib/backends/backend_pdf.py     2009-08-07 
17:02:28 UTC (rev 7417)
@@ -1286,13 +1286,7 @@
     def get_image_magnification(self):
         return self.image_dpi/72.0
 
-    def draw_image(self, x, y, im, bbox, clippath=None, clippath_trans=None):
-        gc = self.new_gc()
-        if bbox is not None:
-            gc.set_clip_rectangle(bbox)
-        if clippath is not None:
-            clippath = TransformedPath(clippath, clippath_trans)
-            gc.set_clip_path(clippath)
+    def draw_image(self, gc, x, y, im):
         self.check_gc(gc)
 
         h, w = im.get_size_out()

Modified: trunk/matplotlib/lib/matplotlib/backends/backend_ps.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/backends/backend_ps.py      2009-08-07 
15:40:56 UTC (rev 7416)
+++ trunk/matplotlib/lib/matplotlib/backends/backend_ps.py      2009-08-07 
17:02:28 UTC (rev 7417)
@@ -374,7 +374,7 @@
         """
         return self.image_magnification
 
-    def draw_image(self, x, y, im, bbox, clippath=None, clippath_trans=None):
+    def draw_image(self, gc, x, y, im):
         """
         Draw the Image instance into the current axes; x is the
         distance in pixels from the left hand side of the canvas and y
@@ -400,6 +400,9 @@
         figh = self.height*72
         #print 'values', origin, flipud, figh, h, y
 
+        bbox = gc.get_clip_rectangle()
+        clippath, clippath_trans = gc.get_clip_path()
+
         clip = []
         if bbox is not None:
             clipx,clipy,clipw,cliph = bbox.bounds
@@ -504,10 +507,9 @@
         ps = '\n'.join(ps_cmd)
         self._draw_ps(ps, gc, rgbFace, fill=False, stroke=False)
 
-    def draw_path_collection(self, master_transform, cliprect, clippath,
-                             clippath_trans, paths, all_transforms, offsets,
-                             offsetTrans, facecolors, edgecolors, linewidths,
-                             linestyles, antialiaseds, urls):
+    def draw_path_collection(self, gc, master_transform, paths, all_transforms,
+                             offsets, offsetTrans, facecolors, edgecolors,
+                             linewidths, linestyles, antialiaseds, urls):
         write = self._pswriter.write
 
         path_codes = []
@@ -521,13 +523,11 @@
             write('\n'.join(ps_cmd))
             path_codes.append(name)
 
-        for xo, yo, path_id, gc, rgbFace in self._iter_collection(
-            path_codes, cliprect, clippath, clippath_trans,
-            offsets, offsetTrans, facecolors, edgecolors,
+        for xo, yo, path_id, gc0, rgbFace in self._iter_collection(
+            gc, path_codes, offsets, offsetTrans, facecolors, edgecolors,
             linewidths, linestyles, antialiaseds, urls):
-
             ps = "%g %g %s" % (xo, yo, path_id)
-            self._draw_ps(ps, gc, rgbFace)
+            self._draw_ps(ps, gc0, rgbFace)
 
         self._path_collection_id += 1
 
@@ -964,7 +964,7 @@
             class NullWriter(object):
                 def write(self, *kl, **kwargs):
                     pass
-                
+
             self._pswriter = NullWriter()
         else:
             self._pswriter = StringIO()
@@ -1096,7 +1096,7 @@
             class NullWriter(object):
                 def write(self, *kl, **kwargs):
                     pass
-                
+
             self._pswriter = NullWriter()
         else:
             self._pswriter = StringIO()

Modified: trunk/matplotlib/lib/matplotlib/backends/backend_svg.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/backends/backend_svg.py     2009-08-07 
15:40:56 UTC (rev 7416)
+++ trunk/matplotlib/lib/matplotlib/backends/backend_svg.py     2009-08-07 
17:02:28 UTC (rev 7417)
@@ -262,10 +262,9 @@
                 self._svgwriter.write ('<use style="%s" %s/>\n' % (style, 
details))
         write('</g>')
 
-    def draw_path_collection(self, master_transform, cliprect, clippath,
-                             clippath_trans, paths, all_transforms, offsets,
-                             offsetTrans, facecolors, edgecolors, linewidths,
-                             linestyles, antialiaseds, urls):
+    def draw_path_collection(self, gc, master_transform, paths, all_transforms,
+                             offsets, offsetTrans, facecolors, edgecolors,
+                             linewidths, linestyles, antialiaseds, urls):
         write = self._svgwriter.write
 
         path_codes = []
@@ -280,18 +279,17 @@
             path_codes.append(name)
         write('</defs>\n')
 
-        for xo, yo, path_id, gc, rgbFace in self._iter_collection(
-            path_codes, cliprect, clippath, clippath_trans,
-            offsets, offsetTrans, facecolors, edgecolors,
+        for xo, yo, path_id, gc0, rgbFace in self._iter_collection(
+            gc, path_codes, offsets, offsetTrans, facecolors, edgecolors,
             linewidths, linestyles, antialiaseds, urls):
-            clipid = self._get_gc_clip_svg(gc)
-            url = gc.get_url()
+            clipid = self._get_gc_clip_svg(gc0)
+            url = gc0.get_url()
             if url is not None:
                 self._svgwriter.write('<a xlink:href="%s">' % url)
             if clipid is not None:
                 write('<g clip-path="url(#%s)">' % clipid)
             details = 'xlink:href="#%s" x="%f" y="%f"' % (path_id, xo, 
self.height - yo)
-            style = self._get_style(gc, rgbFace)
+            style = self._get_style(gc0, rgbFace)
             self._svgwriter.write ('<use style="%s" %s/>\n' % (style, details))
             if clipid is not None:
                 write('</g>')
@@ -300,7 +298,7 @@
 
         self._path_collection_id += 1
 
-    def draw_image(self, x, y, im, bbox, clippath=None, clippath_trans=None):
+    def draw_image(self, gc, x, y, im):
         # MGDTODO: Support clippath here
         trans = [1,0,0,1,0,0]
         transstr = ''
@@ -643,7 +641,7 @@
             # the problem. I hope someone who knows the svg backends
             # take a look at this problem. Meanwhile, the dpi
             # parameter is ignored and image_dpi is fixed at 72. - JJL
-            
+
             #image_dpi = kwargs.pop("dpi", 72)
             image_dpi = 72
             _bbox_inches_restore = kwargs.pop("bbox_inches_restore", None)

Modified: trunk/matplotlib/lib/matplotlib/backends/backend_template.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/backends/backend_template.py        
2009-08-07 15:40:56 UTC (rev 7416)
+++ trunk/matplotlib/lib/matplotlib/backends/backend_template.py        
2009-08-07 17:02:28 UTC (rev 7417)
@@ -87,22 +87,21 @@
     # draw_path_collection is optional, and we get more correct
     # relative timings by leaving it out. backend implementers concerned with
     # performance will probably want to implement it
-#     def draw_path_collection(self, master_transform, cliprect, clippath,
-#                              clippath_trans, paths, all_transforms, offsets,
-#                              offsetTrans, facecolors, edgecolors, linewidths,
-#                              linestyles, antialiaseds):
+#     def draw_path_collection(self, gc, master_transform, paths,
+#                              all_transforms, offsets, offsetTrans, 
facecolors,
+#                              edgecolors, linewidths, linestyles,
+#                              antialiaseds):
 #         pass
 
     # draw_quad_mesh is optional, and we get more correct
     # relative timings by leaving it out.  backend implementers concerned with
     # performance will probably want to implement it
-#     def draw_quad_mesh(self, master_transform, cliprect, clippath,
-#                        clippath_trans, meshWidth, meshHeight, coordinates,
-#                        offsets, offsetTrans, facecolors, antialiased,
-#                        showedges):
+#     def draw_quad_mesh(self, gc, master_transform, meshWidth, meshHeight,
+#                        coordinates, offsets, offsetTrans, facecolors,
+#                        antialiased, showedges):
 #         pass
 
-    def draw_image(self, x, y, im, bbox, clippath=None, clippath_trans=None):
+    def draw_image(self, gc, x, y, im):
         pass
 
     def draw_text(self, gc, x, y, s, prop, angle, ismath=False):

Modified: trunk/matplotlib/lib/matplotlib/backends/backend_wx.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/backends/backend_wx.py      2009-08-07 
15:40:56 UTC (rev 7416)
+++ trunk/matplotlib/lib/matplotlib/backends/backend_wx.py      2009-08-07 
17:02:28 UTC (rev 7417)
@@ -361,7 +361,8 @@
             gfx_ctx.StrokePath(wxpath)
         gc.unselect()
 
-    def draw_image(self, x, y, im, bbox, clippath=None, clippath_trans=None):
+    def draw_image(self, gc, x, y, im):
+        bbox = gc.get_clip_rectangle()
         if bbox != None:
             l,b,w,h = bbox.bounds
         else:
@@ -776,7 +777,7 @@
         bind(self, wx.EVT_MIDDLE_DOWN, self._onMiddleButtonDown)
         bind(self, wx.EVT_MIDDLE_DCLICK, self._onMiddleButtonDown)
         bind(self, wx.EVT_MIDDLE_UP, self._onMiddleButtonUp)
-       
+
         self.SetBackgroundStyle(wx.BG_STYLE_CUSTOM)
 
         self.macros = {} # dict from wx id to seq of macros
@@ -1257,7 +1258,7 @@
         if self.HasCapture(): self.ReleaseMouse()
         FigureCanvasBase.button_release_event(self, x, y, 1, guiEvent=evt)
 
-    #Add middle button events  
+    #Add middle button events
     def _onMiddleButtonDown(self, evt):
         """Start measuring on an axis."""
         x = evt.GetX()

Modified: trunk/matplotlib/lib/matplotlib/collections.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/collections.py      2009-08-07 15:40:56 UTC 
(rev 7416)
+++ trunk/matplotlib/lib/matplotlib/collections.py      2009-08-07 17:02:28 UTC 
(rev 7417)
@@ -204,18 +204,16 @@
 
         self.update_scalarmappable()
 
-        clippath, clippath_trans = self.get_transformed_clip_path_and_affine()
-        if clippath_trans is not None:
-            clippath_trans = clippath_trans.frozen()
-
         transform, transOffset, offsets, paths = self._prepare_points()
 
+        gc = renderer.new_gc()
+        gc.set_clip_rectangle(self.get_clip_box())
+        gc.set_clip_path(self.get_clip_path())
+
         renderer.draw_path_collection(
-            transform.frozen(), self.clipbox, clippath, clippath_trans,
-            paths, self.get_transforms(),
-            offsets, transOffset,
-            self.get_facecolor(), self.get_edgecolor(), self._linewidths,
-            self._linestyles, self._antialiaseds, self._urls)
+            gc, transform.frozen(), paths, self.get_transforms(),
+            offsets, transOffset, self.get_facecolor(), self.get_edgecolor(),
+            self._linewidths, self._linestyles, self._antialiaseds, self._urls)
         renderer.close_group(self.__class__.__name__)
 
     def contains(self, mouseevent):
@@ -1149,10 +1147,6 @@
         if self.check_update('array'):
             self.update_scalarmappable()
 
-        clippath, clippath_trans = self.get_transformed_clip_path_and_affine()
-        if clippath_trans is not None:
-            clippath_trans = clippath_trans.frozen()
-
         if not transform.is_affine:
             coordinates = self._coordinates.reshape(
                 (self._coordinates.shape[0] *
@@ -1168,11 +1162,14 @@
             offsets = transOffset.transform_non_affine(offsets)
             transOffset = transOffset.get_affine()
 
+        gc = renderer.new_gc()
+        gc.set_clip_rectangle(self.get_clip_box())
+        gc.set_clip_path(self.get_clip_path())
+
         renderer.draw_quad_mesh(
-            transform.frozen(), self.clipbox, clippath, clippath_trans,
-            self._meshWidth, self._meshHeight, coordinates,
-            offsets, transOffset, self.get_facecolor(), self._antialiased,
-            self._showedges)
+            gc, transform.frozen(), self._meshWidth, self._meshHeight,
+            coordinates, offsets, transOffset, self.get_facecolor(),
+            self._antialiased, self._showedges)
         renderer.close_group(self.__class__.__name__)
 
 

Modified: trunk/matplotlib/lib/matplotlib/figure.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/figure.py   2009-08-07 15:40:56 UTC (rev 
7416)
+++ trunk/matplotlib/lib/matplotlib/figure.py   2009-08-07 17:02:28 UTC (rev 
7417)
@@ -766,9 +766,10 @@
 
             im.is_grayscale = False
             l, b, w, h = self.bbox.bounds
-            clippath, affine = self.get_transformed_clip_path_and_affine()
-            renderer.draw_image(l, b, im, self.bbox,
-                                clippath, affine)
+            gc = renderer.new_gc()
+            gc.set_clip_rectangle(self.bbox)
+            gc.set_clip_path(self.get_clip_path())
+            renderer.draw_image(gc, l, b, im)
 
         # render the axes
         for a in self.axes: a.draw(renderer)
@@ -851,7 +852,7 @@
 
           *fancybox*: [ None | False | True ]
             if True, draw a frame with a round fancybox.  If None, use rc
-            
+
           *shadow*: [ None | False | True ]
             If *True*, draw a shadow behind legend. If *None*, use rc settings.
 

Modified: trunk/matplotlib/lib/matplotlib/font_manager.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/font_manager.py     2009-08-07 15:40:56 UTC 
(rev 7416)
+++ trunk/matplotlib/lib/matplotlib/font_manager.py     2009-08-07 17:02:28 UTC 
(rev 7417)
@@ -707,7 +707,7 @@
     def __hash__(self):
         l = [(k, getattr(self, "get" + k)()) for k in sorted(self.__dict__)]
         return hash(repr(l))
- 
+
     def __str__(self):
         return self.get_fontconfig_pattern()
 

Modified: trunk/matplotlib/lib/matplotlib/image.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/image.py    2009-08-07 15:40:56 UTC (rev 
7416)
+++ trunk/matplotlib/lib/matplotlib/image.py    2009-08-07 17:02:28 UTC (rev 
7417)
@@ -235,9 +235,10 @@
         im = self.make_image(renderer.get_image_magnification())
         im._url = self.get_url()
         l, b, widthDisplay, heightDisplay = self.axes.bbox.bounds
-        clippath, affine = self.get_transformed_clip_path_and_affine()
-        renderer.draw_image(round(l), round(b), im, self.axes.bbox.frozen(),
-                            clippath, affine)
+        gc = renderer.new_gc()
+        gc.set_clip_rectangle(self.axes.bbox.frozen())
+        gc.set_clip_path(self.get_clip_path())
+        renderer.draw_image(gc, round(l), round(b), im)
 
     def contains(self, mouseevent):
         """
@@ -576,11 +577,13 @@
     def draw(self, renderer, *args, **kwargs):
         if not self.get_visible(): return
         im = self.make_image(renderer.get_image_magnification())
-        renderer.draw_image(round(self.axes.bbox.xmin),
+        gc = renderer.new_gc()
+        gc.set_clip_rectangle(self.axes.bbox.frozen())
+        gc.set_clip_path(self.get_clip_path())
+        renderer.draw_image(gc,
+                            round(self.axes.bbox.xmin),
                             round(self.axes.bbox.ymin),
-                            im,
-                            self.axes.bbox.frozen(),
-                            *self.get_transformed_clip_path_and_affine())
+                            im)
 
 
     def set_data(self, x, y, A):
@@ -730,8 +733,10 @@
         if not self.get_visible(): return
         # todo: we should be able to do some cacheing here
         im = self.make_image(renderer.get_image_magnification())
-        renderer.draw_image(round(self.ox), round(self.oy), im, 
self.figure.bbox,
-                            *self.get_transformed_clip_path_and_affine())
+        gc = renderer.new_gc()
+        gc.set_clip_rectangle(self.figure.bbox)
+        gc.set_clip_path(self.get_clip_path())
+        renderer.draw_image(gc, round(self.ox), round(self.oy), im)
 
     def write_png(self, fname):
         """Write the image to png file with fname"""

Modified: trunk/matplotlib/src/_backend_agg.cpp
===================================================================
--- trunk/matplotlib/src/_backend_agg.cpp       2009-08-07 15:40:56 UTC (rev 
7416)
+++ trunk/matplotlib/src/_backend_agg.cpp       2009-08-07 17:02:28 UTC (rev 
7417)
@@ -31,6 +31,7 @@
 #include "agg_span_image_filter_rgba.h"
 #include "agg_span_interpolator_linear.h"
 #include "agg_span_pattern_rgba.h"
+#include "agg_span_gouraud_rgba.h"
 #include "agg_conv_shorten_path.h"
 #include "util/agg_color_conv_rgb8.h"
 
@@ -799,23 +800,17 @@
 RendererAgg::draw_image(const Py::Tuple& args) {
   _VERBOSE("RendererAgg::draw_image");
 
-  args.verify_length(4, 6);
+  args.verify_length(4);
 
-  double x = Py::Float(args[0]);
-  double y = Py::Float(args[1]);
-  Image *image = static_cast<Image*>(args[2].ptr());
-  Py::Object box_obj = args[3];
-  Py::Object clippath;
-  agg::trans_affine clippath_trans;
+  GCAgg gc(args[0], dpi);
+  double x = Py::Float(args[1]);
+  double y = Py::Float(args[2]);
+  Image *image = static_cast<Image*>(args[3].ptr());
   bool has_clippath = false;
 
   theRasterizer.reset_clipping();
   rendererBase.reset_clipping(true);
-  if (args.size() == 6) {
-    clippath = args[4];
-    clippath_trans = py_to_agg_transformation_matrix(args[5].ptr(), false);
-    has_clippath = render_clippath(clippath, clippath_trans);
-  }
+  has_clippath = render_clippath(gc.clippath, gc.clippath_trans);
 
   Py::Tuple empty;
   image->flipud_out(empty);
@@ -855,7 +850,7 @@
     theRasterizer.add_path(rect2);
     agg::render_scanlines(theRasterizer, slineP8, ri);
   } else {
-    set_clipbox(box_obj, rendererBase);
+    set_clipbox(gc.cliprect, rendererBase);
     rendererBase.blend_from(pixf, 0, (int)x, (int)(height-(y+image->rowsOut)));
   }
 
@@ -1026,15 +1021,13 @@
   _VERBOSE("RendererAgg::draw_path");
   args.verify_length(3, 4);
 
-  Py::Object gc_obj = args[0];
-  Py::Object path_obj = args[1];
+  GCAgg gc(args[0], dpi);
+  PathIterator path(args[1]);
   agg::trans_affine trans = py_to_agg_transformation_matrix(args[2].ptr());
   Py::Object face_obj;
   if (args.size() == 4)
     face_obj = args[3];
 
-  PathIterator path(path_obj);
-  GCAgg gc = GCAgg(gc_obj, dpi);
   facepair_t face = _get_rgba_face(face_obj, gc.alpha);
 
   theRasterizer.reset_clipping();
@@ -1275,32 +1268,29 @@
 Py::Object
 RendererAgg::draw_path_collection(const Py::Tuple& args) {
   _VERBOSE("RendererAgg::draw_path_collection");
-  args.verify_length(14);
+  args.verify_length(12);
 
-  //segments, trans, clipbox, colors, linewidths, antialiaseds
-  agg::trans_affine      master_transform = 
py_to_agg_transformation_matrix(args[0].ptr());
-  Py::Object             cliprect         = args[1];
-  Py::Object             clippath         = args[2];
-  agg::trans_affine       clippath_trans   = 
py_to_agg_transformation_matrix(args[3].ptr(), false);
-  Py::SeqBase<Py::Object> paths                   = args[4];
-  Py::SeqBase<Py::Object> transforms_obj   = args[5];
-  Py::Object              offsets_obj      = args[6];
-  agg::trans_affine       offset_trans     = 
py_to_agg_transformation_matrix(args[7].ptr());
-  Py::Object              facecolors_obj   = args[8];
-  Py::Object              edgecolors_obj   = args[9];
-  Py::SeqBase<Py::Float>  linewidths      = args[10];
-  Py::SeqBase<Py::Object> linestyles_obj   = args[11];
-  Py::SeqBase<Py::Int>    antialiaseds    = args[12];
+  GCAgg gc(args[0], dpi);
+  agg::trans_affine      master_transform = 
py_to_agg_transformation_matrix(args[1].ptr());
+  PathListGenerator       paths(args[2]);
+  Py::SeqBase<Py::Object> transforms_obj   = args[3];
+  Py::Object              offsets_obj      = args[4];
+  agg::trans_affine       offset_trans     = 
py_to_agg_transformation_matrix(args[5].ptr());
+  Py::Object              facecolors_obj   = args[6];
+  Py::Object              edgecolors_obj   = args[7];
+  Py::SeqBase<Py::Float>  linewidths      = args[8];
+  Py::SeqBase<Py::Object> linestyles_obj   = args[9];
+  Py::SeqBase<Py::Int>    antialiaseds    = args[10];
   // We don't actually care about urls for Agg, so just ignore it.
-  // Py::SeqBase<Py::Object> urls             = args[13];
+  // Py::SeqBase<Py::Object> urls             = args[11];
   PathListGenerator path_generator(paths);
 
   try {
     _draw_path_collection_generic<PathListGenerator, 0, 1>
       (master_transform,
-       cliprect,
-       clippath,
-       clippath_trans,
+       gc.cliprect,
+       gc.clippath,
+       gc.clippath_trans,
        path_generator,
        transforms_obj,
        offsets_obj,
@@ -1390,22 +1380,20 @@
 Py::Object
 RendererAgg::draw_quad_mesh(const Py::Tuple& args) {
   _VERBOSE("RendererAgg::draw_quad_mesh");
-  args.verify_length(12);
+  args.verify_length(10);
 
 
   //segments, trans, clipbox, colors, linewidths, antialiaseds
-  agg::trans_affine      master_transform = 
py_to_agg_transformation_matrix(args[0].ptr());
-  Py::Object             cliprect         = args[1];
-  Py::Object             clippath         = args[2];
-  agg::trans_affine       clippath_trans   = 
py_to_agg_transformation_matrix(args[3].ptr(), false);
-  size_t                  mesh_width       = Py::Int(args[4]);
-  size_t                  mesh_height      = Py::Int(args[5]);
-  PyObject*               coordinates     = args[6].ptr();
-  Py::Object              offsets_obj      = args[7];
-  agg::trans_affine       offset_trans     = 
py_to_agg_transformation_matrix(args[8].ptr());
-  Py::Object              facecolors_obj   = args[9];
-  bool                    antialiased     = (bool)Py::Int(args[10]);
-  bool                    showedges        = (bool)Py::Int(args[11]);
+  GCAgg gc(args[0], dpi);
+  agg::trans_affine      master_transform = 
py_to_agg_transformation_matrix(args[1].ptr());
+  size_t                  mesh_width       = Py::Int(args[2]);
+  size_t                  mesh_height      = Py::Int(args[3]);
+  PyObject*               coordinates     = args[4].ptr();
+  Py::Object              offsets_obj      = args[5];
+  agg::trans_affine       offset_trans     = 
py_to_agg_transformation_matrix(args[6].ptr());
+  Py::Object              facecolors_obj   = args[7];
+  bool                    antialiased     = (bool)Py::Int(args[8]);
+  bool                    showedges        = (bool)Py::Int(args[9]);
   bool                    free_edgecolors  = false;
 
   QuadMeshGenerator path_generator(mesh_width, mesh_height, coordinates);
@@ -1437,9 +1425,9 @@
     try {
       _draw_path_collection_generic<QuadMeshGenerator, 0, 0>
         (master_transform,
-         cliprect,
-         clippath,
-         clippath_trans,
+         gc.cliprect,
+         gc.clippath,
+         gc.clippath_trans,
          path_generator,
          transforms_obj,
          offsets_obj,
@@ -1467,6 +1455,73 @@
 }
 
 Py::Object
+RendererAgg::draw_gouraud_triangle(const Py::Tuple& args) {
+  _VERBOSE("RendererAgg::draw_quad_mesh");
+  args.verify_length(4);
+
+  typedef agg::rgba8                      color_t;
+  typedef agg::span_gouraud_rgba<color_t> span_gen_t;
+  typedef agg::span_allocator<color_t>    span_alloc_t;
+
+  //segments, trans, clipbox, colors, linewidths, antialiaseds
+  GCAgg gc(args[0], dpi);
+  Py::Object              points_obj       = args[1];
+  Py::Object              colors_obj       = args[2];
+  agg::trans_affine      master_transform = 
py_to_agg_transformation_matrix(args[3].ptr());
+
+  PyArrayObject* points = (PyArrayObject*)PyArray_ContiguousFromAny
+    (points_obj.ptr(), PyArray_DOUBLE, 2, 2);
+  if (!points ||
+      PyArray_DIM(points, 0) != 3 || PyArray_DIM(points, 1) != 2)
+    throw Py::ValueError("points must be a 3x2 numpy array");
+
+  PyArrayObject* colors = (PyArrayObject*)PyArray_ContiguousFromAny
+    (colors_obj.ptr(), PyArray_DOUBLE, 2, 2);
+  if (!colors ||
+      PyArray_DIM(colors, 0) != 3 || PyArray_DIM(colors, 1) != 4)
+    throw Py::ValueError("colors must be a 3x4 numpy array");
+
+  try {
+    double* opoints = (double*)PyArray_DATA(points);
+    double* c = (double*)PyArray_DATA(colors);
+    double tpoints[6];
+
+    for (int i = 0; i < 6; i += 2) {
+      tpoints[i] = opoints[i];
+      tpoints[i+1] = opoints[i+1];
+      master_transform.transform(&tpoints[i], &tpoints[i+1]);
+    }
+
+    span_alloc_t span_alloc;
+    span_gen_t span_gen;
+
+    span_gen.colors(
+      agg::rgba(c[0], c[1], c[2], c[3]),
+      agg::rgba(c[4], c[5], c[6], c[7]),
+      agg::rgba(c[8], c[9], c[10], c[11]));
+    span_gen.triangle(
+      tpoints[0], tpoints[1],
+      tpoints[2], tpoints[3],
+      tpoints[4], tpoints[5],
+      1.0);
+
+    theRasterizer.add_path(span_gen);
+    agg::render_scanlines_aa(
+      theRasterizer, slineP8, rendererBase, span_alloc, span_gen);
+  } catch (...) {
+    Py_DECREF(points);
+    Py_DECREF(colors);
+
+    throw;
+  }
+
+  Py_DECREF(points);
+  Py_DECREF(colors);
+
+  return Py::Object();
+}
+
+Py::Object
 RendererAgg::write_rgba(const Py::Tuple& args) {
   _VERBOSE("RendererAgg::write_rgba");
 
@@ -1802,15 +1857,17 @@
   add_varargs_method("draw_path", &RendererAgg::draw_path,
                     "draw_path(gc, path, transform, rgbFace)\n");
   add_varargs_method("draw_path_collection", 
&RendererAgg::draw_path_collection,
-                    "draw_path_collection(master_transform, cliprect, 
clippath, clippath_trans, paths, transforms, offsets, offsetTrans, facecolors, 
edgecolors, linewidths, linestyles, antialiaseds)\n");
+                    "draw_path_collection(gc, master_transform, paths, 
transforms, offsets, offsetTrans, facecolors, edgecolors, linewidths, 
linestyles, antialiaseds)\n");
   add_varargs_method("draw_quad_mesh", &RendererAgg::draw_quad_mesh,
-                    "draw_quad_mesh(master_transform, cliprect, clippath, 
clippath_trans, meshWidth, meshHeight, coordinates, offsets, offsetTrans, 
facecolors, antialiaseds, showedges)\n");
+                    "draw_quad_mesh(gc, master_transform, meshWidth, 
meshHeight, coordinates, offsets, offsetTrans, facecolors, antialiaseds, 
showedges)\n");
+  add_varargs_method("draw_gouraud_triangle", 
&RendererAgg::draw_gouraud_triangle,
+                    "draw_gouraud_triangle(gc, points, colors, 
master_transform)\n");
   add_varargs_method("draw_markers", &RendererAgg::draw_markers,
                     "draw_markers(gc, marker_path, marker_trans, path, 
rgbFace)\n");
   add_varargs_method("draw_text_image", &RendererAgg::draw_text_image,
                     "draw_text_image(font_image, x, y, r, g, b, a)\n");
   add_varargs_method("draw_image", &RendererAgg::draw_image,
-                    "draw_image(x, y, im)");
+                    "draw_image(gc, x, y, im)");
   add_varargs_method("write_rgba", &RendererAgg::write_rgba,
                     "write_rgba(fname)");
   add_varargs_method("tostring_rgb", &RendererAgg::tostring_rgb,

Modified: trunk/matplotlib/src/_backend_agg.h
===================================================================
--- trunk/matplotlib/src/_backend_agg.h 2009-08-07 15:40:56 UTC (rev 7416)
+++ trunk/matplotlib/src/_backend_agg.h 2009-08-07 17:02:28 UTC (rev 7417)
@@ -164,8 +164,8 @@
   Py::Object draw_path(const Py::Tuple & args);
   Py::Object draw_path_collection(const Py::Tuple & args);
   Py::Object draw_quad_mesh(const Py::Tuple& args);
+  Py::Object draw_gouraud_triangle(const Py::Tuple& args);
 
-
   Py::Object write_rgba(const Py::Tuple & args);
   Py::Object tostring_rgb(const Py::Tuple & args);
   Py::Object tostring_argb(const Py::Tuple & args);


This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.

------------------------------------------------------------------------------
Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day 
trial. Simplify your report design, integration and deployment - and focus on 
what you do best, core application coding. Discover what's new with 
Crystal Reports now.  http://p.sf.net/sfu/bobj-july
_______________________________________________
Matplotlib-checkins mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/matplotlib-checkins

Reply via email to