Revision: 4469
http://matplotlib.svn.sourceforge.net/matplotlib/?rev=4469&view=rev
Author: mdboom
Date: 2007-11-27 09:40:45 -0800 (Tue, 27 Nov 2007)
Log Message:
-----------
Fix memory leak and increase performance in quadmesh drawing (Agg)
Modified Paths:
--------------
branches/transforms/lib/matplotlib/collections.py
branches/transforms/src/_backend_agg.cpp
Modified: branches/transforms/lib/matplotlib/collections.py
===================================================================
--- branches/transforms/lib/matplotlib/collections.py 2007-11-27 17:34:20 UTC
(rev 4468)
+++ branches/transforms/lib/matplotlib/collections.py 2007-11-27 17:40:45 UTC
(rev 4469)
@@ -163,10 +163,8 @@
xs = self.convert_xunits(self._offsets[:0])
ys = self.convert_yunits(self._offsets[:1])
offsets = zip(xs, ys)
- if len(offsets) == 0:
- offsets = npy.array([], npy.float_)
- else:
- offsets = npy.asarray(offsets, npy.float_)
+
+ offsets = npy.asarray(offsets, npy.float_)
self.update_scalarmappable()
@@ -389,10 +387,12 @@
self._bbox = transforms.Bbox.unit()
self._bbox.update_from_data_xy(coordinates.reshape(
((meshWidth + 1) * (meshHeight + 1), 2)))
+
+ # By converting to floats now, we can avoid that on every draw.
+ self._coordinates = self._coordinates.reshape((meshHeight + 1,
meshWidth + 1, 2))
+ self._coordinates = npy.array(self._coordinates, npy.float_)
def get_paths(self, dataTrans=None):
- import pdb
- pdb.set_trace()
if self._paths is None:
self._paths = self.convert_mesh_to_paths(
self._meshWidth, self._meshHeight, self._coordinates)
@@ -402,7 +402,7 @@
def convert_mesh_to_paths(meshWidth, meshHeight, coordinates):
Path = mpath.Path
- c = coordinates.reshape((meshHeight + 1, meshWidth + 1, 2))
+ c = coordinates
# We could let the Path constructor generate the codes for us,
# but this is faster, since we know they'll always be the same
codes = npy.array(
@@ -436,10 +436,7 @@
ys = self.convert_yunits(self._offsets[:1])
offsets = zip(xs, ys)
- if len(offsets) == 0:
- offsets = npy.array([], npy.float_)
- else:
- offsets = npy.asarray(offsets, npy.float_)
+ offsets = npy.asarray(offsets, npy.float_)
if self.check_update('array'):
self.update_scalarmappable()
Modified: branches/transforms/src/_backend_agg.cpp
===================================================================
--- branches/transforms/src/_backend_agg.cpp 2007-11-27 17:34:20 UTC (rev
4468)
+++ branches/transforms/src/_backend_agg.cpp 2007-11-27 17:40:45 UTC (rev
4469)
@@ -1113,8 +1113,9 @@
inline unsigned vertex(unsigned idx, double* x, double* y) {
size_t m = m_m + offsets[idx][0];
size_t n = m_n + offsets[idx][1];
- *x = *(double*)PyArray_GETPTR3(m_coordinates, m, n, 0);
- *y = *(double*)PyArray_GETPTR3(m_coordinates, m, n, 1);
+ double* pair = (double*)PyArray_GETPTR2(m_coordinates, m, n);
+ *x = *pair++;
+ *y = *pair;
return (idx == 0) ? agg::path_cmd_move_to : agg::path_cmd_line_to;
}
@@ -1130,10 +1131,6 @@
inline unsigned total_vertices() {
return 5;
}
-
- inline bool has_curves() {
- return false;
- }
};
public:
@@ -1146,11 +1143,7 @@
throw Py::ValueError("Invalid coordinates array.");
}
- PyArray_Dims shape;
- npy_intp dims[] = { meshHeight + 1, meshWidth + 1, 2 };
- shape.ptr = dims;
- shape.len = 3;
- m_coordinates = (PyArrayObject*)PyArray_Newshape(coordinates_array,
&shape, PyArray_CORDER);
+ m_coordinates = coordinates_array;
}
inline ~QuadMeshGenerator() {
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