[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

BUG Re: [pygame] Exception in _numpysurfarray.py



Thanks Lorenz.  Your patch does look correct.

What do you think Marcus?

cheers,

On Thu, Apr 10, 2008 at 6:35 AM, Lorenz Quack <don@xxxxxxxxxxxxxxxxx> wrote:
> Hi all,
>
>  a friend of mine had a problem using pygame.surarray.pixels3d
>  creation would raise the following Exception:
>
>   File "C:\Python25\lib\site-packages\pygame\surfarray.py", line 165, in
> pixels3d
>     return numpysf.pixels3d (surface)
>   File "C:\Python25\lib\site-packages\pygame\_numpysurfarray.py", line 213,
> in pixels3d
>     array.shape  = surface.get_width (), surface.get_height (), bpp
>  AttributeError: incompatible shape for a non-contiguous array
>
>  here is the code section in question from the _numpysurfarray.py:
>
>     array = numpy.frombuffer (surface.get_buffer (), numpy.uint8)
>     array.shape = surface.get_height (), surface.get_pitch ()
>     # I believe this line make the array in some cases non-contiguous
>     array = array[:,:surface.get_width () * bpp]
>     # the next line raises the exception
>     array.shape  = surface.get_width (), surface.get_height (), bpp
>     array = array[:,:,start:end:step]
>     return array
>
>  My analysis was that the line before makes the array non-contiguous and
> thus the direct assignment of the shape attribute fails. reshape copies the
> data to a new array if necessary. I might be wrong since I never had this
> problem myself (it might be due to the fact that I'm on Linux while my
> friend is using MS Windows).
>
>  I attached a patch that uses reshape instead of the direct assignment.
>  I left all the other places where array.shape is assigned untouched because
> they are mostly directly after the arrays creation and should therefor
> always be contiguous.
>
>  Please can someone (with more numpy experience than myself) look at this?
>
>  yours
>  //Lorenz
>
> --- _numpysurfarray.py  2008-04-06 13:47:47.000000000 +0200
>  +++ _numpysurfarray_patched.py  2008-04-09 20:37:00.000000000 +0200
>  @@ -210,7 +210,7 @@
>      array = numpy.frombuffer (surface.get_buffer (), numpy.uint8)
>      array.shape = surface.get_height (), surface.get_pitch ()
>      array = array[:,:surface.get_width () * bpp]
>  -    array.shape  = surface.get_width (), surface.get_height (), bpp
>  +    array = numpy.reshape(array, (surface.get_width (), surface.get_height
> (), bpp))
>      array = array[:,:,start:end:step]
>      return array
>
>
>