⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sdl_sysvideo.cc

📁 MPEG-4编解码的实现(包括MPEG4视音频编解码)
💻 CC
📖 第 1 页 / 共 2 页
字号:
			modes = ((SDL_Rect **)-1);
		}
	}
	return(modes);
}

/* Various screen update functions available */
static void BE_NormalUpdate(_THIS, int numrects, SDL_Rect *rects);


/* Find the closest display mode for fullscreen */
static bool BE_FindClosestFSMode(_THIS, int width, int height, int bpp,
					 display_mode *mode)
{
	BScreen bscreen;
	uint32 i, nmodes;
	SDL_Rect **modes;
	display_mode *dmodes;

	modes = SDL_modelist[((bpp+7)/8)-1];
	for ( i=0; modes[i] && (modes[i]->w > width) &&
		      (modes[i]->h > height); ++i ) {
		/* still looking */
	}
	if ( ! modes[i] || (modes[i]->w < width) || (modes[i]->h < width) ) {
		--i;	/* We went too far */
	}
	width = modes[i]->w;
	height = modes[i]->h;      
	bscreen.GetModeList(&dmodes, &nmodes);
	for ( i = 0; i < nmodes; ++i ) {
		if ( (bpp == ColorSpaceToBitsPerPixel(dmodes[i].space)) &&
		     (width == dmodes[i].virtual_width) &&
		     (height == dmodes[i].virtual_height) ) {
			break;
		}
	}
	if ( i != nmodes ) {
		*mode = dmodes[i];
		return true;
	} else {
		return false;
	}	
}

static int BE_SetFullScreen(_THIS, SDL_Surface *screen, int fullscreen)
{
	int was_fullscreen;
	bool needs_unlock;
	BScreen bscreen;
	BRect bounds;
	display_mode mode;
	int width, height, bpp;

	/* Set the fullscreen mode */
	was_fullscreen = SDL_Win->IsFullScreen();
	SDL_Win->SetFullScreen(fullscreen);
	fullscreen = SDL_Win->IsFullScreen();

	width = screen->w;
	height = screen->h;

	/* Set the appropriate video mode */
	if ( fullscreen ) {
		bpp = screen->format->BitsPerPixel;
		bscreen.GetMode(&mode);
		if ( (bpp != ColorSpaceToBitsPerPixel(mode.space)) ||
		     (width != mode.virtual_width) ||
		     (height != mode.virtual_height)) {
			if(BE_FindClosestFSMode(_this, width, height, bpp, &mode)) {
				bscreen.SetMode(&mode);
				/* This simply stops the next resize event from being
				 * sent to the SDL handler.
				 */
				SDL_Win->InhibitResize();
			} else {
				fullscreen = 0;
				SDL_Win->SetFullScreen(fullscreen);
			}
		}
	}
	if ( was_fullscreen && ! fullscreen ) {
		bscreen.SetMode(&saved_mode);
	}

	if ( SDL_Win->Lock() ) {
		int xoff, yoff;
		if ( SDL_Win->Shown() ) {
			needs_unlock = 1;
			SDL_Win->Hide();
		} else {
			needs_unlock = 0;
		}
		/* This resizes the window and view area, but inhibits resizing
		 * of the BBitmap due to the InhibitResize call above. Thus the
		 * bitmap (pixel data) never changes.
		 */
		SDL_Win->ResizeTo(width, height);
		bounds = bscreen.Frame();
		/* Calculate offsets - used either to center window
		 * (windowed mode) or to set drawing offsets (fullscreen mode)
		 */
		xoff = (bounds.IntegerWidth() - width)/2;
		yoff = (bounds.IntegerHeight() - height)/2;
		if ( fullscreen ) {
			/* Set offset for drawing */
			SDL_Win->SetXYOffset(xoff, yoff);
		} else {
			/* Center window and reset the drawing offset */
			SDL_Win->SetXYOffset(0, 0);
		}
		if ( ! needs_unlock || was_fullscreen ) {
			/* Center the window the first time */
			SDL_Win->MoveTo(xoff > 0 ? (float)xoff : 0.0f,
					yoff > 0 ? (float)yoff : 0.0f);
		}
		SDL_Win->Show();
		
		/* Unlock the window manually after the first Show() */
		if ( needs_unlock ) {
			SDL_Win->Unlock();
		}
	}

	/* Set the fullscreen flag in the screen surface */
	if ( fullscreen ) {
		screen->flags |= SDL_FULLSCREEN;
	} else {
		screen->flags &= ~SDL_FULLSCREEN; 
	}
	return(1);
}

static int BE_ToggleFullScreen(_THIS, int fullscreen)
{
	return BE_SetFullScreen(_this, _this->screen, fullscreen);
}

/* FIXME: check return values and cleanup here */
SDL_Surface *BE_SetVideoMode(_THIS, SDL_Surface *current,
				int width, int height, int bpp, Uint32 flags)
{
	BScreen bscreen;
	BBitmap *bbitmap;
	BRect bounds;

	/* Create the view for this window */
	if ( SDL_Win->CreateView(flags) < 0 ) {
		return(NULL);
	}

	current->flags = 0;		/* Clear flags */
	current->w = width;
	current->h = height;
	SDL_Win->SetType(B_TITLED_WINDOW);
	if ( flags & SDL_NOFRAME ) {
		current->flags |= SDL_NOFRAME;
		SDL_Win->SetLook(B_NO_BORDER_WINDOW_LOOK);
	} else {
		if ( (flags & SDL_RESIZABLE) && !(flags & SDL_OPENGL) )  {
			current->flags |= SDL_RESIZABLE;
			/* We don't want opaque resizing (TM). :-) */
			SDL_Win->SetFlags(B_OUTLINE_RESIZE);
		} else {
			SDL_Win->SetFlags(B_NOT_RESIZABLE|B_NOT_ZOOMABLE);
		}
	}

	if ( flags & SDL_OPENGL ) {
		current->flags |= SDL_OPENGL;
		current->pitch = 0;
		current->pixels = NULL;
		_this->UpdateRects = NULL;		
	} else {
		/* Create the BBitmap framebuffer */
		bounds.top = 0; bounds.left = 0;
		bounds.right = width-1;
		bounds.bottom = height-1;
		bbitmap = new BBitmap(bounds, bscreen.ColorSpace());
		if ( ! bbitmap->IsValid() ) {
			SDL_SetError("Couldn't create screen bitmap");
			delete bbitmap;
			return(NULL);
		}
		current->pitch = bbitmap->BytesPerRow();
		current->pixels = (void *)bbitmap->Bits();
		SDL_Win->SetBitmap(bbitmap);
		_this->UpdateRects = BE_NormalUpdate;
	}

	/* Set the correct fullscreen mode */
	BE_SetFullScreen(_this, current, flags & SDL_FULLSCREEN ? 1 : 0);

	/* We're done */
	return(current);
}

/* Update the current mouse state and position */
void BE_UpdateMouse(_THIS)
{
	BPoint point;
	uint32 buttons;

	if ( SDL_Win->Lock() ) {
		/* Get new input state, if still active */
		if ( SDL_Win->IsActive() ) {
			(SDL_Win->View())->GetMouse(&point, &buttons, true);
		} else {
			point.x = -1;
			point.y = -1;
		}
		SDL_Win->Unlock();

		if ( (point.x >= 0) && (point.x < SDL_VideoSurface->w) &&
		     (point.y >= 0) && (point.y < SDL_VideoSurface->h) ) {
			SDL_PrivateAppActive(1, SDL_APPMOUSEFOCUS);
			SDL_PrivateMouseMotion(0, 0,
					(Sint16)point.x, (Sint16)point.y);
		} else {
			SDL_PrivateAppActive(0, SDL_APPMOUSEFOCUS);
		}
	}
}

/* We don't actually allow hardware surfaces other than the main one */
static int BE_AllocHWSurface(_THIS, SDL_Surface *surface)
{
	return(-1);
}
static void BE_FreeHWSurface(_THIS, SDL_Surface *surface)
{
	return;
}
static int BE_LockHWSurface(_THIS, SDL_Surface *surface)
{
	return(0);
}
static void BE_UnlockHWSurface(_THIS, SDL_Surface *surface)
{
	return;
}

static void BE_NormalUpdate(_THIS, int numrects, SDL_Rect *rects)
{
	if ( SDL_Win->BeginDraw() ) {
		int i;

		for ( i=0; i<numrects; ++i ) {
			BRect rect;

			rect.top = rects[i].y;
			rect.left = rects[i].x;
			rect.bottom = rect.top+rects[i].h-1;
			rect.right = rect.left+rects[i].w-1;
			SDL_Win->DrawAsync(rect);
		}
		SDL_Win->EndDraw();
	}
}

#ifdef HAVE_OPENGL
void BE_GL_SwapBuffers(_THIS)
{
	SDL_Win->SwapBuffers();
}
#endif

/* Is the system palette settable? */
int BE_SetColors(_THIS, int firstcolor, int ncolors, SDL_Color *colors)
{
	int i;
	SDL_Palette *palette;
	const color_map *cmap = BScreen().ColorMap();

	/* Get the screen colormap */
	palette = _this->screen->format->palette;
	for ( i=0; i<256; ++i ) {
		palette->colors[i].r = cmap->color_list[i].red;
		palette->colors[i].g = cmap->color_list[i].green;
		palette->colors[i].b = cmap->color_list[i].blue;
	}
	return(0);
}

void BE_VideoQuit(_THIS)
{
	int i, j;

	if ( SDL_BlankCursor != NULL ) {
		BE_FreeWMCursor(_this, SDL_BlankCursor);
		SDL_BlankCursor = NULL;
	}
	for ( i=0; i<NUM_MODELISTS; ++i ) {
		if ( SDL_modelist[i] ) {
			for ( j=0; SDL_modelist[i][j]; ++j ) {
				free(SDL_modelist[i][j]);
			}
			free(SDL_modelist[i]);
			SDL_modelist[i] = NULL;
		}
	}
	/* Restore the original video mode */
	if ( _this->screen ) {
		if ( (_this->screen->flags&SDL_FULLSCREEN) == SDL_FULLSCREEN ) {
			BScreen bscreen;
			bscreen.SetMode(&saved_mode);
		}
		_this->screen->pixels = NULL;
	}
	SDL_QuitBeApp();
}

}; /* Extern C */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -