Revision: 8472
          http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8472&view=rev
Author:   leejjoon
Date:     2010-06-27 02:07:17 +0000 (Sun, 27 Jun 2010)

Log Message:
-----------
_get_unsampled_image now returns a sliced image if possible

Modified Paths:
--------------
    trunk/matplotlib/lib/matplotlib/image.py

Modified: trunk/matplotlib/lib/matplotlib/image.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/image.py    2010-06-26 19:29:48 UTC (rev 
8471)
+++ trunk/matplotlib/lib/matplotlib/image.py    2010-06-27 02:07:17 UTC (rev 
8472)
@@ -24,7 +24,7 @@
 # the image namespace:
 from matplotlib._image import *
 
-from matplotlib.transforms import BboxBase
+from matplotlib.transforms import BboxBase, Bbox
 import matplotlib.transforms as mtransforms
 
 class _AxesImageBase(martist.Artist, cm.ScalarMappable):
@@ -135,7 +135,7 @@
         raise RuntimeError('The make_image method must be overridden.')
 
 
-    def _get_unsampled_image(self, A, image_extents, viewlim, noslice=False):
+    def _get_unsampled_image(self, A, image_extents, viewlim):
         """
         convert numpy array A with given extents ([x1, x2, y1, y2] in
         data coordinate) into the Image, given the vielim (should be a
@@ -150,7 +150,7 @@
         sx = dxintv/viewlim.width
         sy = dyintv/viewlim.height
         numrows, numcols = A.shape[:2]
-        if noslice is False and sx > 2:
+        if sx > 2:
             x0 = (viewlim.x0-xmin)/dxintv * numcols
             ix0 = max(0, int(x0 - self._filterrad))
             x1 = (viewlim.x1-xmin)/dxintv * numcols
@@ -164,7 +164,7 @@
         else:
             xslice = slice(0, numcols)
 
-        if noslice is False and sy > 2:
+        if sy > 2:
             y0 = (viewlim.y0-ymin)/dyintv * numrows
             iy0 = max(0, int(y0 - self._filterrad))
             y1 = (viewlim.y1-ymin)/dyintv * numrows
@@ -248,9 +248,57 @@
         """
 
 
+        trans = self.get_transform() #axes.transData
+
+        # convert the coordinates to the intermediate coordinate (ic).
+        # The transformation from the ic to the canvas is a pure
+        # affine transfor.
+
+        # A straight-forward way is to use the non-affine part of the
+        # original transform for conversion to the ic.
+
+        # firs, convert the image extent to the ic
+        x_llc, x_trc, y_llc, y_trc = self.get_extent()
+
+        xy = trans.transform_non_affine(np.array([(x_llc, y_llc),
+                                                  (x_trc, y_trc)]))
+
+        _xx1, _yy1 = xy[0]
+        _xx2, _yy2 = xy[1]
+
+        extent_in_ic = _xx1, _xx2, _yy1, _yy2
+
+        # define trans_ic_to_canvas : unless _image_skew_coordinate is
+        # set, it is simply a affine part of the original transform.
+        if self._image_skew_coordinate:
+            # skew the image when required.
+            x_lrc, y_lrc = self._image_skew_coordinate
+            xy2 = trans.transform_non_affine(np.array([(x_lrc, y_lrc)]))
+            _xx3, _yy3 = xy2[0]
+
+            tr_rotate_skew = self._get_rotate_and_skew_transform(_xx1, _yy1,
+                                                                 _xx2, _yy2,
+                                                                 _xx3, _yy3)
+            trans_ic_to_canvas = tr_rotate_skew+trans.get_affine()
+        else:
+            trans_ic_to_canvas = trans.get_affine()
+
+        # Now, viewLim in the ic.  It can be roated and can be
+        # skewed. Make it big enough.
+        x1, y1, x2, y2 = self.axes.bbox.extents
+        trans_canvas_to_ic = trans_ic_to_canvas.inverted()
+        xy_ = trans_canvas_to_ic.transform(np.array([(x1, y1),
+                                                     (x2, y1),
+                                                     (x2, y2),
+                                                     (x1, y2)]))
+        x1_, x2_ = min(xy_[:,0]), max(xy_[:,0])
+        y1_, y2_ = min(xy_[:,1]), max(xy_[:,1])
+        viewLim_in_ic =  Bbox.from_extents(x1_, y1_, x2_, y2_)
+
+
+        # get the image, sliced if necessary. This is done in the ic.
         im, xmin, ymin, dxintv, dyintv, sx, sy = \
-            self._get_unsampled_image(self._A, self.get_extent(),
-                                      self.axes.viewLim, noslice=True)
+            self._get_unsampled_image(self._A, extent_in_ic, viewLim_in_ic)
 
         if im is None: return # I'm not if this check is required. -JJL
 
@@ -262,35 +310,16 @@
         im.reset_matrix()
         numrows, numcols = im.get_size()
 
-        im.resize(numcols, numrows) # just to create im.bufOut that is 
required by backends. There may be better solution -JJL
+        im.resize(numcols, numrows) # just to create im.bufOut that
+                                    # is required by backends. There
+                                    # may be better solution -JJL
 
         im._url = self.get_url()
 
-        trans = self.get_transform() #axes.transData
-        xy = trans.transform_non_affine(np.array([(xmin, ymin),
-                                                  (xmin+dxintv, ymin+dyintv)]))
-        xx1, yy1 = xy[0]
-        xx2, yy2 = xy[1]
+        renderer.draw_image(gc, xmin, ymin, im, dxintv, dyintv,
+                            trans_ic_to_canvas)
 
-        if self._image_skew_coordinate:
-            # skew the image when required.
-            x_llc, x_trc, y_llc, y_trc = self.get_extent()
-            x_lrc, y_lrc = self._image_skew_coordinate
-            xy = trans.transform_non_affine(np.array([(x_llc, y_llc),
-                                                      (x_trc, y_trc),
-                                                      (x_lrc, y_lrc)]))
-            _xx1, _yy1 = xy[0]
-            _xx2, _yy2 = xy[1]
-            _xx3, _yy3 = xy[2]
 
-            tr_rotate_skew = self._get_rotate_and_skew_transform(_xx1, _yy1, 
_xx2, _yy2, _xx3, _yy3)
-            tr = tr_rotate_skew+trans.get_affine()
-        else:
-            tr = trans.get_affine()
-
-        renderer.draw_image(gc, xx1, yy1, im, xx2-xx1, yy2-yy1, tr)
-
-
     def _check_unsampled_image(self, renderer):
         """
         return True if the image is better to be drawn unsampled.


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 Sprint
What will you do first with EVO, the first 4G phone?
Visit sprint.com/first -- http://p.sf.net/sfu/sprint-com-first
_______________________________________________
Matplotlib-checkins mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/matplotlib-checkins

Reply via email to