Revision: 8118
          http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8118&view=rev
Author:   leejjoon
Date:     2010-02-08 16:54:26 +0000 (Mon, 08 Feb 2010)

Log Message:
-----------
RendererAgg.draw_image supports affine transform

Modified Paths:
--------------
    trunk/matplotlib/examples/api/demo_affine_image.py
    trunk/matplotlib/lib/matplotlib/backends/backend_agg.py
    trunk/matplotlib/src/_backend_agg.cpp

Modified: trunk/matplotlib/examples/api/demo_affine_image.py
===================================================================
--- trunk/matplotlib/examples/api/demo_affine_image.py  2010-02-08 16:00:23 UTC 
(rev 8117)
+++ trunk/matplotlib/examples/api/demo_affine_image.py  2010-02-08 16:54:26 UTC 
(rev 8118)
@@ -3,7 +3,7 @@
 
 """
 For the backends that supports draw_image with optional affine
-transform (e.g., ps backend), the image of the output should
+transform (e.g., agg, ps backend), the image of the output should
 have its boundary matches the red rectangles.
 """
 
@@ -33,7 +33,8 @@
     ax = plt.subplot(111)
     Z = get_image()
     im = imshow_affine(ax, Z, interpolation='nearest', cmap=cm.jet,
-                       origin='lower', extent=[-2, 4, -3, 2])
+                       origin='lower',
+                       extent=[-2, 4, -3, 2], clip_on=True)
 
     trans_data2 = mtransforms.Affine2D().rotate_deg(30) + ax.transData
     im.set_transform(trans_data2)
@@ -48,4 +49,5 @@
     ax.set_xlim(-3, 5)
     ax.set_ylim(-4, 4)
 
-    plt.savefig("demo_affine_image")
+    plt.show()
+    #plt.savefig("demo_affine_image")

Modified: trunk/matplotlib/lib/matplotlib/backends/backend_agg.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/backends/backend_agg.py     2010-02-08 
16:00:23 UTC (rev 8117)
+++ trunk/matplotlib/lib/matplotlib/backends/backend_agg.py     2010-02-08 
16:54:26 UTC (rev 8118)
@@ -261,6 +261,12 @@
         # with the Agg backend
         return True
 
+    def option_scale_image(self):
+        """
+        agg backend support arbitrary scaling of image.
+        """
+        return True
+
     def restore_region(self, region, bbox=None, xy=None):
         """
         restore the saved region. if bbox (instance of BboxBase, or

Modified: trunk/matplotlib/src/_backend_agg.cpp
===================================================================
--- trunk/matplotlib/src/_backend_agg.cpp       2010-02-08 16:00:23 UTC (rev 
8117)
+++ trunk/matplotlib/src/_backend_agg.cpp       2010-02-08 16:54:26 UTC (rev 
8118)
@@ -814,55 +814,99 @@
 RendererAgg::draw_image(const Py::Tuple& args) {
   _VERBOSE("RendererAgg::draw_image");
 
-  args.verify_length(4);
+  args.verify_length(4, 7); // 7 if affine matrix if given
 
   GCAgg gc(args[0], dpi);
-  double x = mpl_round(Py::Float(args[1]));
-  double y = mpl_round(Py::Float(args[2]));
   Image *image = static_cast<Image*>(args[3].ptr());
   bool has_clippath = false;
+  agg::trans_affine affine_trans;
+  bool has_affine = false;
+  double x, y, w, h;
 
+
+  if (args.size() == 7) {
+    has_affine = true;
+    x = Py::Float(args[1]);
+    y = Py::Float(args[2]);
+    w = Py::Float(args[4]);
+    h = Py::Float(args[5]);
+    affine_trans = py_to_agg_transformation_matrix(args[6].ptr());
+  } else {
+    x = mpl_round(Py::Float(args[1]));
+    y = mpl_round(Py::Float(args[2]));
+  }
+
+
   theRasterizer.reset_clipping();
   rendererBase.reset_clipping(true);
+  set_clipbox(gc.cliprect, theRasterizer);
   has_clippath = render_clippath(gc.clippath, gc.clippath_trans);
 
   Py::Tuple empty;
   image->flipud_out(empty);
   pixfmt pixf(*(image->rbufOut));
 
-  if (has_clippath) {
+  if (has_affine | has_clippath) {
     agg::trans_affine mtx;
-    mtx *= agg::trans_affine_translation((int)x, 
(int)(height-(y+image->rowsOut)));
+    agg::path_storage rect;
 
-    agg::path_storage rect;
+    if (has_affine) {
+      mtx *= agg::trans_affine_scaling(1, -1);
+      mtx *= agg::trans_affine_translation(0, image->rowsOut);
+      mtx *= agg::trans_affine_scaling(w/(image->colsOut), h/(image->rowsOut));
+      mtx *= agg::trans_affine_translation(x, y);
+      mtx *= affine_trans;
+      mtx *= agg::trans_affine_scaling(1.0, -1.0);
+      mtx *= agg::trans_affine_translation(0.0, (double) height);
+    } else {
+      mtx *= agg::trans_affine_translation((int)x, 
(int)(height-(y+image->rowsOut)));
+    }
+
     rect.move_to(0, 0);
     rect.line_to(image->colsOut, 0);
     rect.line_to(image->colsOut, image->rowsOut);
     rect.line_to(0, image->rowsOut);
     rect.line_to(0, 0);
+
     agg::conv_transform<agg::path_storage> rect2(rect, mtx);
 
     agg::trans_affine inv_mtx(mtx);
     inv_mtx.invert();
 
+
     typedef agg::span_allocator<agg::rgba8> color_span_alloc_type;
-    typedef agg::pixfmt_amask_adaptor<pixfmt, alpha_mask_type> 
pixfmt_amask_type;
-    typedef agg::renderer_base<pixfmt_amask_type> amask_ren_type;
     typedef agg::image_accessor_clip<agg::pixfmt_rgba32> image_accessor_type;
     typedef agg::span_interpolator_linear<> interpolator_type;
     typedef agg::span_image_filter_rgba_nn<image_accessor_type, 
interpolator_type> image_span_gen_type;
-    typedef agg::renderer_scanline_aa<amask_ren_type, color_span_alloc_type, 
image_span_gen_type> renderer_type;
 
+
     color_span_alloc_type sa;
     image_accessor_type ia(pixf, agg::rgba8(0, 0, 0, 0));
     interpolator_type interpolator(inv_mtx);
     image_span_gen_type image_span_generator(ia, interpolator);
-    pixfmt_amask_type pfa(pixFmt, alphaMask);
-    amask_ren_type r(pfa);
-    renderer_type ri(r, sa, image_span_generator);
 
-    theRasterizer.add_path(rect2);
-    agg::render_scanlines(theRasterizer, slineP8, ri);
+
+    if (has_clippath) {
+      typedef agg::pixfmt_amask_adaptor<pixfmt, alpha_mask_type> 
pixfmt_amask_type;
+      typedef agg::renderer_base<pixfmt_amask_type> amask_ren_type;
+      typedef agg::renderer_scanline_aa<amask_ren_type, color_span_alloc_type, 
image_span_gen_type> renderer_type_alpha;
+      
+      pixfmt_amask_type pfa(pixFmt, alphaMask);
+      amask_ren_type r(pfa);
+      renderer_type_alpha ri(r, sa, image_span_generator);
+
+      theRasterizer.add_path(rect2);
+      agg::render_scanlines(theRasterizer, slineP8, ri);
+    } else {
+      typedef agg::renderer_base<pixfmt> ren_type;
+      typedef agg::renderer_scanline_aa<ren_type, color_span_alloc_type, 
image_span_gen_type> renderer_type;
+      ren_type r(pixFmt);
+      renderer_type ri(r, sa, image_span_generator);
+
+      theRasterizer.add_path(rect2);
+      agg::render_scanlines(theRasterizer, slineP8, ri);
+    }
+
   } else {
     set_clipbox(gc.cliprect, rendererBase);
     rendererBase.blend_from(pixf, 0, (int)x, (int)(height-(y+image->rowsOut)));
@@ -873,6 +917,9 @@
   return Py::Object();
 }
 
+
+
+
 template<class path_t>
 void RendererAgg::_draw_path(path_t& path, bool has_clippath,
                              const facepair_t& face, const GCAgg& gc) {


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

------------------------------------------------------------------------------
The Planet: dedicated and managed hosting, cloud storage, colocation
Stay online with enterprise data centers and the best network in the business
Choose flexible plans and management services without long-term contracts
Personal 24x7 support from experience hosting pros just a phone call away.
http://p.sf.net/sfu/theplanet-com
_______________________________________________
Matplotlib-checkins mailing list
Matplotlib-checkins@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-checkins

Reply via email to