On, Sat Apr 12, 2008, Marcus von Appen wrote: [...] Here's a second version of the patch that should improve the pixels_alpha() method as well. It'd be great if you could give it a try, too. Regards Marcus
Index: lib/_numpysurfarray.py =================================================================== --- lib/_numpysurfarray.py (Revision 1203) +++ lib/_numpysurfarray.py (Arbeitskopie) @@ -181,38 +181,39 @@ bpp = surface.get_bytesize () if bpp < 3 or bpp > 4: raise ValueError, "unsupported bit depth for 3D reference array" + lilendian = pygame.get_sdl_byteorder () == pygame.LIL_ENDIAN start = 0 step = 0 - end = 0 # Check for RGB or BGR surface. shifts = surface.get_shifts () if shifts[0] == 16 and shifts[1] == 8 and shifts[2] == 0: # RGB - end = None - if pygame.get_sdl_byteorder () == pygame.LIL_ENDIAN: + if lilendian: start = 2 step = -1 else: start = 0 step = 1 - else: + elif shifts[2] == 16 and shifts[1] == 8 and shifts[0] == 0: # BGR - end = 3 - if pygame.get_sdl_byteorder () == pygame.LIL_ENDIAN: + if lilendian: start = 0 step = 1 else: start = 2 step = -1 + else: + raise ValueError, "unsupported colormasks for 3D reference array" - array = numpy.frombuffer (surface.get_buffer (), numpy.uint8) - array.shape = surface.get_height (), surface.get_pitch () - array = array[:,:surface.get_width () * bpp] - array = numpy.reshape (array, (surface.get_width (), surface.get_height (), - bpp)) - array = array[:,:,start:end:step] + if bpp == 4 and not lilendian: + start += 1 + + array = numpy.ndarray \ + (shape=(surface.get_width (), surface.get_height (), 3), + dtype=numpy.uint8, buffer=surface.get_buffer (), + offset=start, strides=(bpp, surface.get_pitch (),step)) return array def array_alpha (surface): @@ -262,20 +263,24 @@ """ if surface.get_bytesize () != 4: raise ValueError, "unsupported bit depth for alpha reference array" + lilendian = pygame.get_sdl_byteorder () == pygame.LIL_ENDIAN # ARGB surface. start = 0 - if surface.get_shifts ()[3] == 24: + if surface.get_shifts ()[3] == 24 and lilendian: # RGBA surface. start = 3 + elif surface.get_shifts ()[3] == 0 and not lilendian: + start = 3 + else: + raise ValueError, "unsupported colormasks for alpha reference array" - width, height = surface.get_width (), surface.get_height () - array = numpy.frombuffer (surface.get_buffer (), numpy.uint8) - array.shape = height, surface.get_pitch () - array = array[:, start::4] - array = array[:, :width * 4] - return numpy.transpose (array) + array = numpy.ndarray \ + (shape=(surface.get_width (), surface.get_height ()), + dtype=numpy.uint8, buffer=surface.get_buffer (), + offset=start, strides=(4, surface.get_pitch ())) + return array def array_colorkey (surface): """pygame.numpyarray.array_colorkey (Surface): return array
Attachment:
pgpGGyjceclUh.pgp
Description: PGP signature