def __init__(self, source): """Creates a new PixelView from a Sprite or SDL_Surface. If necessary, the surface will be locked for accessing its pixel data. The lock will be removed once the PixelView is garbage-collected or deleted. """ if isinstance(source, SoftwareSprite): self._surface = source.surface # keep a reference, so the Sprite's not GC'd self._sprite = source elif isinstance(source, sdlsurface.SDL_Surface): self._surface = source else: raise TypeError("source must be a Sprite or SDL_Surface") if sdlsurface.SDL_MUSTLOCK(self._surface): sdlsurface.lock_surface(self._surface) pxbuf = self._surface.pixels itemsize = self._surface.format.BytesPerPixel strides = (self._surface.size[1], self._surface.size[0]) srcsize = self._surface.size[1] * self._surface.pitch super(PixelView, self).__init__( pxbuf, itemsize, strides, getfunc=self._getitem, setfunc=self._setitem, srcsize=srcsize )
def hflip(self): pitch = self._surf._pitch pixels = ctypes.cast(self._surf._pixels, ctypes.c_void_p).value h = self._surf._h tmp_ba = bytearray(pitch*h) tmp = bar2voidp(tmp_ba).value sdlsurface.lock_surface(self._surf) ctypes.memmove(tmp, pixels, pitch*h) for y in range(self._surf._h): src = tmp + pitch * ( h - y - 1) dst = pixels + pitch * y ctypes.memmove(dst, src, pitch) sdlsurface.unlock_surface(self._surf)
def test_lock_unlock_MUSTLOCK_surface(self): colormods = ((0, 0, 0), (32, 64, 128), (10, 20, 30), (1, 2, 4), (255, 255, 255), (128, 128, 128), (127, 127, 127), ) for fmt in pixels.ALL_PIXELFORMATS: if pixels.SDL_ISPIXELFORMAT_FOURCC(fmt): continue bpp, rmask, gmask, bmask, amask = \ pixels.pixelformat_enum_to_masks(fmt) sf = surface.create_rgb_surface(10, 10, bpp, rmask, gmask, bmask, amask) # TODO: locking seems to be only necessary for RLE surfaces... if surface.SDL_MUSTLOCK(sf): self.assertFalse(sf.locked) surface.lock_surface(sf) self.assertTrue(sf.locked) surface.lock_surface(sf) self.assertTrue(sf.locked) surface.lock_surface(sf) self.assertTrue(sf.locked) surface.unlock_surface(sf) self.assertTrue(sf.locked) surface.unlock_surface(sf) self.assertTrue(sf.locked) surface.unlock_surface(sf) self.assertFalse(sf.locked) surface.free_surface(sf)
def pixels3d(source): """Creates a 3D pixel array from the passed source. """ if not _HASNUMPY: raise UnsupportedError(pixels3d, "numpy module could not be loaded") if isinstance(source, SoftwareSprite): surface = source.surface elif isinstance(source, sdlsurface.SDL_Surface): surface = source else: raise TypeError("source must be a Sprite or SDL_Surface") bpp = surface.format.BytesPerPixel if bpp < 1 or bpp > 4: raise ValueError("unsupported bpp") strides = (surface.pitch, bpp, 1) srcsize = surface.size[1] * surface.pitch shape = surface.size[1], surface.size[0], bpp if sdlsurface.SDL_MUSTLOCK(surface): sdlsurface.lock_surface(surface) pxbuf = ctypes.cast(surface.pixels, ctypes.POINTER(ctypes.c_ubyte * srcsize)).contents return SurfaceArray(shape, numpy.uint8, pxbuf, 0, strides, "C", source, surface).transpose(1, 0, 2)