From: <ef...@us...> - 2008-09-01 22:50:49
|
Revision: 6060 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=6060&view=rev Author: efiring Date: 2008-09-01 22:50:47 +0000 (Mon, 01 Sep 2008) Log Message: ----------- Allocate acols, arows only if needed; change suggested by Mike D. Other slight cleanups in _image.cpp. Modified Paths: -------------- trunk/matplotlib/src/_image.cpp Modified: trunk/matplotlib/src/_image.cpp =================================================================== --- trunk/matplotlib/src/_image.cpp 2008-09-01 22:27:07 UTC (rev 6059) +++ trunk/matplotlib/src/_image.cpp 2008-09-01 22:50:47 UTC (rev 6060) @@ -711,7 +711,7 @@ size_t numrows = (size_t)Py::Int(args[0]); size_t numcols = (size_t)Py::Int(args[1]); - if (numrows > 1 << 15 || numcols > 1 << 15) { + if (numrows >= 32768 || numcols >= 32768) { throw Py::RuntimeError("numrows and numcols must both be less than 32768"); } @@ -1088,7 +1088,7 @@ size_t x = Py::Int(args[1]); size_t y = Py::Int(args[2]); - if (x > 1 << 15 || y > 1 << 15) { + if (x >= 32768 || y >= 32768) { throw Py::ValueError("x and y must both be less than 32768"); } @@ -1335,7 +1335,7 @@ PyMem_Free(arows); return; } - + Py::Object _image_module::pcolor(const Py::Tuple& args) { _VERBOSE("_image_module::pcolor"); @@ -1352,7 +1352,7 @@ Py::Tuple bounds = args[5]; unsigned int interpolation = Py::Int(args[6]); - if (rows > 1 << 15 || cols > 1 << 15) { + if (rows >= 32768 || cols >= 32768) { throw Py::ValueError("rows and cols must both be less than 32768"); } @@ -1370,11 +1370,11 @@ // 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 x = (PyArrayObject *) PyArray_ContiguousFromObject(xp.ptr(), PyArray_FLOAT, 1, 1); if (x == NULL) { @@ -1406,14 +1406,12 @@ // Allocate memory for pointer arrays 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 ) { + if (rowstarts == NULL) { _pcolor_cleanup(x,y,d,rowstarts,colstarts,acols,arows); throw Py::MemoryError("Cannot allocate memory for lookup table"); } 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) { + if (colstarts == NULL) { _pcolor_cleanup(x,y,d,rowstarts,colstarts,acols,arows); throw Py::MemoryError("Cannot allocate memory for lookup table"); } @@ -1430,8 +1428,8 @@ _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; unsigned int * colstart = colstarts; @@ -1451,7 +1449,7 @@ start = reinterpret_cast<unsigned char*>(d->data); 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); @@ -1473,11 +1471,22 @@ } } else if(interpolation == Image::BILINEAR) { + arows = reinterpret_cast<float *>(PyMem_Malloc(sizeof(float)*rows)); + if (arows == NULL ) { + _pcolor_cleanup(x,y,d,rowstarts,colstarts,acols,arows); + throw Py::MemoryError("Cannot allocate memory for lookup table"); + } + acols = reinterpret_cast<float*>(PyMem_Malloc(sizeof(float)*cols)); + if (acols == NULL) { + _pcolor_cleanup(x,y,d,rowstarts,colstarts,acols,arows); + throw Py::MemoryError("Cannot allocate memory for lookup table"); + } + _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; @@ -1489,12 +1498,12 @@ { 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; @@ -1506,22 +1515,18 @@ position += 4; } } - + } - - // Attatch output buffer to output buffer + // Attach 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); - _pcolor_cleanup(x,y,d,rowstarts,colstarts,acols,arows); return Py::asObject(imo); - - } @@ -1548,7 +1553,7 @@ Py::Tuple bounds = args[5]; Py::Object bgp = args[6]; - if (rows > 1 << 15 || cols > 1 << 15) { + if (rows >= 32768 || cols >= 32768) { throw Py::ValueError("rows and cols must both be less than 32768"); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <md...@us...> - 2010-06-16 17:08:52
|
Revision: 8439 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8439&view=rev Author: mdboom Date: 2010-06-16 17:08:43 +0000 (Wed, 16 Jun 2010) Log Message: ----------- Fix accessing uninitialized memory error. Modified Paths: -------------- trunk/matplotlib/src/_image.cpp Modified: trunk/matplotlib/src/_image.cpp =================================================================== --- trunk/matplotlib/src/_image.cpp 2010-06-15 19:32:24 UTC (rev 8438) +++ trunk/matplotlib/src/_image.cpp 2010-06-16 17:08:43 UTC (rev 8439) @@ -44,7 +44,7 @@ Image::Image() : bufferIn(NULL), rbufIn(NULL), colsIn(0), rowsIn(0), bufferOut(NULL), rbufOut(NULL), colsOut(0), rowsOut(0), BPP(4), - interpolation(BILINEAR), aspect(ASPECT_FREE), bg(1,1,1,0) { + interpolation(BILINEAR), aspect(ASPECT_FREE), bg(1,1,1,0), resample(true) { _VERBOSE("Image::Image"); } @@ -196,7 +196,7 @@ std::pair<agg::int8u*,bool> bufpair = _get_output_buffer(); Py::Object ret = Py::asObject(Py_BuildValue("lls#", rowsOut, colsOut, - bufpair.first, colsOut*rowsOut*4)); + bufpair.first, colsOut*rowsOut*4)); if (bufpair.second) delete [] bufpair.first; return ret; @@ -229,7 +229,7 @@ agg::rendering_buffer rtmp; rtmp.attach(reinterpret_cast<unsigned char*>(buf), colsOut, rowsOut, - row_len); + row_len); switch (format) { case 0: @@ -259,7 +259,7 @@ args.verify_length(0); int row_len = colsOut * 4; PyObject* o = Py_BuildValue("lls#", rowsOut, colsOut, - rbufOut, row_len * rowsOut); + rbufOut, row_len * rowsOut); return Py::asObject(o); } @@ -362,9 +362,9 @@ typedef agg::span_allocator<agg::rgba8> span_alloc_type; span_alloc_type sa; agg::rgba8 background(agg::rgba8(int(255*bg.r), - int(255*bg.g), - int(255*bg.b), - int(255*bg.a))); + int(255*bg.g), + int(255*bg.b), + int(255*bg.a))); // the image path agg::path_storage path; @@ -396,11 +396,11 @@ case NEAREST: { - typedef agg::span_image_filter_rgba_nn<img_accessor_type, interpolator_type> span_gen_type; - typedef agg::renderer_scanline_aa<renderer_base, span_alloc_type, span_gen_type> renderer_type; - span_gen_type sg(ia, interpolator); - renderer_type ri(rb, sa, sg); - agg::render_scanlines(ras, sl, ri); + typedef agg::span_image_filter_rgba_nn<img_accessor_type, interpolator_type> span_gen_type; + typedef agg::renderer_scanline_aa<renderer_base, span_alloc_type, span_gen_type> renderer_type; + span_gen_type sg(ia, interpolator); + renderer_type ri(rb, sa, sg); + agg::render_scanlines(ras, sl, ri); } break; @@ -414,22 +414,22 @@ case HAMMING: filter.calculate(agg::image_filter_hamming(), norm); break; case HERMITE: filter.calculate(agg::image_filter_hermite(), norm); break; } - if (resample) - { - typedef agg::span_image_resample_rgba_affine<img_accessor_type> span_gen_type; - typedef agg::renderer_scanline_aa<renderer_base, span_alloc_type, span_gen_type> renderer_type; - span_gen_type sg(ia, interpolator, filter); - renderer_type ri(rb, sa, sg); - agg::render_scanlines(ras, sl, ri); - } - else - { - typedef agg::span_image_filter_rgba_2x2<img_accessor_type, interpolator_type> span_gen_type; - typedef agg::renderer_scanline_aa<renderer_base, span_alloc_type, span_gen_type> renderer_type; - span_gen_type sg(ia, interpolator, filter); - renderer_type ri(rb, sa, sg); - agg::render_scanlines(ras, sl, ri); - } + if (resample) + { + typedef agg::span_image_resample_rgba_affine<img_accessor_type> span_gen_type; + typedef agg::renderer_scanline_aa<renderer_base, span_alloc_type, span_gen_type> renderer_type; + span_gen_type sg(ia, interpolator, filter); + renderer_type ri(rb, sa, sg); + agg::render_scanlines(ras, sl, ri); + } + else + { + typedef agg::span_image_filter_rgba_2x2<img_accessor_type, interpolator_type> span_gen_type; + typedef agg::renderer_scanline_aa<renderer_base, span_alloc_type, span_gen_type> renderer_type; + span_gen_type sg(ia, interpolator, filter); + renderer_type ri(rb, sa, sg); + agg::render_scanlines(ras, sl, ri); + } } break; case BILINEAR: @@ -463,22 +463,22 @@ case LANCZOS: filter.calculate(agg::image_filter_lanczos(radius), norm); break; case BLACKMAN: filter.calculate(agg::image_filter_blackman(radius), norm); break; } - if (resample) - { - typedef agg::span_image_resample_rgba_affine<img_accessor_type> span_gen_type; - typedef agg::renderer_scanline_aa<renderer_base, span_alloc_type, span_gen_type> renderer_type; - span_gen_type sg(ia, interpolator, filter); - renderer_type ri(rb, sa, sg); - agg::render_scanlines(ras, sl, ri); - } - else - { - typedef agg::span_image_filter_rgba<img_accessor_type, interpolator_type> span_gen_type; - typedef agg::renderer_scanline_aa<renderer_base, span_alloc_type, span_gen_type> renderer_type; - span_gen_type sg(ia, interpolator, filter); - renderer_type ri(rb, sa, sg); - agg::render_scanlines(ras, sl, ri); - } + if (resample) + { + typedef agg::span_image_resample_rgba_affine<img_accessor_type> span_gen_type; + typedef agg::renderer_scanline_aa<renderer_base, span_alloc_type, span_gen_type> renderer_type; + span_gen_type sg(ia, interpolator, filter); + renderer_type ri(rb, sa, sg); + agg::render_scanlines(ras, sl, ri); + } + else + { + typedef agg::span_image_filter_rgba<img_accessor_type, interpolator_type> span_gen_type; + typedef agg::renderer_scanline_aa<renderer_base, span_alloc_type, span_gen_type> renderer_type; + span_gen_type sg(ia, interpolator, filter); + renderer_type ri(rb, sa, sg); + agg::render_scanlines(ras, sl, ri); + } } break; @@ -660,7 +660,7 @@ behaviors().supportSetattr(); add_varargs_method( "apply_rotation", &Image::apply_rotation, Image::apply_rotation__doc__); - add_varargs_method( "apply_scaling", &Image::apply_scaling, Image::apply_scaling__doc__); + add_varargs_method( "apply_scaling", &Image::apply_scaling, Image::apply_scaling__doc__); add_varargs_method( "apply_translation", &Image::apply_translation, Image::apply_translation__doc__); add_keyword_method( "as_rgba_str", &Image::as_rgba_str, Image::as_rgba_str__doc__); add_varargs_method( "color_conv", &Image::color_conv, Image::color_conv__doc__); @@ -744,25 +744,25 @@ size_t ind=0; for (size_t j=0; j<thisim->rowsOut; j++) { for (size_t i=0; i<thisim->colsOut; i++) { - thisx = i+ox; + thisx = i+ox; - if (isflip) - thisy = thisim->rowsOut - j + oy; - else - thisy = j+oy; + if (isflip) + thisy = thisim->rowsOut - j + oy; + else + thisy = j+oy; - if (thisx>=numcols || thisy>=numrows) { - ind +=4; - continue; - } + if (thisx>=numcols || thisy>=numrows) { + ind +=4; + continue; + } - pixfmt::color_type p; - p.r = *(thisim->bufferOut+ind++); - p.g = *(thisim->bufferOut+ind++); - p.b = *(thisim->bufferOut+ind++); - p.a = *(thisim->bufferOut+ind++); - pixf.blend_pixel(thisx, thisy, p, 255); + pixfmt::color_type p; + p.r = *(thisim->bufferOut+ind++); + p.g = *(thisim->bufferOut+ind++); + p.b = *(thisim->bufferOut+ind++); + p.a = *(thisim->bufferOut+ind++); + pixf.blend_pixel(thisx, thisy, p, 255); } } } @@ -854,20 +854,20 @@ for (size_t rownum=0; rownum<imo->rowsIn; rownum++) { for (size_t colnum=0; colnum<imo->colsIn; colnum++) { - offset = rownum*A->strides[0] + colnum*A->strides[1]; - r = *(double *)(A->data + offset); - g = *(double *)(A->data + offset + A->strides[2] ); - b = *(double *)(A->data + offset + 2*A->strides[2] ); + offset = rownum*A->strides[0] + colnum*A->strides[1]; + r = *(double *)(A->data + offset); + g = *(double *)(A->data + offset + A->strides[2] ); + b = *(double *)(A->data + offset + 2*A->strides[2] ); - if (rgba) - alpha = *(double *)(A->data + offset + 3*A->strides[2] ); - else - alpha = 1.0; + if (rgba) + alpha = *(double *)(A->data + offset + 3*A->strides[2] ); + else + alpha = 1.0; - *buffer++ = int(255*r); // red - *buffer++ = int(255*g); // green - *buffer++ = int(255*b); // blue - *buffer++ = int(255*alpha); // alpha + *buffer++ = int(255*r); // red + *buffer++ = int(255*g); // green + *buffer++ = int(255*b); // blue + *buffer++ = int(255*alpha); // alpha } } @@ -963,19 +963,19 @@ const size_t N = imo->rowsIn * imo->colsIn; size_t i = 0; while (i<N) { - r = *(double *)(A->data++); - g = *(double *)(A->data++); - b = *(double *)(A->data++); + r = *(double *)(A->data++); + g = *(double *)(A->data++); + b = *(double *)(A->data++); - if (rgba) - alpha = *(double *)(A->data++); - else - alpha = 1.0; + if (rgba) + alpha = *(double *)(A->data++); + else + alpha = 1.0; - *buffer++ = int(255*r); // red - *buffer++ = int(255*g); // green - *buffer++ = int(255*b); // blue - *buffer++ = int(255*alpha); // alpha + *buffer++ = int(255*r); // red + *buffer++ = int(255*g); // green + *buffer++ = int(255*b); // blue + *buffer++ = int(255*alpha); // alpha } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <md...@us...> - 2010-06-22 19:31:03
|
Revision: 8456 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8456&view=rev Author: mdboom Date: 2010-06-22 19:30:57 +0000 (Tue, 22 Jun 2010) Log Message: ----------- Fix severe slowness with very high image magnification. Modified Paths: -------------- trunk/matplotlib/src/_image.cpp Modified: trunk/matplotlib/src/_image.cpp =================================================================== --- trunk/matplotlib/src/_image.cpp 2010-06-22 16:30:24 UTC (rev 8455) +++ trunk/matplotlib/src/_image.cpp 2010-06-22 19:30:57 UTC (rev 8456) @@ -353,6 +353,7 @@ agg::rasterizer_scanline_aa<> ras; agg::scanline_u8 sl; + ras.clip_box(0, 0, numcols, numrows); //srcMatrix *= resizingMatrix; //imageMatrix *= resizingMatrix; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <md...@us...> - 2010-06-23 14:18:16
|
Revision: 8457 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8457&view=rev Author: mdboom Date: 2010-06-23 14:18:05 +0000 (Wed, 23 Jun 2010) Log Message: ----------- Do image clipping of images in doubles rather than ints -- prevents the "disappearing image when zooming in too far" problem. Modified Paths: -------------- trunk/matplotlib/src/_image.cpp Modified: trunk/matplotlib/src/_image.cpp =================================================================== --- trunk/matplotlib/src/_image.cpp 2010-06-22 19:30:57 UTC (rev 8456) +++ trunk/matplotlib/src/_image.cpp 2010-06-23 14:18:05 UTC (rev 8457) @@ -29,6 +29,7 @@ #include "agg_span_image_filter_rgb.h" #include "agg_span_image_filter_rgba.h" #include "agg_span_interpolator_linear.h" +#include "agg_rasterizer_sl_clip.h" #include "util/agg_color_conv_rgb8.h" #include "_image.h" #include "mplutils.h" @@ -350,7 +351,7 @@ pixfmt pixf(*rbufOut); renderer_base rb(pixf); rb.clear(bg); - agg::rasterizer_scanline_aa<> ras; + agg::rasterizer_scanline_aa<agg::rasterizer_sl_clip_dbl> ras; agg::scanline_u8 sl; ras.clip_box(0, 0, numcols, numrows); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ef...@us...> - 2011-02-09 07:45:24
|
Revision: 8966 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8966&view=rev Author: efiring Date: 2011-02-09 07:45:18 +0000 (Wed, 09 Feb 2011) Log Message: ----------- _image.cpp: speed up image_frombyte; patch by C. Gohlke Non-contiguous arrays, such as those resulting from pan and zoom, are handled efficiently without additional copying. This noticeably speeds up zoom and pan on large images. Modified Paths: -------------- trunk/matplotlib/src/_image.cpp Modified: trunk/matplotlib/src/_image.cpp =================================================================== --- trunk/matplotlib/src/_image.cpp 2011-02-09 04:16:08 UTC (rev 8965) +++ trunk/matplotlib/src/_image.cpp 2011-02-09 07:45:18 UTC (rev 8966) @@ -1085,7 +1085,7 @@ Py::Object x = args[0]; int isoutput = Py::Int(args[1]); - PyArrayObject *A = (PyArrayObject *) PyArray_ContiguousFromObject(x.ptr(), PyArray_UBYTE, 3, 3); + PyArrayObject *A = (PyArrayObject *) PyArray_FromObject(x.ptr(), PyArray_UBYTE, 3, 3); if (A == NULL) { throw Py::ValueError("Array must have 3 dimensions"); @@ -1104,35 +1104,86 @@ agg::int8u *arrbuf; agg::int8u *buffer; + agg::int8u *dstbuf; arrbuf = reinterpret_cast<agg::int8u *>(A->data); size_t NUMBYTES(imo->colsIn * imo->rowsIn * imo->BPP); - buffer = new agg::int8u[NUMBYTES]; + buffer = dstbuf = new agg::int8u[NUMBYTES]; if (buffer == NULL) //todo: also handle allocation throw { throw Py::MemoryError("_image_module::frombyte could not allocate memory"); } - const size_t N = imo->rowsIn * imo->colsIn * imo->BPP; - size_t i = 0; - if (A->dimensions[2] == 4) + if PyArray_ISCONTIGUOUS(A) { - memmove(buffer, arrbuf, N); + if (A->dimensions[2] == 4) + { + memmove(dstbuf, arrbuf, imo->rowsIn * imo->colsIn * 4); + } + else + { + size_t i = imo->rowsIn * imo->colsIn; + while (i--) + { + *dstbuf++ = *arrbuf++; + *dstbuf++ = *arrbuf++; + *dstbuf++ = *arrbuf++; + *dstbuf++ = 255; + } + } } + else if ((A->strides[1] == 4) && (A->strides[2] == 1)) + { + const size_t N = imo->colsIn * 4; + const size_t stride = A->strides[0]; + for (size_t rownum = 0; rownum < imo->rowsIn; rownum++) + { + memmove(dstbuf, arrbuf, N); + arrbuf += stride; + dstbuf += N; + } + } + else if ((A->strides[1] == 3) && (A->strides[2] == 1)) + { + const size_t stride = A->strides[0] - imo->colsIn * 3; + for (size_t rownum = 0; rownum < imo->rowsIn; rownum++) + { + for (size_t colnum = 0; colnum < imo->colsIn; colnum++) + { + *dstbuf++ = *arrbuf++; + *dstbuf++ = *arrbuf++; + *dstbuf++ = *arrbuf++; + *dstbuf++ = 255; + } + arrbuf += stride; + } + } else { - while (i < N) + PyArrayIterObject *iter; + iter = (PyArrayIterObject *)PyArray_IterNew((PyObject *)A); + if (A->dimensions[2] == 4) { - memmove(buffer, arrbuf, 3); - buffer += 3; - arrbuf += 3; - *buffer++ = 255; - i += 4; + while (iter->index < iter->size) { + *dstbuf++ = *((unsigned char *)iter->dataptr); + PyArray_ITER_NEXT(iter); + } } - buffer -= N; - arrbuf -= imo->rowsIn * imo->colsIn; + else + { + while (iter->index < iter->size) { + *dstbuf++ = *((unsigned char *)iter->dataptr); + PyArray_ITER_NEXT(iter); + *dstbuf++ = *((unsigned char *)iter->dataptr); + PyArray_ITER_NEXT(iter); + *dstbuf++ = *((unsigned char *)iter->dataptr); + PyArray_ITER_NEXT(iter); + *dstbuf++ = 255; + } + } + Py_DECREF(iter); } if (isoutput) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |