Revision: 3934
          http://matplotlib.svn.sourceforge.net/matplotlib/?rev=3934&view=rev
Author:   mdboom
Date:     2007-10-11 08:42:53 -0700 (Thu, 11 Oct 2007)

Log Message:
-----------
Continued progress getting more examples to work.  Working examples
(with TkAgg backend only) are marked in PASSED_DEMOS for the curious.

Modified Paths:
--------------
    branches/transforms/examples/histogram_demo_canvasagg.py
    branches/transforms/examples/line_collection2.py
    branches/transforms/examples/pick_event_demo.py
    branches/transforms/lib/matplotlib/axes.py
    branches/transforms/lib/matplotlib/axis.py
    branches/transforms/lib/matplotlib/collections.py
    branches/transforms/lib/matplotlib/colorbar.py
    branches/transforms/lib/matplotlib/colors.py
    branches/transforms/lib/matplotlib/figure.py
    branches/transforms/lib/matplotlib/image.py
    branches/transforms/lib/matplotlib/legend.py
    branches/transforms/lib/matplotlib/lines.py
    branches/transforms/lib/matplotlib/mathtext.py
    branches/transforms/lib/matplotlib/patches.py
    branches/transforms/lib/matplotlib/ticker.py
    branches/transforms/lib/matplotlib/transforms.py
    branches/transforms/src/_backend_agg.cpp
    branches/transforms/src/_backend_agg.h

Added Paths:
-----------
    branches/transforms/PASSED_DEMOS

Added: branches/transforms/PASSED_DEMOS
===================================================================
--- branches/transforms/PASSED_DEMOS                            (rev 0)
+++ branches/transforms/PASSED_DEMOS    2007-10-11 15:42:53 UTC (rev 3934)
@@ -0,0 +1,210 @@
+accented_text.py        O
+agg_buffer_to_array.py  O
+agg_oo.py               O
+agg_resize.py           [BROKEN IN TRUNK]
+agg_test.py
+alignment_test.py       O
+animation_blit_fltk.py
+animation_blit.py
+animation_blit_qt4.py
+animation_blit_qt.py
+animation_blit_tk.py
+animation_blit_wx.py
+anim.py                 O [BUT SLOWER]
+annotation_demo.py      O
+anscombe.py            O
+arctest.py             O
+arrow_demo.py          O
+axes_demo.py           O
+axes_props.py          [SOMETHING FUNNY ABOUT DASHED LINES]
+axhspan_demo.py                O
+axis_equal_demo.py      O
+backend_driver.py
+barchart_demo.py        O
+barcode_demo.py         O
+barh_demo.py           [BROKEN IN TRUNK]
+bar_stacked.py         O
+boxplot_demo.py                O
+break.py               O
+broken_barh.py         O
+clippath_test.py       O
+clippedline.py         O
+collections_demo.py     -- [NEEDS ADDITIONAL WORK]
+colorbar_only.py       O
+color_by_yvalue.py     O
+color_demo.py          O
+colours.py             [???]
+contour_demo.py                
+contourf_demo.py
+contour_image.py
+coords_demo.py         O
+coords_report.py       O
+csd_demo.py            O
+cursor_demo.py         O
+custom_figure_class.py  [EXCEPT FOR PS OUTPUT]
+customize_rc.py
+custom_ticker1.py      O
+dannys_example.py      [REQUIRES NUMERIC]
+dash_control.py                O
+dashpointlabel.py      O
+dashtick.py
+data_browser.py                O
+data_helper.py         [N/A]
+date_demo1.py          O
+date_demo2.py          O
+date_demo_convert.py   O [PASSES]
+date_demo_rrule.py     O [PASSES]
+date_index_formatter.py O [PASSES]
+dynamic_collection.py   O
+dynamic_demo.py                [GTK]
+dynamic_demo_wx.py     [WX]
+dynamic_image_gtkagg.py
+dynamic_image_wxagg2.py
+dynamic_image_wxagg.py
+ellipse_demo.py                O
+ellipse_rotated.py     O
+embedding_in_gtk2.py
+embedding_in_gtk3.py
+embedding_in_gtk.py
+embedding_in_qt4.py
+embedding_in_qt.py
+embedding_in_tk2.py
+embedding_in_tk.py
+embedding_in_wx2.py
+embedding_in_wx3.py
+embedding_in_wx4.py
+embedding_in_wx.py
+errorbar_demo.py       O
+errorbar_limits.py     O       
+figimage_demo.py       O
+figlegend_demo.py      [HORRIBLY BROKEN]
+figtext.py             O
+fill_between_posneg.py O
+fill_between.py                O
+fill_demo2.py          O
+fill_demo.py           O
+fill_spiral.py         O
+finance_demo.py                O
+font_indexing.py       O
+fonts_demo_kw.py       O
+fonts_demo.py          O
+font_table_ttf.py      [N/A]
+ftface_props.py                [N/A]
+ganged_plots.py                O
+glyph_to_path.py       [Requires PIL]
+gradient_bar.py                O
+gtk_spreadsheet.py             
+hatch_demo.py          [Requires PS]
+histogram_demo_canvasagg.py [???]
+histogram_demo.py      O
+image_demo2.py         O
+image_demo3.py         [Requires PIL]
+image_demo.py          O
+image_interp.py                O
+image_masked.py                O [Whew!]
+image_origin.py                O
+image_slices_viewer.py  [BROKEN ON TRUNK]
+__init__.py
+integral_demo.py       O
+interactive2.py                [N/A]
+interactive.py         [N/A]
+interp_demo.py         O
+invert_axes.py         O
+keypress_demo.py       [BROKEN IN TRUNK]
+lasso_demo.py          O
+layer_images.py                O
+legend_auto.py         [WEIRD z-order problem in figure 10]
+legend_demo2.py                O
+legend_demo.py         O
+legend_scatter.py      O
+line_collection2.py    O
+line_collection.py     O
+lineprops_dialog_gtk.py
+line_styles.py         O
+load_converter.py      O
+loadrec.py             O
+log_bar.py             O
+log_demo.py            O
+logo.py                        O
+log_test.py            O
+major_minor_demo1.py   O
+major_minor_demo2.py   O
+masked_demo.py         O
+mathtext_demo.py       O
+mathtext_examples.py   O
+mathtext_wx.py
+matplotlib_icon.py     [N/A]
+matshow.py             O
+movie_demo.py          O
+mpl_with_glade.py      [N/A]
+mri_demo.py            O
+mri_with_eeg.py
+multi_image.py         O
+multiline.py           O
+multiple_figs_demo.py  O
+newscalarformatter_demo.py O
+pcolor_demo2.py                O
+pcolor_demo.py         O
+pcolor_log.py          O
+pcolor_nonuniform.py   O
+pcolor_small.py                O
+pick_event_demo2.py
+pick_event_demo.py
+pie_demo.py
+plotfile_demo.py
+polar_bar.py
+polar_demo.py
+polar_legend.py
+polar_scatter.py
+poly_editor.py
+poormans_contour.py
+printing_in_wx.py
+print_stdout.py
+psd_demo.py
+pstest.py
+pylab_with_gtk.py
+pythonic_matplotlib.py
+quadmesh_demo.py
+quiver_demo.py
+rc_traits.py
+scatter_custom_symbol.py
+scatter_demo2.py
+scatter_demo.py
+scatter_masked.py
+scatter_profile.py
+scatter_star_poly.py
+set_and_get.py
+shared_axis_across_figures.py
+shared_axis_demo.py
+simple3d_oo.py
+simple3d.py
+simple_plot_fps.py
+simple_plot.py
+specgram_demo.py
+spy_demos.py
+stem_plot.py
+step_demo.py
+stock_demo.py
+strip_chart_demo.py
+subplot_demo.py
+subplots_adjust.py
+subplot_toolbar.py
+system_monitor.py
+table_demo.py
+tex_demo.py
+text_handles.py
+text_rotation.py
+text_themes.py
+tex_unicode_demo.py
+toggle_images.py
+to_numeric.py
+transoffset.py
+two_scales.py
+unicode_demo.py
+vertical_ticklabels.py
+vline_demo.py
+webapp_demo.py
+wxcursor_demo.py
+xcorr_demo.py
+zoom_window.py
+zorder_demo.py

Modified: branches/transforms/examples/histogram_demo_canvasagg.py
===================================================================
--- branches/transforms/examples/histogram_demo_canvasagg.py    2007-10-10 
13:38:32 UTC (rev 3933)
+++ branches/transforms/examples/histogram_demo_canvasagg.py    2007-10-11 
15:42:53 UTC (rev 3934)
@@ -11,7 +11,6 @@
 """
 from matplotlib.backends.backend_agg import FigureCanvasAgg
 from matplotlib.figure import Figure
-from matplotlib.axes import Subplot
 from matplotlib.mlab import normpdf
 from numpy.random import randn
 import numpy
@@ -45,7 +44,7 @@
 
 # get the figure dimensions for creating bitmaps or numpy arrays,
 # etc.
-l,b,w,h = fig.bbox.get_bounds()
+l,b,w,h = fig.bbox.bounds
 w, h = int(w), int(h)
 
 if 0:

Modified: branches/transforms/examples/line_collection2.py
===================================================================
--- branches/transforms/examples/line_collection2.py    2007-10-10 13:38:32 UTC 
(rev 3933)
+++ branches/transforms/examples/line_collection2.py    2007-10-11 15:42:53 UTC 
(rev 3934)
@@ -23,7 +23,7 @@
 # See matplotlib.collections.LineCollection for more information
 line_segments = LineCollection([zip(x,y) for y in ys], # Make a sequence of 
x,y pairs
                                 linewidths    = (0.5,1,1.5,2),
-                                linestyle = 'solid')
+                                linestyles = 'solid')
 line_segments.set_array(x)
 ax.add_collection(line_segments)
 fig = gcf()

Modified: branches/transforms/examples/pick_event_demo.py
===================================================================
--- branches/transforms/examples/pick_event_demo.py     2007-10-10 13:38:32 UTC 
(rev 3933)
+++ branches/transforms/examples/pick_event_demo.py     2007-10-11 15:42:53 UTC 
(rev 3934)
@@ -93,7 +93,7 @@
             print 'onpick1 line:', zip(nx.take(xdata, ind), nx.take(ydata, 
ind))
         elif isinstance(event.artist, Rectangle):
             patch = event.artist
-            print 'onpick1 patch:', patch.get_verts()
+            print 'onpick1 patch:', patch.get_path()
         elif isinstance(event.artist, Text):
             text = event.artist
             print 'onpick1 text:', text.get_text()

Modified: branches/transforms/lib/matplotlib/axes.py
===================================================================
--- branches/transforms/lib/matplotlib/axes.py  2007-10-10 13:38:32 UTC (rev 
3933)
+++ branches/transforms/lib/matplotlib/axes.py  2007-10-11 15:42:53 UTC (rev 
3934)
@@ -480,8 +480,7 @@
         if isinstance(rect, mtransforms.Bbox):
             self._position = rect
         else:
-            warnings.warn("Passing non-bbox as rect to Axes")
-            mtransforms.Bbox.from_lbwh(*rect)
+            self._position = mtransforms.Bbox.from_lbwh(*rect)
         self._originalPosition = self._position.frozen()
         self.set_axes(self)
         self.set_aspect('auto')
@@ -596,7 +595,7 @@
     def get_xaxis_text2_transform(self, pad_pixels):
         return (self._xaxis_transform +
                 mtransforms.Affine2D().translate(0, pad_pixels),
-                "top", "center")
+                "bottom", "center")
 
     def get_yaxis_transform(self):
         return self._yaxis_transform
@@ -609,7 +608,7 @@
     def get_yaxis_text2_transform(self, pad_pixels):
         return (self._yaxis_transform +
                 mtransforms.Affine2D().translate(pad_pixels, 0),
-                "center", "right")
+                "center", "left")
         
     def _update_transScale(self):
         self.transScale.set(
@@ -643,8 +642,8 @@
            self._position.set(pos)
         if which in ('both', 'original'):
             self._originalPosition.set(pos)
+
            
-           
     def _set_artist_props(self, a):
         'set the boilerplate props for artists added to axes'
         a.set_figure(self.figure)
@@ -1083,7 +1082,8 @@
     def _update_patch_limits(self, p):
         'update the datalimits for patch p'
         xys = self._get_verts_in_data_coords(
-            p.get_transform(), p.get_path().vertices)
+            p.get_data_transform(),
+            p.get_patch_transform().transform(p.get_path().vertices))
         self.update_datalim(xys)
 
 
@@ -1240,11 +1240,11 @@
                    for im in self.images if im.get_visible()]
 
 
-            im = mimage.from_images(self.bbox.height()*mag,
-                                    self.bbox.width()*mag,
+            im = mimage.from_images(self.bbox.height*mag,
+                                    self.bbox.width*mag,
                                     ims)
             im.is_grayscale = False
-            l, b, w, h = self.bbox.get_bounds()
+            l, b, w, h = self.bbox.bounds
             # composite images need special args so they will not
             # respect z-order for now
             renderer.draw_image(l, b, im, self.bbox)

Modified: branches/transforms/lib/matplotlib/axis.py
===================================================================
--- branches/transforms/lib/matplotlib/axis.py  2007-10-10 13:38:32 UTC (rev 
3933)
+++ branches/transforms/lib/matplotlib/axis.py  2007-10-11 15:42:53 UTC (rev 
3934)
@@ -1290,14 +1290,13 @@
            
         else:
             if not len(bboxes2):
-                right = self.axes.bbox.xmax()
+                right = self.axes.bbox.xmax
             else:
+                bbox = Bbox.union(bboxes2)
+                right = bbox.xmax
 
-                bbox = bbox_union(bboxes2)
-                right = bbox.xmax()
+            self.label.set_position( 
(right+self.LABELPAD*self.figure.dpi/72.0, y))
 
-            self.label.set_position( 
(right+self.LABELPAD*self.figure.dpi.get()/72.0, y))
-
     def _update_offset_text_position(self, bboxes, bboxes2):
         """
         Update the offset_text position based on the sequence of bounding

Modified: branches/transforms/lib/matplotlib/collections.py
===================================================================
--- branches/transforms/lib/matplotlib/collections.py   2007-10-10 13:38:32 UTC 
(rev 3933)
+++ branches/transforms/lib/matplotlib/collections.py   2007-10-11 15:42:53 UTC 
(rev 3934)
@@ -23,6 +23,9 @@
 from matplotlib.backends._backend_agg import get_path_collection_extents, \
     point_in_path_collection
 
+# MGDTODO: Treat facecolors and edgecolors as numpy arrays always
+# and then update draw_path_collection to use the array interface
+
 class Collection(artist.Artist, cm.ScalarMappable):
     """
     Base class for Collections.  Must be subclassed to be usable.
@@ -58,7 +61,6 @@
     """
     _offsets = npy.zeros((1, 2))
     _transOffset = transforms.IdentityTransform()
-
     _transforms = [None]
     
     zorder = 1
@@ -163,9 +165,9 @@
                 
         self.update_scalarmappable()
 
-        #print 'calling renderer draw line collection'
         clippath, clippath_trans = self.get_transformed_clip_path_and_affine()
 
+        # MGDTODO: This may benefit from using TransformedPath
         if not transform.is_affine:
             paths = [transform.transform_path_non_affine(path) for path in 
paths]
             transform = transform.get_affine()
@@ -185,10 +187,19 @@
         Returns T/F, dict(ind=itemlist), where every item in itemlist contains 
the event.
         """
         if callable(self._contains): return self._contains(self,mouseevent)
+
+        transform = self.get_transform()
+        paths = self.get_paths()
+        if not transform.is_affine:
+            paths = [transform.transform_path_non_affine(path) for path in 
paths]
+            transform = transform.get_affine()
+
+        # MGDTODO: Don't pick when outside of clip path / clip box
         ind = point_in_path_collection(
             mouseevent.x, mouseevent.y, self._pickradius,
-            self.get_transform(), self._paths, self._transforms, self._offsets,
-            self._offsetTrans, self._facecolors)
+            transform.frozen(), paths, self.get_transforms(),
+            npy.asarray(self._offsets, npy.float_),
+            self._transOffset.frozen(), len(self._facecolors))
         return len(ind)>0,dict(ind=ind)
 
     # MGDTODO: Update
@@ -233,7 +244,7 @@
     def set_pickradius(self,pickradius): self.pickradius = 5
     def get_pickradius(self): return self.pickradius
     
-    def set_linewidth(self, lw):
+    def set_linewidths(self, lw):
         """
         Set the linewidth(s) for the collection.  lw can be a scalar or a
         sequence; if it is a sequence the patches will cycle through the
@@ -242,9 +253,8 @@
         ACCEPTS: float or sequence of floats
         """
         self._linewidths = self._get_value(lw)
-    def set_linewidths(self, lw):
-        self.set_linewidth(lw)
-
+    set_linewidth = set_linewidths
+        
     def set_linestyles(self, ls):
         """
         Set the linestyles(s) for the collection.
@@ -274,6 +284,7 @@
             raise ValueError('Do not know how to convert %s to dashes'%ls)
 
         self._linestyles = dashes
+    set_dashes = set_linestyle = set_linestyles
         
     def set_color(self, c):
         """
@@ -295,8 +306,7 @@
         ACCEPTS: matplotlib color arg or sequence of rgba tuples
         """
         self._facecolors = _colors.colorConverter.to_rgba_list(c)
-    def set_facecolors(self, c):
-        self.set_facecolor(c)
+    set_facecolors = set_facecolor
 
     def set_edgecolor(self, c):
         """
@@ -308,10 +318,10 @@
         """
         if c == 'None':
             self._linewidths = (0.0,)
+            self._edgecolors = npy.array([])
         else:
             self._edgecolors = _colors.colorConverter.to_rgba_list(c)
-    def set_edgecolors(self, c):
-        self.set_edgecolor(c)
+    set_edgecolors = set_edgecolor
 
     def set_alpha(self, alpha):
         """
@@ -324,29 +334,30 @@
         except TypeError: raise TypeError('alpha must be a float')
         else:
             artist.Artist.set_alpha(self, alpha)
-            self._facecolors = [(r,g,b,alpha) for r,g,b,a in self._facecolors]
-            if cbook.is_string_like(self._edgecolors) and self._edgecolors != 
'None':
-                self._edgecolors = [(r,g,b,alpha) for r,g,b,a in 
self._edgecolors]
+            self._facecolors[:, 3] = alpha
+            self._edgecolors[:, 3] = alpha
 
-    def get_linewidth(self):
+    def get_linewidths(self):
         return self._linewidths
+    get_linewidth = get_linewidths
     
-    def get_linestyle(self):
+    def get_linestyles(self):
         return self._linestyles
-
-    def get_dashes(self):
-        return self._linestyles
+    get_dashes = get_linestyle = get_linestyles
                 
     def update_scalarmappable(self):
         """
-        If the scalar mappable array is not none, update facecolors
+        If the scalar mappable array is not none, update colors
         from scalar data
         """
         #print 'update_scalarmappable: self._A', self._A
         if self._A is None: return
         if len(self._A.shape)>1:
             raise ValueError('PatchCollections can only map rank 1 arrays')
-        self._facecolors = self.to_rgba(self._A, self._alpha)
+        if len(self._facecolors):
+            self._facecolors = self.to_rgba(self._A, self._alpha)
+        else:
+            self._edgecolors = self.to_rgba(self._A, self._alpha)
         #print self._facecolors
 
 
@@ -673,6 +684,8 @@
         if antialiaseds is None: antialiaseds = 
(mpl.rcParams['lines.antialiased'],)
         self.set_linestyles(linestyles)
 
+        colors = _colors.colorConverter.to_rgba_list(colors)
+        
         Collection.__init__(
             self,
             edgecolors=colors,
@@ -686,7 +699,7 @@
             pickradius=pickradius,
             **kwargs)
 
-        self._facecolors = [None]
+        self._facecolors = npy.array([])
         self.set_segments(segments)
 
     def get_paths(self):

Modified: branches/transforms/lib/matplotlib/colorbar.py
===================================================================
--- branches/transforms/lib/matplotlib/colorbar.py      2007-10-10 13:38:32 UTC 
(rev 3933)
+++ branches/transforms/lib/matplotlib/colorbar.py      2007-10-11 15:42:53 UTC 
(rev 3934)
@@ -319,9 +319,9 @@
         else:
             intv = self.vmin, self.vmax
         locator.create_dummy_axis()
+        formatter.create_dummy_axis()
         locator.set_view_interval(*intv)
         locator.set_data_interval(*intv)
-        formatter.create_dummy_axis()
         formatter.set_view_interval(*intv)
         formatter.set_data_interval(*intv)
         b = npy.array(locator())
@@ -580,18 +580,18 @@
     shrink = kw.pop('shrink', 1.0)
     aspect = kw.pop('aspect', 20)
     #pb = transforms.PBox(parent.get_position())
-    pb = transforms.PBox(parent.get_position(original=True))
+    pb = parent.get_position(original=True).frozen()
     if orientation == 'vertical':
         pad = kw.pop('pad', 0.05)
         x1 = 1.0-fraction
         pb1, pbx, pbcb = pb.splitx(x1-pad, x1)
-        pbcb.shrink(1.0, shrink).anchor('C')
+        pbcb = pbcb.shrunk(1.0, shrink).anchored('C', pbcb)
         anchor = (0.0, 0.5)
         panchor = (1.0, 0.5)
     else:
         pad = kw.pop('pad', 0.15)
         pbcb, pbx, pb1 = pb.splity(fraction, fraction+pad)
-        pbcb.shrink(shrink, 1.0).anchor('C')
+        pbcb = pbcb.shrunk(shrink, 1.0).anchored('C', pbcb)
         aspect = 1.0/aspect
         anchor = (0.5, 1.0)
         panchor = (0.5, 0.0)

Modified: branches/transforms/lib/matplotlib/colors.py
===================================================================
--- branches/transforms/lib/matplotlib/colors.py        2007-10-10 13:38:32 UTC 
(rev 3933)
+++ branches/transforms/lib/matplotlib/colors.py        2007-10-11 15:42:53 UTC 
(rev 3934)
@@ -316,7 +316,7 @@
         If the sequence is a list, the list items are changed in place.
         """
         try:
-            return [self.to_rgba(c, alpha)]
+            result = [self.to_rgba(c, alpha)]
         except ValueError:
             # If c is a list it must be maintained as the same list
             # with modified items so that items can be appended to
@@ -325,7 +325,8 @@
                 c = list(c)
             for i, cc in enumerate(c):
                 c[i] = self.to_rgba(cc, alpha)  # change in place
-            return c
+            result = c
+        return npy.asarray(result, npy.float_)
 
 colorConverter = ColorConverter()
 

Modified: branches/transforms/lib/matplotlib/figure.py
===================================================================
--- branches/transforms/lib/matplotlib/figure.py        2007-10-10 13:38:32 UTC 
(rev 3933)
+++ branches/transforms/lib/matplotlib/figure.py        2007-10-11 15:42:53 UTC 
(rev 3934)
@@ -623,11 +623,11 @@
             mag = renderer.get_image_magnification()
             ims = [(im.make_image(mag), im.ox*mag, im.oy*mag)
                    for im in self.images]
-            im = _image.from_images(self.bbox.height()*mag,
-                                    self.bbox.width()*mag,
+            im = _image.from_images(self.bbox.height * mag,
+                                    self.bbox.width * mag,
                                     ims)
             im.is_grayscale = False
-            l, b, w, h = self.bbox.get_bounds()
+            l, b, w, h = self.bbox.bounds
             renderer.draw_image(l, b, im, self.bbox)
 
 

Modified: branches/transforms/lib/matplotlib/image.py
===================================================================
--- branches/transforms/lib/matplotlib/image.py 2007-10-10 13:38:32 UTC (rev 
3933)
+++ branches/transforms/lib/matplotlib/image.py 2007-10-11 15:42:53 UTC (rev 
3934)
@@ -332,8 +332,8 @@
         if self._A is None:
             raise RuntimeError('You must first set the image array')
 
-        x0, y0, v_width, v_height = self.axes.viewLim.get_bounds()
-        l, b, width, height = self.axes.bbox.get_bounds()
+        x0, y0, v_width, v_height = self.axes.viewLim.bounds
+        l, b, width, height = self.axes.bbox.bounds
         width *= magnification
         height *= magnification
         im = _image.pcolor(self._Ax, self._Ay, self._A,

Modified: branches/transforms/lib/matplotlib/legend.py
===================================================================
--- branches/transforms/lib/matplotlib/legend.py        2007-10-10 13:38:32 UTC 
(rev 3933)
+++ branches/transforms/lib/matplotlib/legend.py        2007-10-11 15:42:53 UTC 
(rev 3934)
@@ -38,7 +38,7 @@
 
 def line_cuts_bbox(line, bbox):
     """ Return True if and only if line cuts bbox. """
-    minx, miny, width, height = bbox.get_bounds()
+    minx, miny, width, height = bbox.bounds
     maxx = minx + width
     maxy = miny + height
 
@@ -343,31 +343,27 @@
         bboxes = []
         lines = []
 
-        inv = ax.transAxes.inverse_xy_tup
+        inv = ax.transAxes.inverted().transform
 
         for handle in ax.lines:
             assert isinstance(handle, Line2D)
-
-            xdata = handle.get_xdata(orig=False)
-            ydata = handle.get_ydata(orig=False)
+            data = handle.get_xydata()
             trans = handle.get_transform()
-            xt, yt = trans.numerix_x_y(xdata, ydata)
-
-            # XXX need a special method in transform to do a list of verts
-            averts = [inv(v) for v in zip(xt, yt)]
+            tdata = trans.transform(data)
+            averts = inv(tdata)
             lines.append(averts)
 
         for handle in ax.patches:
             assert isinstance(handle, Patch)
 
-            verts = handle.get_verts()
+            path = handle.get_path()
             trans = handle.get_transform()
-            tverts = trans.seq_xy_tups(verts)
+            tpath = trans.transform_path(path)
+            tverts = tpath.vertices
+            averts = inv(tverts)
 
-            averts = [inv(v) for v in tverts]
-
-            bbox = unit_bbox()
-            bbox.update(averts, True)
+            bbox = Bbox.unit()
+            bbox.update_from_data_xy(averts, True)
             bboxes.append(bbox)
 
         for handle in ax.collections:
@@ -445,22 +441,19 @@
 
         consider = [self._loc_to_axes_coords(x, width, height) for x in 
range(1, len(self.codes))]
 
-        tx, ty = self.legendPatch.xy
+        tx, ty = self.legendPatch.get_x(), self.legendPatch.get_y()
 
         candidates = []
         for l, b in consider:
             legendBox = Bbox.from_lbwh(l, b, width, height)
             badness = 0
             badness = legendBox.count_contains(verts)
-            ox, oy = l-tx, b-ty
-            for bbox in bboxes:
-                if legendBox.overlaps(bbox):
-                    badness += 1
-
+            badness += legendBox.count_overlaps(bboxes)
             for line in lines:
                 if line_cuts_bbox(line, legendBox):
                     badness += 1
 
+            ox, oy = l-tx, b-ty
             if badness == 0:
                 return ox, oy
 
@@ -564,6 +557,4 @@
 
         self._offset(ox, oy)
 
-
-
 #artist.kwdocd['Legend'] = kwdoc(Legend)

Modified: branches/transforms/lib/matplotlib/lines.py
===================================================================
--- branches/transforms/lib/matplotlib/lines.py 2007-10-10 13:38:32 UTC (rev 
3933)
+++ branches/transforms/lib/matplotlib/lines.py 2007-10-11 15:42:53 UTC (rev 
3934)
@@ -350,16 +350,15 @@
         self._picker = p
 
     def get_window_extent(self, renderer):
-        bbox = Bbox()
-        bbox.update_from_data(self.get_transform().transform(self._xy))
-
+        bbox = Bbox.unit()
+        bbox.update_from_data_xy(self.get_transform().transform(self._xy),
+                                 ignore=True)
         # correct for marker size, if any
         if self._marker is not None:
-            ms = self._markersize / 72.0 * self.figure.dpi
-            bbox = Bbox(bbox.get_points() + [[-ms/2.0, ms/2.0]])
+            ms = (self._markersize / 72.0 * self.figure.dpi) * 0.5
+            bbox = Bbox(bbox.get_points() + [[-ms, -ms], [ms, ms]])
         return bbox
 
-
     def set_axes(self, ax):
         Artist.set_axes(self, ax)
         if ax.xaxis is not None:

Modified: branches/transforms/lib/matplotlib/mathtext.py
===================================================================
--- branches/transforms/lib/matplotlib/mathtext.py      2007-10-10 13:38:32 UTC 
(rev 3933)
+++ branches/transforms/lib/matplotlib/mathtext.py      2007-10-11 15:42:53 UTC 
(rev 3934)
@@ -672,7 +672,8 @@
     _slanted_symbols = Set(r"\int \oint".split())
 
     def _get_glyph(self, fontname, sym, fontsize):
-        if fontname in self.fontmap and latex_to_bakoma.has_key(sym):
+        use_default = fontname == 'default' and len(sym) == 1
+        if latex_to_bakoma.has_key(sym) and not use_default:
             basename, num = latex_to_bakoma[sym]
             slanted = (basename == "cmmi10") or sym in self._slanted_symbols
             cached_font = self._get_font(basename)

Modified: branches/transforms/lib/matplotlib/patches.py
===================================================================
--- branches/transforms/lib/matplotlib/patches.py       2007-10-10 13:38:32 UTC 
(rev 3933)
+++ branches/transforms/lib/matplotlib/patches.py       2007-10-11 15:42:53 UTC 
(rev 3934)
@@ -114,6 +114,9 @@
         self._combined_transform = self.get_patch_transform() + \
             artist.Artist.get_transform(self)
 
+    def get_data_transform(self):
+        return artist.Artist.get_transform(self)
+        
     def get_patch_transform(self):
         return transforms.IdentityTransform()
     
@@ -307,8 +310,8 @@
             g = rho*g
             b = rho*b
 
-            self.set_facecolor((r,g,b))
-            self.set_edgecolor((r,g,b))
+            self.set_facecolor((r,g,b,0.5))
+            self.set_edgecolor((r,g,b,0.5))
            
     def get_path(self):
         return self.patch.get_path()
@@ -960,7 +963,7 @@
     pad = props.pop('pad', 4)
     pad = renderer.points_to_pixels(pad)
     bbox = artist.get_window_extent(renderer)
-    l,b,w,h = bbox.get_bounds()
+    l,b,w,h = bbox.bounds
     l-=pad/2.
     b-=pad/2.
     w+=pad

Modified: branches/transforms/lib/matplotlib/ticker.py
===================================================================
--- branches/transforms/lib/matplotlib/ticker.py        2007-10-10 13:38:32 UTC 
(rev 3933)
+++ branches/transforms/lib/matplotlib/ticker.py        2007-10-11 15:42:53 UTC 
(rev 3934)
@@ -118,8 +118,8 @@
     axis = None
     class DummyAxis:
         def __init__(self):
-            self.dataLim = mtransforms.Bbox
-            self.viewLim = mtransforms.Bbox
+            self.dataLim = mtransforms.Bbox.unit()
+            self.viewLim = mtransforms.Bbox.unit()
 
         def get_view_interval(self):
             return self.viewLim.intervalx
@@ -137,7 +137,8 @@
         self.axis = axis
 
     def create_dummy_axis(self):
-        self.axis = self.DummyAxis()
+        if self.axis is None:
+            self.axis = self.DummyAxis()
         
     def set_view_interval(self, vmin, vmax):
         self.axis.set_view_interval(vmin, vmax)
@@ -229,8 +230,8 @@
 
     def __call__(self, x, pos=None):
         'Return the format for tick val x at position pos'
-        self.verify_intervals()
-        d = abs(self.viewInterval.span())
+        xmin, xmax = self.axis.get_view_interval()
+        d = abs(xmax - xmin)
 
         return self.pprint_val(x,d)
 
@@ -322,7 +323,7 @@
                 if self.offset > 0: offsetStr = '+' + offsetStr
             if self.orderOfMagnitude:
                 if self._usetex or self._useMathText:
-                    sciNotStr = 
r'{\times}'+self.format_data(10**self.orderOfMagnitude)
+                    sciNotStr = 
r'\times'+self.format_data(10**self.orderOfMagnitude)
                 else:
                     sciNotStr = u'\xd7'+'1e%d'% self.orderOfMagnitude
             if self._useMathText:
@@ -451,8 +452,8 @@
 
     def __call__(self, x, pos=None):
         'Return the format for tick val x at position pos'
-        self.verify_intervals()
-        d = abs(self.viewInterval.span())
+        vmin, vmax = self.axis.get_view_interval()
+        d = abs(vmax - vmin)
         b=self._base
         # only label the decades
         fx = math.log(x)/math.log(b)
@@ -769,10 +770,7 @@
 
     def __call__(self):
         'Return the locations of the ticks'
-
-        self.verify_intervals()
-
-        vmin, vmax = self.viewInterval.get_bounds()
+        vmin, vmax = self.axis.get_view_interval()
         if vmax<vmin:
             vmin, vmax = vmax, vmin
         vmin = self._base.ge(vmin)
@@ -786,10 +784,8 @@
         Set the view limits to the nearest multiples of base that
         contain the data
         """
+        dmin, dmax = self.axis.get_data_interval()
 
-        self.verify_intervals()
-        dmin, dmax = self.dataInterval.get_bounds()
-
         vmin = self._base.le(dmin)
         vmax = self._base.ge(dmax)
         if vmin==vmax:

Modified: branches/transforms/lib/matplotlib/transforms.py
===================================================================
--- branches/transforms/lib/matplotlib/transforms.py    2007-10-10 13:38:32 UTC 
(rev 3933)
+++ branches/transforms/lib/matplotlib/transforms.py    2007-10-11 15:42:53 UTC 
(rev 3934)
@@ -268,20 +268,24 @@
     def contains(self, x, y):
         return self.containsx(x) and self.containsy(y)
 
-    def overlapsx(self, other):
-        xmin, xmax = other.intervalx
-        return self.containsx(xmin) \
-            or self.containsx(xmax)
+    def overlaps(self, other):
+        ax1, ay1, ax2, ay2 = self._get_lbrt()
+        bx1, by1, bx2, by2 = other._get_lbrt()
 
-    def overlapsy(self, other):
-        ymin, ymax = other.intervaly
-        return self.containsy(ymin) \
-            or self.containsy(ymax)
+        if ax2 < ax1:
+            ax2, ax1 = ax1, ax2
+        if ay2 < ay1:
+            ay2, ay1 = ay1, ay2
+        if bx2 < bx1:
+            bx2, bx1 = bx1, bx2
+        if by2 < by1:
+            by2, by1 = by1, by2
+
+        return not ((bx2 < ax1) or
+                    (by2 < ay1) or
+                    (bx1 > ax2) or
+                    (by1 > ay2))
     
-    def overlaps(self, other):
-        return self.overlapsx(other) \
-            and self.overlapsy(other)
-    
     def fully_containsx(self, x):
         xmin, xmax = self.intervalx
         return ((xmin < xmax
@@ -298,20 +302,24 @@
         return self.fully_containsx(x) \
             and self.fully_containsy(y)
 
-    def fully_overlapsx(self, other):
-        xmin, xmax = other.intervalx
-        return self.fully_containsx(xmin) \
-            or self.fully_containsx(xmax)
-
-    def fully_overlapsy(self, other):
-        ymin, ymax = other.intervaly
-        return self.fully_containsy(ymin) \
-            or self.fully_containsy(ymax)
-    
     def fully_overlaps(self, other):
-        return self.fully_overlapsx(other) and \
-            self.fully_overlapsy(other)
+        ax1, ay1, ax2, ay2 = self._get_lbrt()
+        bx1, by1, bx2, by2 = other._get_lbrt()
 
+        if ax2 < ax1:
+            ax2, ax1 = ax1, ax2
+        if ay2 < ay1:
+            ay2, ay1 = ay1, ay2
+        if bx2 < bx1:
+            bx2, bx1 = bx1, bx2
+        if by2 < by1:
+            by2, by1 = by1, by2
+
+        return not ((bx2 <= ax1) or
+                    (by2 <= ay1) or
+                    (bx1 >= ax2) or
+                    (by1 >= ay2))
+
     def transformed(self, transform):
         """
         Return a new Bbox object, transformed by the given transform.
@@ -324,8 +332,139 @@
         given transform.
         """
         return Bbox(transform.inverted().transform(self.get_points()))
-    
-    
+
+    coefs = {'C':  (0.5, 0.5),
+             'SW': (0,0),
+             'S':  (0.5, 0),
+             'SE': (1.0, 0),
+             'E':  (1.0, 0.5),
+             'NE': (1.0, 1.0),
+             'N':  (0.5, 1.0),
+             'NW': (0, 1.0),
+             'W':  (0, 0.5)}
+    def anchored(self, c, container = None):
+        """
+        Return a copy of the Bbox, shifted to position c within a
+        container.
+
+        c: may be either a) a sequence (cx, cy) where cx, cy range
+        from 0 to 1, where 0 is left or bottom and 1 is right or top;
+        or b) a string: C for centered, S for bottom-center, SE for
+        bottom-left, E for left, etc.
+
+        Optional arg container is the lbwh box within which the BBox
+        is positioned; it defaults to the initial BBox.
+        """
+        if container is None:
+            container = self
+        l, b, w, h = container.bounds
+        if isinstance(c, str):
+            cx, cy = self.coefs[c]
+        else:
+            cx, cy = c
+        L, B, W, H = self.bounds
+        return Bbox(self._points +
+                    [(l + cx * (w-W)) - L,
+                     (b + cy * (h-H)) - B])
+
+    def shrunk(self, mx, my):
+        """
+        Return a copy of the Bbox, shurnk by the factor mx in the x
+        direction and the factor my in the y direction.  The lower
+        left corner of the box remains unchanged.  Normally mx and my
+        will be <= 1, but this is not enforced.
+        """
+        w, h = self.size
+        return Bbox([self._points[0],
+                    self._points[0] + [mx * w, my * h]])
+
+    def shrunk_to_aspect(self, box_aspect, container = None, fig_aspect = 1.0):
+        """
+        Return a copy of the Bbox, shrunk so that it is as large as it
+        can be while having the desired aspect ratio, box_aspect.  If
+        the box coordinates are relative--that is, fractions of a
+        larger box such as a figure--then the physical aspect ratio of
+        that figure is specified with fig_aspect, so that box_aspect
+        can also be given as a ratio of the absolute dimensions, not
+        the relative dimensions.
+        """
+        assert box_aspect > 0 and fig_aspect > 0
+        if container is None:
+            container = self
+        w, h = container.size
+        H = w * box_aspect/fig_aspect
+        if H <= h:
+            W = w
+        else:
+            W = h * fig_aspect/box_aspect
+            H = h
+        return Bbox([self._points[0],
+                     self._points[0] + (W, H)])
+
+    def splitx(self, *args):
+        '''
+        e.g., bbox.splitx(f1, f2, ...)
+
+        Returns a list of new BBoxes formed by
+        splitting the original one with vertical lines
+        at fractional positions f1, f2, ...
+        '''
+        boxes = []
+        xf = [0] + list(args) + [1]
+        l, b, r, t = self.lbrt
+        w = r - l
+        for xf0, xf1 in zip(xf[:-1], xf[1:]):
+            boxes.append(Bbox([[l + xf0 * w, b], [l + xf1 * w, t]]))
+        return boxes
+
+    def splity(self, *args):
+        '''
+        e.g., bbox.splitx(f1, f2, ...)
+
+        Returns a list of new PBoxes formed by
+        splitting the original one with horizontal lines
+        at fractional positions f1, f2, ...
+        '''
+        boxes = []
+        yf = [0] + list(args) + [1]
+        l, b, r, t = self.lbrt
+        h = t - b
+        for yf0, yf1 in zip(yf[:-1], yf[1:]):
+            boxes.append(Bbox([[l, b + yf0 * h], [r, b + yf1 * h]]))
+        return boxes
+
+    def count_contains(self, vertices):
+        if len(vertices) == 0:
+            return 0
+        vertices = npy.asarray(vertices)
+        xmin, ymin, xmax, ymax = self._get_lbrt()
+        dxmin = npy.sign(vertices[:, 0] - xmin)
+        dymin = npy.sign(vertices[:, 1] - ymin)
+        dxmax = npy.sign(vertices[:, 0] - xmax)
+        dymax = npy.sign(vertices[:, 1] - ymax)
+        inside = (abs(dxmin + dxmax) + abs(dymin + dymax)) <= 2
+        return N.sum(inside)
+
+    def count_overlaps(self, bboxes):
+        ax1, ay1, ax2, ay2 = self._get_lbrt()
+        if ax2 < ax1:
+            ax2, ax1 = ax1, ax2
+        if ay2 < ay1:
+            ay2, ay1 = ay1, ay2
+
+        count = 0
+        for bbox in bboxes:
+            bx1, by1, bx2, by2 = bbox._get_lbrt()
+            if bx2 < bx1:
+                bx2, bx1 = bx1, bx2
+            if by2 < by1:
+                by2, by1 = by1, by2
+            count += (not ((bx2 <= ax1) or
+                           (by2 <= ay1) or
+                           (bx1 >= ax2) or
+                           (by1 >= ay2)))
+        return count
+            
 class Bbox(BboxBase):
     def __init__(self, points):
         """
@@ -402,7 +541,7 @@
 
         if len(x) == 0 or len(y) == 0:
             return
-            
+
         if ma.isMaskedArray(x) or ma.isMaskedArray(y):
             xpos = ma.where(x > 0.0, x, npy.inf)
             ypos = ma.where(y > 0.0, y, npy.inf)
@@ -430,6 +569,7 @@
                   max(y.max(), self.ymax)]],
                 npy.float_)
             self._minpos = npy.minimum(minpos, self._minpos)
+
         self.invalidate()
 
     def update_from_data_xy(self, xy, ignore=None):
@@ -544,74 +684,6 @@
         """
         return Bbox(self._points + (tx, ty))
 
-    coefs = {'C':  (0.5, 0.5),
-             'SW': (0,0),
-             'S':  (0.5, 0),
-             'SE': (1.0, 0),
-             'E':  (1.0, 0.5),
-             'NE': (1.0, 1.0),
-             'N':  (0.5, 1.0),
-             'NW': (0, 1.0),
-             'W':  (0, 0.5)}
-    def anchored(self, c, container = None):
-        """
-        Return a copy of the Bbox, shifted to position c within a
-        container.
-
-        c: may be either a) a sequence (cx, cy) where cx, cy range
-        from 0 to 1, where 0 is left or bottom and 1 is right or top;
-        or b) a string: C for centered, S for bottom-center, SE for
-        bottom-left, E for left, etc.
-
-        Optional arg container is the lbwh box within which the BBox
-        is positioned; it defaults to the initial BBox.
-        """
-        if container is None:
-            container = self
-        l, b, w, h = container.bounds
-        if isinstance(c, str):
-            cx, cy = self.coefs[c]
-        else:
-            cx, cy = c
-        L, B, W, H = self.bounds
-        return Bbox(self._points +
-                    [(l + cx * (w-W)) - L,
-                     (b + cy * (h-H)) - B])
-
-    def shrunk(self, mx, my):
-        """
-        Return a copy of the Bbox, shurnk by the factor mx in the x
-        direction and the factor my in the y direction.  The lower
-        left corner of the box remains unchanged.  Normally mx and my
-        will be <= 1, but this is not enforced.
-        """
-        w, h = self.size
-        return Bbox([self._points[0],
-                     self._points[1] - [w - (mx * w), h - (my * h)]])
-
-    def shrunk_to_aspect(self, box_aspect, container = None, fig_aspect = 1.0):
-        """
-        Return a copy of the Bbox, shrunk so that it is as large as it
-        can be while having the desired aspect ratio, box_aspect.  If
-        the box coordinates are relative--that is, fractions of a
-        larger box such as a figure--then the physical aspect ratio of
-        that figure is specified with fig_aspect, so that box_aspect
-        can also be given as a ratio of the absolute dimensions, not
-        the relative dimensions.
-        """
-        assert box_aspect > 0 and fig_aspect > 0
-        if container is None:
-            container = self
-        w, h = container.size
-        H = w * box_aspect/fig_aspect
-        if H <= h:
-            W = w
-        else:
-            W = h * fig_aspect/box_aspect
-            H = h
-        return Bbox([self._points[0],
-                     self._points[0] + (W, H)])
-        
     [EMAIL PROTECTED]
     def union(bboxes):
         """
@@ -1444,6 +1516,7 @@
         return mtx[0, 1] == 0.0 and mtx[1, 0] == 0.0
     is_separable = property(_get_is_separable)
 
+    
 class IdentityTransform(Affine2DBase):
     """
     A special class that does on thing, the identity transform, in a
@@ -1478,10 +1551,10 @@
     transform_path.__doc__ = Affine2DBase.transform_path.__doc__
 
     transform_path_affine = transform_path
-    transform_path_affine = Affine2DBase.transform_path_affine.__doc__
+    transform_path_affine.__doc__ = Affine2DBase.transform_path_affine.__doc__
     
     transform_path_non_affine = transform_path
-    transform_path_non_affine = Affine2DBase.transform_path_non_affine.__doc__
+    transform_path_non_affine.__doc__ = 
Affine2DBase.transform_path_non_affine.__doc__
     
     def get_affine(self):
         return self

Modified: branches/transforms/src/_backend_agg.cpp
===================================================================
--- branches/transforms/src/_backend_agg.cpp    2007-10-10 13:38:32 UTC (rev 
3933)
+++ branches/transforms/src/_backend_agg.cpp    2007-10-11 15:42:53 UTC (rev 
3934)
@@ -605,8 +605,6 @@
     agg::serialized_scanlines_adaptor_aa8::embedded_scanline sl;
 
     while (path_quantized.vertex(&x, &y) != agg::path_cmd_stop) {
-      x += 0.5;
-      y += 0.5;
       //render the fill
       if (face.first) {
        if (has_clippath) {
@@ -948,8 +946,8 @@
   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], false);
-  Py::SeqBase<Py::Object> facecolors_obj   = args[8];
-  Py::SeqBase<Py::Object> edgecolors_obj   = args[9];
+  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];
@@ -960,16 +958,31 @@
   if (!offsets || offsets->dimensions[1] != 2)
     throw Py::ValueError("Offsets array must be Nx2");
 
+  PyArrayObject* facecolors = 
(PyArrayObject*)PyArray_FromObject(facecolors_obj.ptr(), PyArray_DOUBLE, 1, 2);
+  if (!facecolors || 
+      (facecolors->nd == 1 && facecolors->dimensions[0] != 0) || 
+      (facecolors->nd == 2 && facecolors->dimensions[1] != 4))
+    throw Py::ValueError("Facecolors must be a Nx4 numpy array or empty");
+
+  PyArrayObject* edgecolors = 
(PyArrayObject*)PyArray_FromObject(edgecolors_obj.ptr(), PyArray_DOUBLE, 1, 2);
+  if (!edgecolors || 
+      (edgecolors->nd == 1 && edgecolors->dimensions[0] != 0) || 
+      (edgecolors->nd == 2 && edgecolors->dimensions[1] != 4))
+    throw Py::ValueError("Edgecolors must be a Nx4 numpy array");
+
   size_t Npaths             = paths.length();
   size_t Noffsets    = offsets->dimensions[0];
   size_t N          = std::max(Npaths, Noffsets);
   size_t Ntransforms = std::min(transforms_obj.length(), N);
-  size_t Nfacecolors = std::min(facecolors_obj.length(), N);
-  size_t Nedgecolors = std::min(edgecolors_obj.length(), N);
+  size_t Nfacecolors = facecolors->dimensions[0];
+  size_t Nedgecolors = edgecolors->dimensions[0];
   size_t Nlinewidths = linewidths.length();
   size_t Nlinestyles = std::min(linestyles_obj.length(), N);
   size_t Naa        = antialiaseds.length();
 
+  if ((Nfacecolors == 0 && Nedgecolors == 0) || N == 0)
+    return Py::Object();
+
   size_t i        = 0;
 
   // Convert all of the transforms up front
@@ -983,46 +996,6 @@
     transforms.push_back(trans);
   }
 
-  // Convert all of the facecolors up front
-  typedef std::vector<facepair_t> facecolors_t;
-  facecolors_t facecolors;
-  facecolors.resize(Nfacecolors);
-  i = 0;
-  for (facecolors_t::iterator f = facecolors.begin(); 
-       f != facecolors.end(); ++f, ++i) {
-    double r, g, b, a;
-    const Py::Object& facecolor_obj = facecolors_obj[i];
-    if (facecolor_obj.ptr() == Py_None)
-      f->first = false;
-    else {
-      Py::SeqBase<Py::Float> facergba = facecolor_obj;
-      r = Py::Float(facergba[0]);
-      g = Py::Float(facergba[1]);
-      b = Py::Float(facergba[2]);
-      a = 1.0;
-      if (facergba.size() == 4)
-       a = Py::Float(facergba[3]);
-      f->first = true;
-      f->second = agg::rgba(r, g, b, a);
-    }
-  }
-
-  // Convert all of the edgecolors up front
-  typedef std::vector<agg::rgba> edgecolors_t;
-  edgecolors_t edgecolors;
-  edgecolors.reserve(Nedgecolors);
-  for (i = 0; i < Nedgecolors; ++i) {
-    double r, g, b, a;
-    Py::SeqBase<Py::Float> edgergba(edgecolors_obj[i]);
-    r = Py::Float(edgergba[0]);
-    g = Py::Float(edgergba[1]);
-    b = Py::Float(edgergba[2]);
-    a = 1.0;
-    if (edgergba.size() == 4)
-      a = Py::Float(edgergba[3]);
-    edgecolors.push_back(agg::rgba(r, g, b, a));
-  }
-
   // Convert all the dashes up front
   typedef std::vector<std::pair<double, GCAgg::dash_t> > dashes_t;
   dashes_t dashes;
@@ -1039,6 +1012,11 @@
   set_clipbox(cliprect, theRasterizer);
   bool has_clippath = render_clippath(clippath, clippath_trans);
 
+  // Set some defaults, assuming no face or edge
+  gc.linewidth = 0.0;
+  facepair_t face;
+  face.first = Nfacecolors != 0;
+
   for (i = 0; i < N; ++i) {
     PathIterator path(paths[i % Npaths]);
     bool snap = (path.total_vertices() == 2);
@@ -1047,11 +1025,26 @@
     offset_trans.transform(&xo, &yo);
     agg::trans_affine_translation transOffset(xo, yo);
     agg::trans_affine& trans = transforms[i % Ntransforms];
-    facepair_t& face         = facecolors[i % Nfacecolors];
-    gc.color                = edgecolors[i % Nedgecolors];
-    gc.linewidth            = double(Py::Float(linewidths[i % Nlinewidths])) * 
dpi/72.0;
-    gc.dashes               = dashes[i % Nlinestyles].second;
-    gc.dashOffset           = dashes[i % Nlinestyles].first;
+
+    if (Nfacecolors) {
+      size_t fi = i % Nfacecolors;
+      face.second            = agg::rgba(*(double*)PyArray_GETPTR2(facecolors, 
fi, 0),
+                                        *(double*)PyArray_GETPTR2(facecolors, 
fi, 1),
+                                        *(double*)PyArray_GETPTR2(facecolors, 
fi, 2),
+                                        *(double*)PyArray_GETPTR2(facecolors, 
fi, 3));
+    }
+
+    if (Nedgecolors) {
+      size_t ei = i % Nedgecolors;
+      gc.color               = agg::rgba(*(double*)PyArray_GETPTR2(edgecolors, 
ei, 0),
+                                        *(double*)PyArray_GETPTR2(edgecolors, 
ei, 1),
+                                        *(double*)PyArray_GETPTR2(edgecolors, 
ei, 2),
+                                        *(double*)PyArray_GETPTR2(edgecolors, 
ei, 3));
+      gc.linewidth          = double(Py::Float(linewidths[i % Nlinewidths])) * 
dpi/72.0;
+      gc.dashes                     = dashes[i % Nlinestyles].second;
+      gc.dashOffset         = dashes[i % Nlinestyles].first;
+    }
+
     gc.isaa                 = bool(Py::Int(antialiaseds[i % Naa]));
     _draw_path(path, trans * transOffset, snap, has_clippath, face, gc);
   }
@@ -1400,16 +1393,17 @@
 template<class T>
 bool point_in_path_impl(double tx, double ty, T& path) {
   int yflag0, yflag1, inside_flag;
-  double vtx0, vty0, vtx1, vty1;
+  double vtx0, vty0, vtx1, vty1, sx, sy;
   double x, y;
 
   path.rewind(0);
-  if (path.vertex(&x, &y) == agg::path_cmd_stop)
+  unsigned code = path.vertex(&x, &y);
+  if (code == agg::path_cmd_stop)
     return false;
 
   while (true) {
-    vtx0 = x;
-    vty0 = y;
+    sx = vtx0 = x;
+    sy = vty0 = y;
 
     // get test bit for above/below X axis
     yflag0 = (vty0 >= ty);
@@ -1419,14 +1413,13 @@
 
     inside_flag = 0;
     while (true) {
-      unsigned code = path.vertex(&x, &y);
-      if (code == agg::path_cmd_stop)
-       return false;
+      code = path.vertex(&x, &y);
+
       // The following cases denote the beginning on a new subpath
-      if ((code & agg::path_cmd_end_poly) == agg::path_cmd_end_poly)
+      if ((code & agg::path_cmd_end_poly) == agg::path_cmd_end_poly) {
+       x = sx; y = sy;
+      } else if (code == agg::path_cmd_move_to)
        break;
-      if (code == agg::path_cmd_move_to)
-       break;
       
       yflag1 = (vty1 >= ty);
       // Check if endpoints straddle (are on opposite sides) of X axis
@@ -1459,10 +1452,17 @@
        
       vtx1 = x;
       vty1 = y;
+
+      if (code == agg::path_cmd_stop || 
+         (code & agg::path_cmd_end_poly) == agg::path_cmd_end_poly)
+       break;
     }
 
     if (inside_flag != 0)
       return true;
+
+    if (code == agg::path_cmd_stop)
+      return false;
   }
 
   return false;
@@ -1641,15 +1641,18 @@
   agg::trans_affine      master_transform = 
py_to_agg_transformation_matrix(args[3]);
   Py::SeqBase<Py::Object> paths                   = args[4];
   Py::SeqBase<Py::Object> transforms_obj   = args[5];
-  Py::SeqBase<Py::Object> offsets          = args[6];
-  agg::trans_affine       offset_trans     = 
py_to_agg_transformation_matrix(args[7], false);
-  Py::SeqBase<Py::Object> facecolors       = args[8];
+  Py::SeqBase<Py::Object> offsets_obj      = args[6];
+  agg::trans_affine       offset_trans     = 
py_to_agg_transformation_matrix(args[7]);
+  bool                    filled           = Py::Int(args[8]);
   
+  PyArrayObject* offsets = 
(PyArrayObject*)PyArray_FromObject(offsets_obj.ptr(), PyArray_DOUBLE, 2, 2);
+  if (!offsets || offsets->dimensions[1] != 2)
+    throw Py::ValueError("Offsets array must be Nx2");
+
   size_t Npaths             = paths.length();
-  size_t Noffsets    = offsets.length();
+  size_t Noffsets    = offsets->dimensions[0];
   size_t N          = std::max(Npaths, Noffsets);
   size_t Ntransforms = std::min(transforms_obj.length(), N);
-  size_t Ncolors     = facecolors.length();
   size_t i;
 
   // Convert all of the transforms up front
@@ -1668,19 +1671,18 @@
   for (i = 0; i < N; ++i) {
     PathIterator path(paths[i % Npaths]);
     
-    Py::SeqBase<Py::Float> offset = Py::SeqBase<Py::Float>(offsets[i % 
Noffsets]);
-    double xo                = Py::Float(offset[0]);
-    double yo                = Py::Float(offset[1]);
+    double xo = *(double*)PyArray_GETPTR2(offsets, i % Noffsets, 0);
+    double yo = *(double*)PyArray_GETPTR2(offsets, i % Noffsets, 1);
     offset_trans.transform(&xo, &yo);
     agg::trans_affine_translation transOffset(xo, yo);
-    agg::trans_affine trans = transforms[i % Ntransforms] * transOffset;
+    agg::trans_affine trans = transforms[i % Ntransforms];
+    trans *= transOffset;
 
-    const Py::Object& facecolor_obj = facecolors[i & Ncolors];
-    if (facecolor_obj.ptr() == Py_None) {
-      if (::point_on_path(x, y, radius, path, trans))
+    if (filled) {
+      if (::point_in_path(x, y, path, trans))
        result.append(Py::Int((int)i));
     } else {
-      if (::point_in_path(x, y, path, trans))
+      if (::point_on_path(x, y, radius, path, trans))
        result.append(Py::Int((int)i));
     }
   }

Modified: branches/transforms/src/_backend_agg.h
===================================================================
--- branches/transforms/src/_backend_agg.h      2007-10-10 13:38:32 UTC (rev 
3933)
+++ branches/transforms/src/_backend_agg.h      2007-10-11 15:42:53 UTC (rev 
3934)
@@ -247,7 +247,7 @@
     add_varargs_method("get_path_collection_extents", 
&_backend_agg_module::get_path_collection_extents,
                       "get_path_collection_extents(trans, paths, transforms, 
offsets, offsetTrans)");
     add_varargs_method("point_in_path_collection", 
&_backend_agg_module::point_in_path_collection,
-                      "point_in_path_collection(x, y, r, trans, paths, 
transforms, offsets, offsetTrans, colors)");
+                      "point_in_path_collection(x, y, r, trans, paths, 
transforms, offsets, offsetTrans, filled)");
 
     initialize( "The agg rendering backend" );
   }


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

-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems?  Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
_______________________________________________
Matplotlib-checkins mailing list
Matplotlib-checkins@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-checkins

Reply via email to