Revision: 6057
          http://matplotlib.svn.sourceforge.net/matplotlib/?rev=6057&view=rev
Author:   efiring
Date:     2008-09-01 21:06:34 +0000 (Mon, 01 Sep 2008)

Log Message:
-----------
Bilinear interp in NonUniformImage; slightly modified patch by Gregory Lielens
Includes a bugfix in _image.pcolor2.
Replaced pylab_examples/pcolor_nonuniform.py with the more
aptly-named image_nonuniform.py, modified it to show both
interpolation types, and added it to backend_driver.py.

Modified Paths:
--------------
    trunk/matplotlib/examples/tests/backend_driver.py
    trunk/matplotlib/lib/matplotlib/image.py
    trunk/matplotlib/src/_image.cpp

Added Paths:
-----------
    trunk/matplotlib/examples/pylab_examples/image_nonuniform.py

Removed Paths:
-------------
    trunk/matplotlib/examples/pylab_examples/pcolor_nonuniform.py

Added: trunk/matplotlib/examples/pylab_examples/image_nonuniform.py
===================================================================
--- trunk/matplotlib/examples/pylab_examples/image_nonuniform.py                
                (rev 0)
+++ trunk/matplotlib/examples/pylab_examples/image_nonuniform.py        
2008-09-01 21:06:34 UTC (rev 6057)
@@ -0,0 +1,55 @@
+'''
+This illustrates the NonUniformImage class, which still needs
+an axes method interface; either a separate interface, or a
+generalization of imshow.
+'''
+
+from matplotlib.pyplot import figure, show
+import numpy as np
+from matplotlib.image import NonUniformImage
+
+interp='nearest'
+
+x = np.linspace(-4, 4, 9)
+x2 = x**3
+y = np.linspace(-4, 4, 9)
+print 'Size %d points' % (len(x) * len(y))
+z = np.sqrt(x[np.newaxis,:]**2 + y[:,np.newaxis]**2)
+
+fig = figure()
+fig.suptitle('NonUniformImage class')
+ax = fig.add_subplot(221)
+im = NonUniformImage(ax, interpolation=interp, extent=(-4,4,-4,4))
+im.set_data(x, y, z)
+ax.images.append(im)
+ax.set_xlim(-4,4)
+ax.set_ylim(-4,4)
+ax.set_title(interp)
+
+ax = fig.add_subplot(222)
+im = NonUniformImage(ax, interpolation=interp, extent=(-64,64,-4,4))
+im.set_data(x2, y, z)
+ax.images.append(im)
+ax.set_xlim(-64,64)
+ax.set_ylim(-4,4)
+ax.set_title(interp)
+
+interp = 'bilinear'
+
+ax = fig.add_subplot(223)
+im = NonUniformImage(ax, interpolation=interp, extent=(-4,4,-4,4))
+im.set_data(x, y, z)
+ax.images.append(im)
+ax.set_xlim(-4,4)
+ax.set_ylim(-4,4)
+ax.set_title(interp)
+
+ax = fig.add_subplot(224)
+im = NonUniformImage(ax, interpolation=interp, extent=(-64,64,-4,4))
+im.set_data(x2, y, z)
+ax.images.append(im)
+ax.set_xlim(-64,64)
+ax.set_ylim(-4,4)
+ax.set_title(interp)
+
+show()

Deleted: trunk/matplotlib/examples/pylab_examples/pcolor_nonuniform.py
===================================================================
--- trunk/matplotlib/examples/pylab_examples/pcolor_nonuniform.py       
2008-08-30 10:11:37 UTC (rev 6056)
+++ trunk/matplotlib/examples/pylab_examples/pcolor_nonuniform.py       
2008-09-01 21:06:34 UTC (rev 6057)
@@ -1,26 +0,0 @@
-from matplotlib.pyplot import figure, show
-import numpy as np
-from matplotlib.image import NonUniformImage
-
-x = np.arange(-4, 4, 0.005)
-y = np.arange(-4, 4, 0.005)
-print 'Size %d points' % (len(x) * len(y))
-z = np.sqrt(x[np.newaxis,:]**2 + y[:,np.newaxis]**2)
-
-fig = figure()
-ax = fig.add_subplot(111)
-im = NonUniformImage(ax, extent=(-4,4,-4,4))
-im.set_data(x, y, z)
-ax.images.append(im)
-ax.set_xlim(-4,4)
-ax.set_ylim(-4,4)
-
-fig2 = figure()
-ax = fig2.add_subplot(111)
-x2 = x**3
-im = NonUniformImage(ax, extent=(-64,64,-4,4))
-im.set_data(x2, y, z)
-ax.images.append(im)
-ax.set_xlim(-64,64)
-ax.set_ylim(-4,4)
-show()

Modified: trunk/matplotlib/examples/tests/backend_driver.py
===================================================================
--- trunk/matplotlib/examples/tests/backend_driver.py   2008-08-30 10:11:37 UTC 
(rev 6056)
+++ trunk/matplotlib/examples/tests/backend_driver.py   2008-09-01 21:06:34 UTC 
(rev 6057)
@@ -66,6 +66,7 @@
     'image_demo2.py',
     'image_masked.py',
     'image_origin.py',
+    'image_nonuniform.py',
     'invert_axes.py',
     'layer_images.py',
     'legend_auto.py',

Modified: trunk/matplotlib/lib/matplotlib/image.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/image.py    2008-08-30 10:11:37 UTC (rev 
6056)
+++ trunk/matplotlib/lib/matplotlib/image.py    2008-09-01 21:06:34 UTC (rev 
6057)
@@ -392,13 +392,14 @@
     def __init__(self, ax,
                  **kwargs
                 ):
+        interp = kwargs.pop('interpolation', 'nearest')
         AxesImage.__init__(self, ax,
                            **kwargs)
+        AxesImage.set_interpolation(self, interp)
 
     def make_image(self, magnification=1.0):
         if self._A is None:
             raise RuntimeError('You must first set the image array')
-
         x0, y0, v_width, v_height = self.axes.viewLim.bounds
         l, b, r, t = self.axes.bbox.extents
         width = (round(r) + 0.5) - (round(l) - 0.5)
@@ -407,10 +408,13 @@
         height *= magnification
         im = _image.pcolor(self._Ax, self._Ay, self._A,
                            height, width,
-                           (x0, x0+v_width, y0, y0+v_height))
+                           (x0, x0+v_width, y0, y0+v_height),
+                           self._interpd[self._interpolation])
+
         fc = self.axes.patch.get_facecolor()
         bg = mcolors.colorConverter.to_rgba(fc, 0)
         im.set_bg(*bg)
+        im.is_grayscale = self.is_grayscale
         return im
 
     def set_data(self, x, y, A):
@@ -430,9 +434,11 @@
         if len(A.shape) == 2:
             if A.dtype != np.uint8:
                 A = (self.cmap(self.norm(A))*255).astype(np.uint8)
+                self.is_grayscale = self.cmap.is_gray()
             else:
                 A = np.repeat(A[:,:,np.newaxis], 4, 2)
                 A[:,:,3] = 255
+                self.is_grayscale = True
         else:
             if A.dtype != np.uint8:
                 A = (255*A).astype(np.uint8)
@@ -441,6 +447,7 @@
                 B[:,:,0:3] = A
                 B[:,:,3] = 255
                 A = B
+            self.is_grayscale = False
         self._A = A
         self._Ax = x
         self._Ay = y
@@ -450,8 +457,8 @@
         raise NotImplementedError('Method not supported')
 
     def set_interpolation(self, s):
-        if s != None and s != 'nearest':
-            raise NotImplementedError('Only nearest neighbor supported')
+        if s != None and not s in ('nearest','bilinear'):
+            raise NotImplementedError('Only nearest neighbor and bilinear 
interpolations are supported')
         AxesImage.set_interpolation(self, s)
 
     def get_extent(self):

Modified: trunk/matplotlib/src/_image.cpp
===================================================================
--- trunk/matplotlib/src/_image.cpp     2008-08-30 10:11:37 UTC (rev 6056)
+++ trunk/matplotlib/src/_image.cpp     2008-09-01 21:06:34 UTC (rev 6057)
@@ -1138,21 +1138,211 @@
   return Py::asObject(imo);
 }
 
+// utilities for irregular grids
+void _bin_indices_middle(unsigned int *irows, int nrows, float *ys1, int 
ny,float dy, float y_min)
+{ int  i,j, j_last;
+   unsigned  int * rowstart = irows;
+  float *ys2 = ys1+1;
+  float *yl = ys1 + ny ;
+  float yo = y_min + dy/2.0;
+  float ym = 0.5f*(*ys1 + *ys2);
+  // y/rows
+   j = 0;
+   j_last = j;
+  for (i=0;i<nrows;i++,yo+=dy,rowstart++) {
+      while(ys2 != yl && yo > ym) {
+          ys1 = ys2;
+          ys2 = ys1+1;
+          ym = 0.5f*(*ys1 + *ys2);
+          j++;
+      }
+      *rowstart = j - j_last;
+      j_last = j;
+  }
+}
 
+void _bin_indices_middle_linear(float *arows, unsigned int *irows, int nrows, 
float *y, int ny,float dy, float y_min)
+{ int i;
+    int ii = 0;
+    int iilast = ny-1;
+    float sc = 1/dy;
+    int iy0 = (int)floor(sc * (y[ii]  - y_min) );
+    int iy1 = (int)floor(sc * (y[ii+1]  - y_min) );
+    float invgap=1.0f/(iy1-iy0);
+    for (i=0; i<nrows && i<=iy0; i++) {
+        irows[i] = 0;
+        arows[i] = 1.0;
+        //std::cerr<<"i="<<i<<"  ii="<<0<<" a="<< arows[i]<< std::endl;
+    }
+    for (; i<nrows; i++) {
+        while (i > iy1 && ii < iilast) {
+            ii++;
+            iy0 = iy1;
+            iy1 = (int)floor(sc * (y[ii+1] - y_min));
+            invgap=1.0f/(iy1-iy0);
+        }
+        if (i >= iy0 && i <= iy1) {
+            irows[i] = ii;
+            arows[i]=(iy1-i)*invgap;
+            //std::cerr<<"i="<<i<<"  ii="<<ii<<" a="<< arows[i]<< std::endl;
+        }
+        else break;
+    }
+    for (; i<nrows; i++) {
+        irows[i] =iilast-1;
+        arows[i] = 0.0;
+        //std::cerr<<"i="<<i<<"  ii="<<iilast-1<<" a="<< arows[i]<< std::endl;
+    }
+}
+
+void _bin_indices(int *irows, int nrows, double *y, int ny,
+                                            double sc, double offs)
+{
+    int i;
+    if (sc*(y[ny-1] - y[0]) > 0)
+    {
+        int ii = 0;
+        int iilast = ny-1;
+        int iy0 = (int)floor(sc * (y[ii]  - offs));
+        int iy1 = (int)floor(sc * (y[ii+1]  - offs));
+        for (i=0; i<nrows && i<iy0; i++) {
+            irows[i] = -1;
+        }
+        for (; i<nrows; i++) {
+            while (i > iy1 && ii < iilast) {
+                ii++;
+                iy0 = iy1;
+                iy1 = (int)floor(sc * (y[ii+1] - offs));
+            }
+            if (i >= iy0 && i <= iy1) irows[i] = ii;
+            else break;
+        }
+        for (; i<nrows; i++) {
+            irows[i] = -1;
+        }
+    }
+    else
+    {
+        int iilast = ny-1;
+        int ii = iilast;
+        int iy0 = (int)floor(sc * (y[ii]  - offs));
+        int iy1 = (int)floor(sc * (y[ii-1]  - offs));
+        for (i=0; i<nrows && i<iy0; i++) {
+            irows[i] = -1;
+        }
+        for (; i<nrows; i++) {
+            while (i > iy1 && ii > 1) {
+                ii--;
+                iy0 = iy1;
+                iy1 = (int)floor(sc * (y[ii-1] - offs));
+            }
+            if (i >= iy0 && i <= iy1) irows[i] = ii-1;
+            else break;
+        }
+        for (; i<nrows; i++) {
+            irows[i] = -1;
+        }
+    }
+}
+
+void _bin_indices_linear(float *arows, int *irows, int nrows, double *y, int 
ny,
+                                            double sc, double offs)
+{
+    int i;
+    if (sc*(y[ny-1] - y[0]) > 0)
+    {
+        int ii = 0;
+        int iilast = ny-1;
+        int iy0 = (int)floor(sc * (y[ii]  - offs));
+        int iy1 = (int)floor(sc * (y[ii+1]  - offs));
+        float invgap=1.0/(iy1-iy0);
+        for (i=0; i<nrows && i<iy0; i++) {
+            irows[i] = -1;
+        }
+        for (; i<nrows; i++) {
+            while (i > iy1 && ii < iilast) {
+                ii++;
+                iy0 = iy1;
+                iy1 = (int)floor(sc * (y[ii+1] - offs));
+                invgap=1.0/(iy1-iy0);
+            }
+            if (i >= iy0 && i <= iy1) {
+                irows[i] = ii;
+                arows[i]=(iy1-i)*invgap;
+            }
+            else break;
+        }
+        for (; i<nrows; i++) {
+            irows[i] = -1;
+        }
+    }
+    else
+    {
+        int iilast = ny-1;
+        int ii = iilast;
+        int iy0 = (int)floor(sc * (y[ii]  - offs));
+        int iy1 = (int)floor(sc * (y[ii-1]  - offs));
+        float invgap=1.0/(iy1-iy0);
+        for (i=0; i<nrows && i<iy0; i++) {
+            irows[i] = -1;
+        }
+        for (; i<nrows; i++) {
+            while (i > iy1 && ii > 1) {
+                ii--;
+                iy0 = iy1;
+                iy1 = (int)floor(sc * (y[ii-1] - offs));
+                invgap=1.0/(iy1-iy0);
+            }
+            if (i >= iy0 && i <= iy1) {
+                irows[i] = ii-1;
+                arows[i]=(i-iy0)*invgap;
+            }
+            else break;
+        }
+        for (; i<nrows; i++) {
+            irows[i] = -1;
+        }
+    }
+}
+
+
+
 char __image_module_pcolor__doc__[] =
 "pcolor(x, y, data, rows, cols, bounds)\n"
 "\n"
-"Generate a psudo-color image from data on a non-univorm grid using\n"
-"nearest neighbour interpolation.\n"
+"Generate a pseudo-color image from data on a non-uniform grid using\n"
+"nearest neighbour or linear interpolation.\n"
 "bounds = (x_min, x_max, y_min, y_max)\n"
+"interpolation = NEAREST or BILINEAR \n"
 ;
+
+void _pcolor_cleanup(PyArrayObject* x, PyArrayObject* y,  PyArrayObject *d,
+                                        unsigned int * rowstarts ,unsigned 
int*colstarts ,
+                                        float *acols , float *arows) {
+    if (x)
+      Py_XDECREF(x);
+    if (y)
+      Py_XDECREF(y);
+    if(d)
+      Py_XDECREF(d);
+    if(rowstarts)
+      PyMem_Free(rowstarts);
+    if(colstarts)
+      PyMem_Free(colstarts);
+    if(acols)
+      PyMem_Free(acols);
+    if(arows)
+      PyMem_Free(arows);
+    return;
+}
+    
 Py::Object
 _image_module::pcolor(const Py::Tuple& args) {
   _VERBOSE("_image_module::pcolor");
 
 
-  if (args.length() != 6)
-      throw Py::TypeError("Incorrect number of arguments (6 expected)");
+  if (args.length() != 7)
+      throw Py::TypeError("Incorrect number of arguments (7 expected)");
 
   Py::Object xp = args[0];
   Py::Object yp = args[1];
@@ -1160,6 +1350,7 @@
   unsigned int rows = Py::Int(args[3]);
   unsigned int cols = Py::Int(args[4]);
   Py::Tuple bounds = args[5];
+  unsigned int interpolation = Py::Int(args[6]);
 
   if (rows > 1 << 15 || cols > 1 << 15) {
     throw Py::ValueError("rows and cols must both be less than 32768");
@@ -1179,26 +1370,29 @@
   // Check we have something to output to
   if (rows == 0 || cols ==0)
       throw Py::ValueError("Cannot scale to zero size");
-
+  
+  PyArrayObject *x = NULL; PyArrayObject *y = NULL; PyArrayObject *d = NULL;
+  unsigned int * rowstarts = NULL; unsigned int*colstarts = NULL;
+  float *acols = NULL; float *arows = NULL;
+  
   // Get numpy arrays
-  PyArrayObject *x = (PyArrayObject *) PyArray_ContiguousFromObject(xp.ptr(), 
PyArray_FLOAT, 1, 1);
-  if (x == NULL)
+  x = (PyArrayObject *) PyArray_ContiguousFromObject(xp.ptr(), PyArray_FLOAT, 
1, 1);
+  if (x == NULL) {
+      _pcolor_cleanup(x,y,d,rowstarts,colstarts,acols,arows);
       throw Py::ValueError("x is of incorrect type (wanted 1D float)");
-  PyArrayObject *y = (PyArrayObject *) PyArray_ContiguousFromObject(yp.ptr(), 
PyArray_FLOAT, 1, 1);
+  }
+  y = (PyArrayObject *) PyArray_ContiguousFromObject(yp.ptr(), PyArray_FLOAT, 
1, 1);
   if (y == NULL) {
-      Py_XDECREF(x);
-      throw Py::ValueError("y is of incorrect type (wanted 1D float)");
+     _pcolor_cleanup(x,y,d,rowstarts,colstarts,acols,arows);
+     throw Py::ValueError("y is of incorrect type (wanted 1D float)");
   }
-  PyArrayObject *d = (PyArrayObject *) PyArray_ContiguousFromObject(dp.ptr(), 
PyArray_UBYTE, 3, 3);
+  d = (PyArrayObject *) PyArray_ContiguousFromObject(dp.ptr(), PyArray_UBYTE, 
3, 3);
   if (d == NULL) {
-      Py_XDECREF(x);
-      Py_XDECREF(y);
+     _pcolor_cleanup(x,y,d,rowstarts,colstarts,acols,arows);
       throw Py::ValueError("data is of incorrect type (wanted 3D UInt8)");
   }
   if (d->dimensions[2] != 4) {
-      Py_XDECREF(x);
-      Py_XDECREF(y);
-      Py_XDECREF(d);
+     _pcolor_cleanup(x,y,d,rowstarts,colstarts,acols,arows);
       throw Py::ValueError("data must be in RGBA format");
   }
 
@@ -1206,26 +1400,21 @@
   int nx = x->dimensions[0];
   int ny = y->dimensions[0];
   if (nx != d->dimensions[1] || ny != d->dimensions[0]) {
-      Py_XDECREF(x);
-      Py_XDECREF(y);
-      Py_XDECREF(d);
+     _pcolor_cleanup(x,y,d,rowstarts,colstarts,acols,arows);
       throw Py::ValueError("data and axis dimensions do not match");
   }
 
   // Allocate memory for pointer arrays
-  unsigned int * rowstarts = reinterpret_cast<unsigned 
int*>(PyMem_Malloc(sizeof(unsigned int)*rows));
-  if (rowstarts == NULL) {
-      Py_XDECREF(x);
-      Py_XDECREF(y);
-      Py_XDECREF(d);
+  rowstarts = reinterpret_cast<unsigned int*>(PyMem_Malloc(sizeof(unsigned 
int)*rows));
+  arows = reinterpret_cast<float *>(PyMem_Malloc(sizeof(float)*rows));
+  if (rowstarts == NULL || arows == NULL ) {
+     _pcolor_cleanup(x,y,d,rowstarts,colstarts,acols,arows);
       throw Py::MemoryError("Cannot allocate memory for lookup table");
   }
-  unsigned int * colstarts = reinterpret_cast<unsigned 
int*>(PyMem_Malloc(sizeof(unsigned int*)*cols));
-  if (colstarts == NULL) {
-      Py_XDECREF(x);
-      Py_XDECREF(y);
-      Py_XDECREF(d);
-      PyMem_Free(rowstarts);
+  colstarts = reinterpret_cast<unsigned int*>(PyMem_Malloc(sizeof(unsigned 
int)*cols));
+  acols = reinterpret_cast<float*>(PyMem_Malloc(sizeof(float)*cols));
+  if (colstarts == NULL || acols == NULL) {
+     _pcolor_cleanup(x,y,d,rowstarts,colstarts,acols,arows);
       throw Py::MemoryError("Cannot allocate memory for lookup table");
   }
 
@@ -1238,54 +1427,17 @@
   size_t NUMBYTES(rows * cols * 4);
   agg::int8u *buffer = new agg::int8u[NUMBYTES];
   if (buffer == NULL) {
-      Py_XDECREF(x);
-      Py_XDECREF(y);
-      Py_XDECREF(d);
-      PyMem_Free(rowstarts);
-      PyMem_Free(colstarts);
+     _pcolor_cleanup(x,y,d,rowstarts,colstarts,acols,arows);
       throw Py::MemoryError("Could not allocate memory for image");
   }
+  
 
   // Calculate the pointer arrays to map input x to output x
-  unsigned int i, j, j_last;
+  unsigned int i, j;
   unsigned int * colstart = colstarts;
   unsigned int * rowstart = rowstarts;
   float *xs1 = reinterpret_cast<float*>(x->data);
   float *ys1 = reinterpret_cast<float*>(y->data);
-  float *xs2 = xs1+1;
-  float *ys2 = ys1+1;
-  float *xl = xs1 + nx - 1;
-  float *yl = ys1 + ny - 1;
-  float xo = x_min + dx/2.0;
-  float yo = y_min + dy/2.0;
-  float xm = 0.5*(*xs1 + *xs2);
-  float ym = 0.5*(*ys1 + *ys2);
-  // x/cols
-  j = 0;
-  j_last = j;
-  for (i=0;i<cols;i++,xo+=dx,colstart++) {
-      while(xs2 != xl && xo > xm) {
-          xs1 = xs2;
-          xs2 = xs1+1;
-          xm = 0.5f*(*xs1 + *xs2);
-          j++;
-      }
-      *colstart = j - j_last;
-      j_last = j;
-  }
-  // y/rows
-  j = 0;
-  j_last = j;
-  for (i=0;i<rows;i++,yo+=dy,rowstart++) {
-      while(ys2 != yl && yo > ym) {
-          ys1 = ys2;
-          ys2 = ys1+1;
-          ym = 0.5f*(*ys1 + *ys2);
-          j++;
-      }
-      *rowstart = j - j_last;
-      j_last = j;
-  }
 
 
   // Copy data to output buffer
@@ -1297,87 +1449,82 @@
   agg::int8u * position = buffer;
   agg::int8u * oldposition = NULL;
   start = reinterpret_cast<unsigned char*>(d->data);
-  for(i=0;i<rows;i++,rowstart++)
-  {
-      if (i > 0 && *rowstart == 0) {
-          memcpy(position, oldposition, rowsize*sizeof(agg::int8u));
-          oldposition = position;
-          position += rowsize;
-      } else {
-          oldposition = position;
-          start += *rowstart * inrowsize;
-          inposition = start;
-          for(j=0,colstart=colstarts;j<cols;j++,position+=4,colstart++) {
-              inposition += *colstart * 4;
-              memcpy(position, inposition, 4*sizeof(agg::int8u));
+    int s0 = d->strides[0];
+    int s1 = d->strides[1];
+  
+  if(interpolation == Image::NEAREST) {
+      _bin_indices_middle(colstart, cols, xs1,  nx,dx,x_min);
+      _bin_indices_middle(rowstart, rows, ys1,  ny, dy,y_min);
+      for(i=0;i<rows;i++,rowstart++)
+      {
+          if (i > 0 && *rowstart == 0) {
+              memcpy(position, oldposition, rowsize*sizeof(agg::int8u));
+              oldposition = position;
+              position += rowsize;
+          } else {
+              oldposition = position;
+              start += *rowstart * inrowsize;
+              inposition = start;
+              for(j=0,colstart=colstarts;j<cols;j++,position+=4,colstart++) {
+                  inposition += *colstart * 4;
+                  memcpy(position, inposition, 4*sizeof(agg::int8u));
+              }
           }
       }
   }
+  else if(interpolation == Image::BILINEAR) {
+      _bin_indices_middle_linear(acols, colstart, cols, xs1,  nx,dx,x_min);
+      _bin_indices_middle_linear(arows, rowstart, rows, ys1,  ny, dy,y_min);
+      double a00,a01,a10,a11,alpha,beta;
+      
+      
+        agg::int8u * start00;
+        agg::int8u * start01;
+        agg::int8u * start10;
+        agg::int8u * start11;
+      // Copy data to output buffer
+      for (i=0; i<rows; i++)
+        {
+            for (j=0; j<cols; j++)
+            {
+                alpha=arows[i];
+                beta=acols[j];
+                
+                a00=alpha*beta;
+                a01=alpha*(1.0-beta);
+                a10=(1.0-alpha)*beta;
+                a11=1.0-a00-a01-a10;
+                
+                start00=(agg::int8u *)(start + s0*rowstart[i] + 
s1*colstart[j]);
+                start01=start00+s1;
+                start10=start00+s0;
+                start11=start10+s1;
+                position[0] 
=(agg::int8u)(start00[0]*a00+start01[0]*a01+start10[0]*a10+start11[0]*a11);
+                position[1] 
=(agg::int8u)(start00[1]*a00+start01[1]*a01+start10[1]*a10+start11[1]*a11);
+                position[2] 
=(agg::int8u)(start00[2]*a00+start01[2]*a01+start10[2]*a10+start11[2]*a11);
+                position[3] 
=(agg::int8u)(start00[3]*a00+start01[3]*a01+start10[3]*a10+start11[3]*a11);
+                position += 4;
+            }
+        }
+        
+    }
 
+
   // Attatch output buffer to output buffer
   imo->rbufOut = new agg::rendering_buffer;
   imo->bufferOut = buffer;
   imo->rbufOut->attach(imo->bufferOut, imo->colsOut, imo->rowsOut, 
imo->colsOut * imo->BPP);
 
-  Py_XDECREF(x);
-  Py_XDECREF(y);
-  Py_XDECREF(d);
-  PyMem_Free(rowstarts);
-  PyMem_Free(colstarts);
+  
+   _pcolor_cleanup(x,y,d,rowstarts,colstarts,acols,arows);
 
   return Py::asObject(imo);
-}
+    
 
-void _bin_indices(int *irows, int nrows, double *y, int ny,
-                                            double sc, double offs)
-{
-    int i;
-    if (sc*(y[ny-1] - y[0]) > 0)
-    {
-        int ii = 0;
-        int iilast = ny-1;
-        int iy0 = (int)floor(sc * (y[ii]  - offs));
-        int iy1 = (int)floor(sc * (y[ii+1]  - offs));
-        for (i=0; i<nrows && i<iy0; i++) {
-            irows[i] = -1;
-        }
-        for (; i<nrows; i++) {
-            while (i > iy1 && ii < iilast) {
-                ii++;
-                iy0 = iy1;
-                iy1 = (int)floor(sc * (y[ii+1] - offs));
-            }
-            if (i >= iy0 && i <= iy1) irows[i] = ii;
-            else break;
-        }
-        for (; i<nrows; i++) {
-            irows[i] = -1;
-        }
-    }
-    else
-    {
-        int iilast = ny-1;
-        int ii = iilast;
-        int iy0 = (int)floor(sc * (y[ii]  - offs));
-        int iy1 = (int)floor(sc * (y[ii-1]  - offs));
-        for (i=0; i<nrows && i<iy0; i++) {
-            irows[i] = -1;
-        }
-        for (; i<nrows; i++) {
-            while (i > iy1 && ii > 1) {
-                ii--;
-                iy0 = iy1;
-                iy1 = (int)floor(sc * (y[ii-1] - offs));
-            }
-            if (i >= iy0 && i <= iy1) irows[i] = ii-1;
-            else break;
-        }
-        for (; i<nrows; i++) {
-            irows[i] = -1;
-        }
-    }
+  
 }
 
+
 char __image_module_pcolor2__doc__[] =
 "pcolor2(x, y, data, rows, cols, bounds, bg)\n"
 "\n"
@@ -1477,7 +1624,7 @@
         Py_XDECREF(bg);
         throw Py::MemoryError("Cannot allocate memory for lookup table");
     }
-    int * jcols = reinterpret_cast<int*>(PyMem_Malloc(sizeof(int*)*cols));
+    int * jcols = reinterpret_cast<int*>(PyMem_Malloc(sizeof(int)*cols));
     if (jcols == NULL) {
         Py_XDECREF(x);
         Py_XDECREF(y);


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 the Moblin Your Move Developer's challenge
Build the coolest Linux based applications with Moblin SDK & win great prizes
Grand prize is a trip for two to an Open Source event anywhere in the world
http://moblin-contest.org/redirect.php?banner_id=100&url=/
_______________________________________________
Matplotlib-checkins mailing list
Matplotlib-checkins@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-checkins

Reply via email to