On, Sat Apr 12, 2008, Lorenz Quack wrote: [...] > > Hey there, > > well I did mix up the strides in the last patch. so here is my most recent > patch. Neither me nor my associate experience any of the problems we had > before with this patch. However, the issue with the alpha value ending up > on index 0 remains. It would be really sad if we would have to reshape the > array just to get the alpha value in the correct spot. The "bpp - 1" start messes this up for me. The trick would be to do the same the C code does (which I should have done right from the start). Attached you'll find the version which adapts the Numeric implementation behaviour. Once more, let me know... 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, "unsupport 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):
Attachment:
pgphmEnGzPh7r.pgp
Description: PGP signature