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
[email protected]
https://lists.sourceforge.net/lists/listinfo/matplotlib-checkins