def set_mode(resolution=(0, 0), flags=0, depth=0): """ set_mode(resolution=(0,0), flags=0, depth=0) -> Surface Initialize a window or screen for display """ w, h = unpack_rect(resolution) if w < 0 or h < 0: raise SDLError("Cannot set negative sized display mode") if flags == 0: flags = sdl.SDL_SWSURFACE if not get_init(): init() # depth and double buffering attributes need to be set specially for OpenGL if flags & sdl.SDL_OPENGL: if flags & sdl.SDL_DOUBLEBUF: gl_set_attribute(sdl.SDL_GL_DOUBLEBUFFER, 1) else: gl_set_attribute(sdl.SDL_GL_DOUBLEBUFFER, 0) if depth: gl_set_attribute(sdl.SDL_GL_DEPTH_SIZE, depth) c_surface = sdl.SDL_SetVideoMode(w, h, depth, flags) if c_surface and gl_get_attribute(sdl.SDL_GL_DOUBLEBUFFER): c_surface.flags |= sdl.SDL_DOUBLEBUF else: if depth == 0: flags |= sdl.SDL_ANYFORMAT c_surface = sdl.SDL_SetVideoMode(w, h, depth, flags) if not c_surface: raise SDLError.from_sdl_error() title = ffi.new("char*[1]") icon = ffi.new("char*[1]") sdl.SDL_WM_GetCaption(title, icon) if not title: sdl.SDL_WM_SetCaption("pygame window", "pygame") # pygame does this, so it's possibly a good idea sdl.SDL_PumpEvents() global _display_surface _display_surface = SurfaceNoFree._from_sdl_surface(c_surface) # TODO: set icon stuff return _display_surface
def __init__(self, size, flags=0, depth=0, masks=None): w, h = unpack_rect(size) if isinstance(depth, Surface): if masks: raise ValueError( "cannot pass surface for depth and color masks") surface = depth depth = 0 else: surface = None depth = int(depth) if depth and masks: Rmask, Gmask, Bmask, Amask = masks bpp = depth elif surface is None: if depth: bpp = depth Rmask, Gmask, Bmask, Amask = \ self._get_default_masks(bpp, False) elif sdl.SDL_GetVideoSurface(): pix = sdl.SDL_GetVideoSurface().format bpp = pix.BitsPerPixel Amask = pix.Amask Rmask = pix.Rmask Gmask = pix.Gmask Bmask = pix.Bmask elif sdl.SDL_WasInit(sdl.SDL_INIT_VIDEO): pix = sdl.SDL_GetVideoInfo().vfmt bpp = pix.BitsPerPixel Amask = pix.Amask Rmask = pix.Rmask Gmask = pix.Gmask Bmask = pix.Bmask else: bpp = 32 Rmask, Gmask, Bmask, Amask = \ self._get_default_masks(32, False) # the alpha mask might be different - must update if flags & sdl.SDL_SRCALPHA: Rmask, Gmask, Bmask, Amask = \ self._get_default_masks(bpp, True) # depth argument was a Surface object else: pix = surface._c_surface.format bpp = pix.BitsPerPixel if flags & sdl.SDL_SRCALPHA: Rmask, Gmask, Bmask, Amask = \ self._get_default_masks(bpp, True) else: Amask = pix.Amask Rmask = pix.Rmask Gmask = pix.Gmask Bmask = pix.Bmask self._c_surface = sdl.SDL_CreateRGBSurface(flags, w, h, bpp, Rmask, Gmask, Bmask, Amask) self._format = self._c_surface.format self._w = self._c_surface.w self._h = self._c_surface.h if not self._c_surface: raise SDLError.from_sdl_error() if masks: """ Confirm the surface was created correctly (masks were valid). Also ensure that 24 and 32 bit surfaces have 8 bit fields (no losses). """ format = self._format Rmask = (0xFF >> format.Rloss) << format.Rshift Gmask = (0xFF >> format.Gloss) << format.Gshift Bmask = (0xFF >> format.Bloss) << format.Bshift Amask = (0xFF >> format.Aloss) << format.Ashift bad_loss = format.Rloss or format.Gloss or format.Bloss if flags & sdl.SDL_SRCALPHA: bad_loss = bad_loss or format.Aloss else: bad_loss = bad_loss or format.Aloss != 8 if (format.Rmask != Rmask or format.Gmask != Gmask or format.Bmask != Bmask or format.Amask != Amask or (format.BytesPerPixel >= 3 and bad_loss)): # Note: don't free _c_surface here. It will # be done in __del__. raise ValueError("Invalid mask values")
def __init__(self, size, flags=0, depth=0, masks=None): w, h = unpack_rect(size) if isinstance(depth, Surface): if masks: raise ValueError("cannot pass surface for depth and color masks") surface = depth depth = 0 else: surface = None depth = int(depth) if depth and masks: Rmask, Gmask, Bmask, Amask = masks bpp = depth elif surface is None: if depth: bpp = depth Rmask, Gmask, Bmask, Amask = \ self._get_default_masks(bpp, False) elif sdl.SDL_GetVideoSurface(): pix = sdl.SDL_GetVideoSurface().format bpp = pix.BitsPerPixel Amask = pix.Amask Rmask = pix.Rmask Gmask = pix.Gmask Bmask = pix.Bmask elif sdl.SDL_WasInit(sdl.SDL_INIT_VIDEO): pix = sdl.SDL_GetVideoInfo().vfmt bpp = pix.BitsPerPixel Amask = pix.Amask Rmask = pix.Rmask Gmask = pix.Gmask Bmask = pix.Bmask else: bpp = 32 Rmask, Gmask, Bmask, Amask = \ self._get_default_masks(32, False) # the alpha mask might be different - must update if flags & sdl.SDL_SRCALPHA: Rmask, Gmask, Bmask, Amask = \ self._get_default_masks(bpp, True) # depth argument was a Surface object else: pix = surface._c_surface.format bpp = pix.BitsPerPixel if flags & sdl.SDL_SRCALPHA: Rmask, Gmask, Bmask, Amask = \ self._get_default_masks(bpp, True) else: Amask = pix.Amask Rmask = pix.Rmask Gmask = pix.Gmask Bmask = pix.Bmask self._c_surface = sdl.SDL_CreateRGBSurface(flags, w, h, bpp, Rmask, Gmask, Bmask, Amask) self._format = self._c_surface.format self._w = self._c_surface.w self._h = self._c_surface.h if not self._c_surface: raise SDLError.from_sdl_error() if masks: """ Confirm the surface was created correctly (masks were valid). Also ensure that 24 and 32 bit surfaces have 8 bit fields (no losses). """ format = self._format Rmask = (0xFF >> format.Rloss) << format.Rshift Gmask = (0xFF >> format.Gloss) << format.Gshift Bmask = (0xFF >> format.Bloss) << format.Bshift Amask = (0xFF >> format.Aloss) << format.Ashift bad_loss = format.Rloss or format.Gloss or format.Bloss if flags & sdl.SDL_SRCALPHA: bad_loss = bad_loss or format.Aloss else: bad_loss = bad_loss or format.Aloss != 8 if (format.Rmask != Rmask or format.Gmask != Gmask or format.Bmask != Bmask or format.Amask != Amask or (format.BytesPerPixel >= 3 and bad_loss)): # Note: don't free _c_surface here. It will # be done in __del__. raise ValueError("Invalid mask values")