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

Re: [pygame] Surfarray.array_alpha() bugfix, py2exe/py2app segfault



Hi everyone,

The answer is below the fold...


Lenard Lindstrom wrote:

Zack Schilling wrote:


In Pygame 1.8.1 and the latest 1.9.0 unstable, I've been having trouble using the surfarray module's pixels_alpha() and array_alpha() functions. I'm using 32bpp images with per-pixel alpha and I'm trying to work with the alpha data in numpy.

At first I couldn't get surfarray.array_alpha() to return a proper array (it returned all opaque values, surfarray.pixels_alpha() worked fine).
[snip]


So I went to find out why array_alpha wasn't working properly. I investigated in the pygame source and found the culprit in "pygame/_numpysurfarray.py"

The following code, intended to catch 8 bit images or images without alpha values, was erroneously catching my perpixel images.

    if surface.get_bytesize () == 1 or not surface.get_alpha ():
        # 1 bpp surfaces and surfaces without alpha are always fully
        # opaque.

The problem was that per-pixel surfaces normally have the blacket alpha, returned by get_alpha(), set as 255, a True value. Surfaces returned by convert_alpha() have blanket alpha 0, a False value. This 0 value caused the failure.

The fix is simple, make sure that the image is less than 32bpp AND missing an alpha channel before giving up on it.

if surface.get_bytesize () == 1 or (not surface.get_alpha () and surface.get_bytesize () < 4):
        # 1 bpp surfaces and surfaces without alpha are always fully
        # opaque.

A pygame developer should make and commit that change.
Fixed in SVN rev. 1903. As long as the blanket alpha is not None, its value shouldn't matter for a per-pixel alpha surface as it is ignored. But a surface with a blanket alpha set to None is totally opaque, any per-pixel alpha values are ignored. Also 2 byte surfaces can have per-pixel alpha. So all there factors had to be considered when patching _numpysurfarray.py.

Once I fixed that issue, everything worked as expected... as long as I ran the script from the command line. Now if I used either array_alpha() or pixels_alpha() in a py2exe/p2app program, I got a segmentation fault! ( just like before the change with pixels_alpha() )

This is next on the agenda.

Simple. The bufferproxy module is not included in the executables. I would also check for surflock.

The moral of the story, when critical modules are missing, they should not be quietly ignored. An exception has to be raised. Brian Fisher did this with _numericsurfarray when Numeric is missing. It simply fails to import. I did the same for _numericsndarray. Now it needs to be done for Pygame extention modules that rely on other Pygame modules.

Lenard

--
Lenard Lindstrom
<len-l@xxxxxxxxx>