Revision: 3958
          http://matplotlib.svn.sourceforge.net/matplotlib/?rev=3958&view=rev
Author:   mdboom
Date:     2007-10-16 12:39:57 -0700 (Tue, 16 Oct 2007)

Log Message:
-----------
figlegends work now.  (Phew!)  Rendering quality fixes drawing
axis-aligned line segments in Agg.

Modified Paths:
--------------
    branches/transforms/PASSED_DEMOS
    branches/transforms/lib/matplotlib/axes.py
    branches/transforms/lib/matplotlib/backend_bases.py
    branches/transforms/lib/matplotlib/backends/backend_ps.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/transforms.py
    branches/transforms/src/_backend_agg.cpp
    branches/transforms/src/_backend_agg.h

Modified: branches/transforms/PASSED_DEMOS
===================================================================
--- branches/transforms/PASSED_DEMOS    2007-10-16 14:41:29 UTC (rev 3957)
+++ branches/transforms/PASSED_DEMOS    2007-10-16 19:39:57 UTC (rev 3958)
@@ -35,26 +35,26 @@
 color_demo.py          O
 colours.py             [???]
 contour_demo.py                O
-contourf_demo.py       [FLOATING POINT EXCEPTION]
-contour_image.py       [FLOATING POINT EXCEPTION]
+contourf_demo.py       O
+contour_image.py       O
 coords_demo.py         O
 coords_report.py       O
 csd_demo.py            O
 cursor_demo.py         O
-custom_figure_class.py  [EXCEPT FOR PS OUTPUT]
+custom_figure_class.py  O
 customize_rc.py
 custom_ticker1.py      O
 dannys_example.py      [REQUIRES NUMERIC]
 dash_control.py                O
 dashpointlabel.py      O
-dashtick.py
+dashtick.py            O
 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]
+date_demo_convert.py   O
+date_demo_rrule.py     O
+date_index_formatter.py O
 dynamic_collection.py   O
 dynamic_demo.py                [GTK]
 dynamic_demo_wx.py     [WX]
@@ -77,7 +77,7 @@
 errorbar_demo.py       O
 errorbar_limits.py     O       
 figimage_demo.py       O
-figlegend_demo.py      [HORRIBLY BROKEN]
+figlegend_demo.py      O
 figtext.py             O
 fill_between_posneg.py O
 fill_between.py                O
@@ -94,7 +94,7 @@
 glyph_to_path.py       [Requires PIL]
 gradient_bar.py                O
 gtk_spreadsheet.py             
-hatch_demo.py          [Requires PS]
+hatch_demo.py          O
 histogram_demo_canvasagg.py [???]
 histogram_demo.py      O
 image_demo2.py         O

Modified: branches/transforms/lib/matplotlib/axes.py
===================================================================
--- branches/transforms/lib/matplotlib/axes.py  2007-10-16 14:41:29 UTC (rev 
3957)
+++ branches/transforms/lib/matplotlib/axes.py  2007-10-16 19:39:57 UTC (rev 
3958)
@@ -1248,7 +1248,10 @@
             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)
+            renderer.draw_image(
+                l, b, im, self.bbox,
+                self.axesPatch.get_path(),
+                self.axesPatch.get_transform())
 
         artists.extend(self.collections)
         artists.extend(self.patches)
@@ -4379,6 +4382,7 @@
         im.set_data(X)
         im.set_alpha(alpha)
         self._set_artist_props(im)
+        im.set_clip_path(self.axesPatch)
         #if norm is None and shape is None:
         #    im.set_clim(vmin, vmax)
         if vmin is not None or vmax is not None:

Modified: branches/transforms/lib/matplotlib/backend_bases.py
===================================================================
--- branches/transforms/lib/matplotlib/backend_bases.py 2007-10-16 14:41:29 UTC 
(rev 3957)
+++ branches/transforms/lib/matplotlib/backend_bases.py 2007-10-16 19:39:57 UTC 
(rev 3958)
@@ -68,7 +68,7 @@
         Nlinestyles = len(linestyles)
         Naa         = len(antialiaseds)
 
-        if (Nfacecolors == 0 and Nedgecolors == 0) or N == 0:
+        if (Nfacecolors == 0 and Nedgecolors == 0) or Npaths == 0:
             return
         
         ttransforms = []
@@ -113,7 +113,7 @@
         """
         return 1.0
 
-    def draw_image(self, x, y, im, bbox):
+    def draw_image(self, x, y, im, bbox, clippath=None, clippath_trans=None):
         """
         Draw the Image instance into the current axes; x is the
         distance in pixels from the left hand side of the canvas. y is

Modified: branches/transforms/lib/matplotlib/backends/backend_ps.py
===================================================================
--- branches/transforms/lib/matplotlib/backends/backend_ps.py   2007-10-16 
14:41:29 UTC (rev 3957)
+++ branches/transforms/lib/matplotlib/backends/backend_ps.py   2007-10-16 
19:39:57 UTC (rev 3958)
@@ -371,7 +371,7 @@
         """
         return self.image_magnification
 
-    def draw_image(self, x, y, im, bbox):
+    def draw_image(self, x, y, im, bbox, clippath=None, clippath_trans=None):
         """
         Draw the Image instance into the current axes; x is the
         distance in pixels from the left hand side of the canvas and y
@@ -397,9 +397,16 @@
         figh = self.height*72
         #print 'values', origin, flipud, figh, h, y
 
+        clip = []
         if bbox is not None:
             clipx,clipy,clipw,cliph = bbox.bounds
-            clip = '%s clipbox' % _nums_to_str(clipw, cliph, clipx, clipy)
+            clip.append('%s clipbox' % _nums_to_str(clipw, cliph, clipx, 
clipy))
+        if clippath is not None:
+            print "clippath"
+            id = self._get_clip_path(clippath, clippath_trans)
+            clip.append('%s' % id)
+        clip = '\n'.join(clip)
+            
         #y = figh-(y+h)
         ps = """gsave
 %(clip)s
@@ -507,7 +514,7 @@
         Nlinestyles = len(linestyles)
         Naa         = len(antialiaseds)
 
-        if (Nfacecolors == 0 and Nedgecolors == 0) or N == 0:
+        if (Nfacecolors == 0 and Nedgecolors == 0) or Npaths == 0:
             return
         
         for i in range(Ntpaths):

Modified: branches/transforms/lib/matplotlib/figure.py
===================================================================
--- branches/transforms/lib/matplotlib/figure.py        2007-10-16 14:41:29 UTC 
(rev 3957)
+++ branches/transforms/lib/matplotlib/figure.py        2007-10-16 19:39:57 UTC 
(rev 3958)
@@ -627,7 +627,8 @@
                                     ims)
             im.is_grayscale = False
             l, b, w, h = self.bbox.bounds
-            renderer.draw_image(l, b, im, self.bbox)
+            renderer.draw_image(l, b, im, self.bbox,
+                                *self.get_transformed_clip_path_and_affine())
 
 
         # render the axes
@@ -702,7 +703,6 @@
 
         handles = flatten(handles)
         l = Legend(self, handles, labels, *args, **kwargs)
-        self._set_artist_props(l)
         self.legends.append(l)
         return l
 

Modified: branches/transforms/lib/matplotlib/image.py
===================================================================
--- branches/transforms/lib/matplotlib/image.py 2007-10-16 14:41:29 UTC (rev 
3957)
+++ branches/transforms/lib/matplotlib/image.py 2007-10-16 19:39:57 UTC (rev 
3958)
@@ -181,7 +181,8 @@
         if not self.get_visible(): return
         im = self.make_image(renderer.get_image_magnification())
         l, b, widthDisplay, heightDisplay = self.axes.bbox.bounds
-        renderer.draw_image(l, b, im, self.axes.bbox.frozen())
+        renderer.draw_image(l, b, im, self.axes.bbox.frozen(),
+                            *self.get_transformed_clip_path_and_affine())
 
     def contains(self, mouseevent):
         """Test whether the mouse event occured within the image.
@@ -481,7 +482,8 @@
     def draw(self, renderer, *args, **kwargs):
         if not self.get_visible(): return
         im = self.make_image()
-        renderer.draw_image(self.ox, self.oy, im, self.figure.bbox)
+        renderer.draw_image(self.ox, self.oy, im, self.figure.bbox,
+                            *self.get_transformed_clip_path_and_affine())
 
     def write_png(self, fname):
         """Write the image to png file with fname"""

Modified: branches/transforms/lib/matplotlib/legend.py
===================================================================
--- branches/transforms/lib/matplotlib/legend.py        2007-10-16 14:41:29 UTC 
(rev 3957)
+++ branches/transforms/lib/matplotlib/legend.py        2007-10-16 19:39:57 UTC 
(rev 3958)
@@ -165,7 +165,8 @@
             raise TypeError("Legend needs either Axes or Figure as parent")
         self.parent = parent
         self._offsetTransform = Affine2D()
-        self.set_transform( self._offsetTransform + BboxTransform(Bbox.unit(), 
parent.bbox) )
+        self._parentTransform = BboxTransform(Bbox.unit(), parent.bbox)
+        Artist.set_transform(self, self._offsetTransform + 
self._parentTransform)
         
         if loc is None:
             loc = rcParams["legend.loc"]
@@ -192,6 +193,12 @@
 
         self._loc = loc
 
+        self.legendPatch = Rectangle(
+            xy=(0.0, 0.0), width=0.5, height=0.5,
+            facecolor='w', edgecolor='k',
+            )
+        self._set_artist_props(self.legendPatch)
+
         # make a trial box in the middle of the axes.  relocate it
         # based on it's bbox
         left, top = 0.5, 0.5
@@ -203,20 +210,6 @@
         self.texts = self._get_texts(labels, textleft, top)
         self.legendHandles = self._get_handles(handles, self.texts)
 
-
-        if len(self.texts):
-            left, top = self.texts[-1].get_position()
-            HEIGHT = self._approx_text_height()*len(self.texts)
-        else:
-            HEIGHT = 0.2
-
-        bottom = top-HEIGHT
-        left -= self.handlelen + self.handletextsep + self.pad
-        self.legendPatch = Rectangle(
-            xy=(left, bottom), width=0.5, height=HEIGHT,
-            facecolor='w', edgecolor='k',
-            )
-        self._set_artist_props(self.legendPatch)
         self._drawFrame = True
 
     def _set_artist_props(self, a):
@@ -282,6 +275,7 @@
                 legline.update_from(handle)
                 self._set_artist_props(legline) # after update
                 legline.set_clip_box(None)
+                legline.set_clip_path(self.legendPatch)
                 
legline.set_markersize(self.markerscale*legline.get_markersize())
 
                 ret.append(legline)
@@ -293,12 +287,14 @@
                 p.update_from(handle)
                 self._set_artist_props(p)
                 p.set_clip_box(None)
+                p.set_clip_path(self.legendPatch)
                 ret.append(p)
             elif isinstance(handle, LineCollection):
                 ydata = (y-HEIGHT/2)*npy.ones(self._xdata.shape, float)
                 legline = Line2D(self._xdata, ydata)
                 self._set_artist_props(legline)
                 legline.set_clip_box(None)
+                legline.set_clip_path(self.legendPatch)
                 lw = handle.get_linewidth()[0]
                 dashes = handle.get_dashes()
                 color = handle.get_colors()[0]
@@ -316,6 +312,7 @@
                     p.set_edgecolor(handle._edgecolors[0])
                 self._set_artist_props(p)
                 p.set_clip_box(None)
+                p.set_clip_path(self.legendPatch)
                 ret.append(p)
 
             else:
@@ -536,7 +533,7 @@
                 handle.set_height(h/2)
 
         # Set the data for the legend patch
-        bbox = self._get_handle_text_bbox(renderer).frozen()
+        bbox = self._get_handle_text_bbox(renderer)
 
         bbox = bbox.expanded(1 + self.pad, 1 + self.pad)
         l, b, w, h = bbox.bounds

Modified: branches/transforms/lib/matplotlib/lines.py
===================================================================
--- branches/transforms/lib/matplotlib/lines.py 2007-10-16 14:41:29 UTC (rev 
3957)
+++ branches/transforms/lib/matplotlib/lines.py 2007-10-16 19:39:57 UTC (rev 
3958)
@@ -748,7 +748,7 @@
        
     def _draw_diamond(self, renderer, gc, path, path_trans):
         side = renderer.points_to_pixels(self._markersize)
-       transform = Affine2D().translate(0.5, 0.5).rotate_deg(45).scale(side)
+       transform = Affine2D().translate(-0.5, -0.5).rotate_deg(45).scale(side)
         rgbFace = self._get_rgb_face()
        renderer.draw_markers(gc, Path.unit_rectangle(), transform,
                              path, path_trans, rgbFace)
@@ -756,8 +756,8 @@
        
     def _draw_thin_diamond(self, renderer, gc, path, path_trans):
         offset = renderer.points_to_pixels(self._markersize)
-       transform = Affine2D().translate(0.5, 0.5) \
-           .rotate_deg(45).scale(offset * 0.8, offset)
+       transform = Affine2D().translate(-0.5, -0.5) \
+           .rotate_deg(45).scale(offset * 0.6, offset)
         rgbFace = self._get_rgb_face()
        renderer.draw_markers(gc, Path.unit_rectangle(), transform,
                              path, path_trans, rgbFace)

Modified: branches/transforms/lib/matplotlib/transforms.py
===================================================================
--- branches/transforms/lib/matplotlib/transforms.py    2007-10-16 14:41:29 UTC 
(rev 3957)
+++ branches/transforms/lib/matplotlib/transforms.py    2007-10-16 19:39:57 UTC 
(rev 3958)
@@ -822,7 +822,7 @@
         raise TypeError(
             "Can not add Transform to object of type '%s'" % type(other))
 
-    def __array__(self):
+    def __array__(self, *args, **kwargs):
         """
         Used by C/C++ -based backends to get at the array matrix data.
         """

Modified: branches/transforms/src/_backend_agg.cpp
===================================================================
--- branches/transforms/src/_backend_agg.cpp    2007-10-16 14:41:29 UTC (rev 
3957)
+++ branches/transforms/src/_backend_agg.cpp    2007-10-16 19:39:57 UTC (rev 
3958)
@@ -99,7 +99,7 @@
  the C++ representation as a std::vector<std::pair<double, double> >
  (GCAgg::dash_t)
 */
-void convert_dashes(const Py::Tuple& dashes, bool snap, double dpi, 
GCAgg::dash_t& dashes_out, 
+void convert_dashes(const Py::Tuple& dashes, double dpi, GCAgg::dash_t& 
dashes_out, 
                    double& dashOffset_out) {
   if (dashes.length()!=2)
     throw Py::ValueError(Printf("Dash descriptor must be a length 2 tuple; 
found %d", dashes.length()).str());
@@ -124,10 +124,6 @@
   for (size_t i = 0; i < Ndash; i += 2) {
     val0 = double(Py::Float(dashSeq[i])) * dpi/72.0;
     val1 = double(Py::Float(dashSeq[i+1])) * dpi/72.0;
-    if (snap) {
-      val0 = (int)val0 + 0.5;
-      val1 = (int)val1 + 0.5;
-    }
     dashes_out.push_back(std::make_pair(val0, val1));
   }
 }
@@ -143,8 +139,6 @@
   conv_quantize(VertexSource& source, bool quantize) :
     m_source(&source), m_quantize(quantize) {}
   
-  void set_source(VertexSource& source) { m_source = &source; }
-
   void rewind(unsigned path_id) { 
     m_source->rewind(path_id); 
   }
@@ -158,18 +152,14 @@
     return cmd;
   }
 
-  void activate(bool quantize) {
-    m_quantize = quantize;
-  }
-
 private:
   VertexSource* m_source;
   bool m_quantize;
 };
 
 
-GCAgg::GCAgg(const Py::Object &gc, double dpi, bool snapto) :
-  dpi(dpi), snapto(snapto), isaa(true), linewidth(1.0), alpha(1.0),
+GCAgg::GCAgg(const Py::Object &gc, double dpi) :
+  dpi(dpi), isaa(true), linewidth(1.0), alpha(1.0),
   dashOffset(0.0)
 {
   _VERBOSE("GCAgg::GCAgg");
@@ -184,8 +174,8 @@
   _set_clip_path(gc);
 }
 
-GCAgg::GCAgg(double dpi, bool snapto) :
-  dpi(dpi), snapto(snapto), isaa(true), linewidth(1.0), alpha(1.0),
+GCAgg::GCAgg(double dpi) :
+  dpi(dpi), isaa(true), linewidth(1.0), alpha(1.0),
   dashOffset(0.0)
 {
 
@@ -260,7 +250,7 @@
     return;
   }
 
-  convert_dashes(dash_obj, snapto, dpi, dashes, dashOffset);
+  convert_dashes(dash_obj, dpi, dashes, dashOffset);
 }
 
 void
@@ -435,17 +425,31 @@
 bool should_snap(Path& path, const agg::trans_affine& trans) {
   // If this is a straight horizontal or vertical line, quantize to nearest 
   // pixels
-  bool snap = false;
-  if (path.total_vertices() == 2) {
-    double x0, y0, x1, y1;
-    path.vertex(0, &x0, &y0);
-    trans.transform(&x0, &y0);
-    path.vertex(1, &x1, &y1);
+  double x0, y0, x1, y1;
+  unsigned code;
+  code = path.vertex(&x0, &y0);
+  trans.transform(&x0, &y0);
+
+  while ((code = path.vertex(&x1, &y1)) != agg::path_cmd_stop) {
+
+    switch (code) {
+    case agg::path_cmd_curve3:
+    case agg::path_cmd_curve4:
+      path.rewind(0);
+      return false;
+    }
+
     trans.transform(&x1, &y1);
-    snap = (fabs(x0 - x1) < 1.0 || fabs(y0 - y1) < 1.0);
+    if (!(fabs(x0 - x1) < 0.1 || fabs(y0 - y1) < 0.1)) {
+      path.rewind(0);
+      return false;
+    }
+    x0 = x1;
+    y0 = y1;
   }
 
-  return snap;
+  path.rewind(0);
+  return true;
 }
 
 Py::Object
@@ -563,10 +567,10 @@
   curve_t marker_path_curve(marker_path_transformed);
 
   PathIterator path(path_obj);
+  bool snap = should_snap(path, trans);
   transformed_path_t path_transformed(path, trans);
-  // bool snap = should_snap(path, trans);
-  GCAgg gc = GCAgg(gc_obj, dpi, true);
-  quantize_t path_quantized(path_transformed, true);
+  GCAgg gc = GCAgg(gc_obj, dpi);
+  quantize_t path_quantized(path_transformed, snap);
   path_quantized.rewind(0);
 
   facepair_t face = _get_rgba_face(face_obj, gc.alpha);
@@ -793,31 +797,37 @@
 Py::Object
 RendererAgg::draw_image(const Py::Tuple& args) {
   _VERBOSE("RendererAgg::draw_image");
-  args.verify_length(4);
+  args.verify_length(4, 6);
   
   float x = Py::Float(args[0]);
   float 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;
+  if (args.size() == 6) {
+    clippath = args[4];
+    clippath_trans = py_to_agg_transformation_matrix(args[5]);
+  }
+ 
   theRasterizer->reset_clipping();
   rendererBase->reset_clipping(true);
   set_clipbox(box_obj, rendererBase);
-  
+
+  Py::Tuple empty;
   pixfmt pixf(*(image->rbufOut));
-  
-  
-  Py::Tuple empty;
   image->flipud_out(empty);
+
   rendererBase->blend_from(pixf, 0, (int)x, (int)(height-(y+image->rowsOut)));
+
   image->flipud_out(empty);
   
   return Py::Object();
 }
 
 void RendererAgg::_draw_path(PathIterator& path, agg::trans_affine trans, 
-                           bool snap, bool has_clippath, 
-                           const facepair_t& face, const GCAgg& gc) {
+                            bool has_clippath, const facepair_t& face, 
+                            const GCAgg& gc) {
   typedef agg::conv_transform<PathIterator>                 transformed_path_t;
   typedef conv_quantize<transformed_path_t>                 quantize_t;
   typedef agg::conv_curve<quantize_t>                       curve_t;
@@ -833,6 +843,7 @@
   trans *= agg::trans_affine_translation(0.0, (double)height);
 
   // Build the transform stack
+  bool snap = should_snap(path, trans);
   transformed_path_t tpath(path, trans);
   quantize_t quantized(tpath, snap);
   // Benchmarking shows that there is no noticable slowdown to always
@@ -871,25 +882,36 @@
 
   // Render stroke
   if (gc.linewidth != 0.0) {
+    double linewidth = gc.linewidth;
+    if (snap)
+      linewidth = round(linewidth);
+
     if (gc.dashes.size() == 0) {
       stroke_t stroke(curve);
-      stroke.width(gc.linewidth);
+      stroke.width(linewidth);
       stroke.line_cap(gc.cap);
       stroke.line_join(gc.join);
       theRasterizer->add_path(stroke);
     } else {
       dash_t dash(curve);
       for (GCAgg::dash_t::const_iterator i = gc.dashes.begin();
-          i != gc.dashes.end(); ++i)
-       dash.add_dash(i->first, i->second);
+          i != gc.dashes.end(); ++i) {
+       double val0 = i->first;
+       double val1 = i->second;
+       if (snap) {
+         val0 = (int)val0 + 0.5;
+         val1 = (int)val1 + 0.5;
+       }
+       dash.add_dash(val0, val1);
+      } 
       stroke_dash_t stroke(dash);
       stroke.line_cap(gc.cap);
       stroke.line_join(gc.join);
-      stroke.width(gc.linewidth);
+      stroke.width(linewidth);
       theRasterizer->add_path(stroke);
     }
     
-    if (gc.isaa && !(snap && gc.linewidth < 1.5)) {
+    if (gc.isaa && !(snap)) {
       if (has_clippath) {
        pixfmt_amask_type pfa(*pixFmt, *alphaMask);
        amask_ren_type r(pfa);
@@ -928,8 +950,7 @@
     face_obj = args[3];
 
   PathIterator path(path_obj);
-  bool snap = should_snap(path, trans);
-  GCAgg gc = GCAgg(gc_obj, dpi, snap);
+  GCAgg gc = GCAgg(gc_obj, dpi);
   facepair_t face = _get_rgba_face(face_obj, gc.alpha);
   
   theRasterizer->reset_clipping();
@@ -937,7 +958,7 @@
   set_clipbox(gc.cliprect, theRasterizer);
   bool has_clippath = render_clippath(gc.clippath, gc.clippath_trans);
 
-  _draw_path(path, trans, snap, has_clippath, face, gc);
+  _draw_path(path, trans, has_clippath, face, gc);
   
   return Py::Object();
 }
@@ -962,7 +983,7 @@
   Py::SeqBase<Py::Object> linestyles_obj   = args[11];
   Py::SeqBase<Py::Int>    antialiaseds    = args[12];
   
-  GCAgg gc(dpi, false);
+  GCAgg gc(dpi);
 
   PyArrayObject* offsets    = NULL;
   PyArrayObject* facecolors = NULL;
@@ -973,13 +994,15 @@
     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);
+    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);
+    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))
@@ -995,10 +1018,10 @@
     size_t Nlinestyles = std::min(linestyles_obj.length(), N);
     size_t Naa        = antialiaseds.length();
 
-    if ((Nfacecolors == 0 && Nedgecolors == 0) || N == 0)
+    if ((Nfacecolors == 0 && Nedgecolors == 0) || Npaths == 0)
       return Py::Object();
     
-    size_t i        = 0;
+    size_t i = 0;
     
     // Convert all of the transforms up front
     typedef std::vector<agg::trans_affine> transforms_t;
@@ -1018,7 +1041,7 @@
     i = 0;
     for (dashes_t::iterator d = dashes.begin(); 
         d != dashes.end(); ++d, ++i) {
-      convert_dashes(Py::Tuple(linestyles_obj[i]), false, dpi, d->second, 
d->first);
+      convert_dashes(Py::Tuple(linestyles_obj[i]), dpi, d->second, d->first);
     }
     
     // Handle any clipping globally
@@ -1034,34 +1057,34 @@
     
     for (i = 0; i < N; ++i) {
       PathIterator path(paths[i % Npaths]);
-      bool snap = (path.total_vertices() == 2);
-      double xo                = *(double*)PyArray_GETPTR2(offsets, i % 
Noffsets, 0);
-      double yo                = *(double*)PyArray_GETPTR2(offsets, i % 
Noffsets, 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];
       
       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));
+       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.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);
+      gc.isaa = bool(Py::Int(antialiaseds[i % Naa]));
+
+      _draw_path(path, trans * transOffset, has_clippath, face, gc);
     }
   } catch (...) {
     Py_XDECREF(offsets);

Modified: branches/transforms/src/_backend_agg.h
===================================================================
--- branches/transforms/src/_backend_agg.h      2007-10-16 14:41:29 UTC (rev 
3957)
+++ branches/transforms/src/_backend_agg.h      2007-10-16 19:39:57 UTC (rev 
3958)
@@ -109,11 +109,10 @@
 
 class GCAgg {
 public:
-  GCAgg(const Py::Object& gc, double dpi, bool snapto=false);
-  GCAgg(double dpi, bool snapto=false);
+  GCAgg(const Py::Object& gc, double dpi);
+  GCAgg(double dpi);
 
   double dpi;
-  bool snapto;
   bool isaa;
 
   agg::line_cap_e cap;
@@ -219,8 +218,7 @@
   void set_clipbox(Py::Object& cliprect, R rasterizer);
   bool render_clippath(const Py::Object& clippath, const agg::trans_affine& 
clippath_trans);
   void _draw_path(PathIterator& path, agg::trans_affine trans, 
-                 bool snap, bool has_clippath, 
-                 const facepair_t& face, const GCAgg& gc);
+                 bool has_clippath, const facepair_t& face, const GCAgg& gc);
 
 private:
   Py::Object lastclippath;


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