Revision: 4324
          http://matplotlib.svn.sourceforge.net/matplotlib/?rev=4324&view=rev
Author:   mdboom
Date:     2007-11-15 13:13:52 -0800 (Thu, 15 Nov 2007)

Log Message:
-----------
Speed up auto-legend.

Modified Paths:
--------------
    branches/transforms/lib/matplotlib/legend.py
    branches/transforms/lib/matplotlib/patches.py
    branches/transforms/lib/matplotlib/transforms.py
    branches/transforms/src/_path.cpp

Modified: branches/transforms/lib/matplotlib/legend.py
===================================================================
--- branches/transforms/lib/matplotlib/legend.py        2007-11-15 21:12:54 UTC 
(rev 4323)
+++ branches/transforms/lib/matplotlib/legend.py        2007-11-15 21:13:52 UTC 
(rev 4324)
@@ -340,29 +340,26 @@
         bboxes = []
         lines = []
 
-        inv = ax.transAxes.inverted().transform
+        inverse_transform = ax.transAxes.inverted()
 
         for handle in ax.lines:
             assert isinstance(handle, Line2D)
             data = handle.get_xydata()
             trans = handle.get_transform()
             tdata = trans.transform(data)
-            averts = inv(tdata)
+            averts = inverse_transform.transform(tdata)
             lines.append(averts)
 
         for handle in ax.patches:
             assert isinstance(handle, Patch)
 
-            path = handle.get_path()
-            trans = handle.get_transform()
-            tpath = trans.transform_path(path)
-            tverts = tpath.vertices
-            averts = inv(tverts)
+            if isinstance(handle, Rectangle):
+                transform = handle.get_data_transform() + inverse_transform
+                bboxes.append(handle._bbox.transformed(transform))
+            else:
+                transform = handle.get_transform() + inverse_transform
+                bboxes.append(handle.get_path().get_extents(transform))
 
-            bbox = Bbox.unit()
-            bbox.update_from_data_xy(averts, True)
-            bboxes.append(bbox)
-
         return [vertices, bboxes, lines]
 
     def draw_frame(self, b):

Modified: branches/transforms/lib/matplotlib/patches.py
===================================================================
--- branches/transforms/lib/matplotlib/patches.py       2007-11-15 21:12:54 UTC 
(rev 4323)
+++ branches/transforms/lib/matplotlib/patches.py       2007-11-15 21:13:52 UTC 
(rev 4324)
@@ -103,6 +103,9 @@
         self.set_figure(other.get_figure())
         self.set_alpha(other.get_alpha())
 
+    def get_extents(self):
+        return self.get_path().get_extents(self.get_transform())
+        
     def get_transform(self):
         return self._combined_transform
 

Modified: branches/transforms/lib/matplotlib/transforms.py
===================================================================
--- branches/transforms/lib/matplotlib/transforms.py    2007-11-15 21:12:54 UTC 
(rev 4323)
+++ branches/transforms/lib/matplotlib/transforms.py    2007-11-15 21:13:52 UTC 
(rev 4324)
@@ -32,6 +32,7 @@
 
 import cbook
 from path import Path
+from _path import count_bboxes_overlapping_bbox
 
 DEBUG = False
 if DEBUG:
@@ -93,16 +94,16 @@
         Invalidate this transform node and all of its parents.  Should
         be called anytime the transform changes.
         """
-        # Shortcut: If self is already invalid, that means its parents
-        # are as well, so we don't need to do anything.
-        if self._invalid or not len(self._parents):
-            return
-
         # If we are an affine transform being changed, we can set the
         # flag to INVALID_AFFINE_ONLY
         value = ((self.is_affine or self.is_bbox)
                  and self.INVALID_AFFINE
                  or self.INVALID)
+
+        # Shortcut: If self is already invalid, that means its parents
+        # are as well, so we don't need to do anything.
+        if self._invalid == value or not len(self._parents):
+            return
         
         # Invalidate all ancestors of self using pseudo-recursion.
         parent = None
@@ -194,10 +195,12 @@
     read-only access to its data.
     """
     is_bbox = True
-    
-    def __init__(self):
-        TransformNode.__init__(self)
 
+    #* Redundant: Removed for performance
+    #
+    # def __init__(self):
+    #     TransformNode.__init__(self)
+
     if DEBUG:
         def _check(points):
             if ma.isMaskedArray(points):
@@ -896,10 +899,12 @@
 
     # True if this transform is separable in the x- and y- dimensions.
     is_separable = False
-    
-    def __init__(self):
-        TransformNode.__init__(self)
 
+    #* Redundant: Removed for performance
+    #
+    # def __init__(self):
+    #     TransformNode.__init__(self)
+
     def __add__(self, other):
         """
         Composes two transforms together such that self is followed by other.
@@ -1171,8 +1176,10 @@
     input_dims = 2
     output_dims = 2
 
-    def __init__(self):
-        AffineBase.__init__(self)
+    #* Redundant: Removed for performance
+    #
+    # def __init__(self):
+    #     Affine2DBase.__init__(self)
 
     def frozen(self):
         return Affine2D(self.get_matrix().copy())

Modified: branches/transforms/src/_path.cpp
===================================================================
--- branches/transforms/src/_path.cpp   2007-11-15 21:12:54 UTC (rev 4323)
+++ branches/transforms/src/_path.cpp   2007-11-15 21:13:52 UTC (rev 4324)
@@ -41,6 +41,8 @@
                       "clip_path_to_rect(path, bbox, inside)");
     add_varargs_method("affine_transform", &_path_module::affine_transform,
                       "affine_transform(vertices, transform)");
+    add_varargs_method("count_bboxes_overlapping_bbox", 
&_path_module::count_bboxes_overlapping_bbox,
+                      "count_bboxes_overlapping_bbox(bbox, bboxes)");
     
     initialize("Helper functions for paths");
   }
@@ -57,6 +59,7 @@
   Py::Object path_in_path(const Py::Tuple& args);
   Py::Object clip_path_to_rect(const Py::Tuple& args);
   Py::Object affine_transform(const Py::Tuple& args);
+  Py::Object count_bboxes_overlapping_bbox(const Py::Tuple& args);
 };
 
 //
@@ -736,6 +739,46 @@
   return Py::Object((PyObject*)result, true);
 }
 
+Py::Object _path_module::count_bboxes_overlapping_bbox(const Py::Tuple& args) {
+  args.verify_length(2);
+  
+  Py::Object             bbox   = args[0];
+  Py::SeqBase<Py::Object> bboxes = args[1];
+  
+  double ax0, ay0, ax1, ay1;
+  double bx0, by0, bx1, by1;
+  long count = 0;
+
+  if (py_convert_bbox(bbox.ptr(), ax0, ay0, ax1, ay1)) {
+    if (ax1 < ax0)
+      std::swap(ax0, ax1);
+    if (ay1 < ay0)
+      std::swap(ay0, ay1);
+
+    size_t num_bboxes = bboxes.size();
+    for (size_t i = 0; i < num_bboxes; ++i) {
+      Py::Object bbox_b = bboxes[i];
+      if (py_convert_bbox(bbox_b.ptr(), bx0, by0, bx1, by1)) {
+       if (bx1 < bx0)
+         std::swap(bx0, bx1);
+       if (by1 < by0)
+         std::swap(by0, by1);
+       if (not ((bx1 <= ax0) or
+                (by1 <= ay0) or
+                (bx0 >= ax1) or
+                (by0 >= ay1)))
+         ++count;
+      } else {
+       throw Py::ValueError("Non-bbox object in bboxes list");
+      }
+    }
+  } else {
+    throw Py::ValueError("First argument to count_bboxes_overlapping_bbox must 
be a Bbox object.");
+  }
+
+  return Py::Int(count);
+}
+
 extern "C"
 DL_EXPORT(void)
   init_path(void)


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: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2005.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
Matplotlib-checkins mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/matplotlib-checkins

Reply via email to