예제 #1
0
    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
        )
예제 #2
0
파일: gl.py 프로젝트: lxnt/fgtestbed
 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)
예제 #3
0
 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)
예제 #4
0
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)