From: Holger Schemel Date: Mon, 11 Dec 2000 22:36:29 +0000 (+0100) Subject: rnd-20001211-1-src X-Git-Tag: 2.0.0^2~7 X-Git-Url: https://git.artsoft.org/?a=commitdiff_plain;h=c9821c49e08e02532f3ff812ebf8f64230aea7ea;p=rocksndiamonds.git rnd-20001211-1-src --- diff --git a/src/libgame/sdl.c b/src/libgame/sdl.c index 18de01b3..f0cb1790 100644 --- a/src/libgame/sdl.c +++ b/src/libgame/sdl.c @@ -62,16 +62,18 @@ inline void SDLInitVideoBuffer(DrawBuffer **backbuffer, DrawWindow **window, inline boolean SDLSetVideoMode(DrawBuffer **backbuffer, boolean fullscreen) { boolean success = TRUE; - int surface_flags = SDL_HWSURFACE | (fullscreen ? SDL_FULLSCREEN : 0); + int surface_flags_fullscreen = SURFACE_FLAGS | SDL_FULLSCREEN; + int surface_flags_window = SURFACE_FLAGS; + SDL_Surface *new_surface = NULL; + + if (*backbuffer == NULL) + *backbuffer = CreateBitmapStruct(); if (fullscreen && !video.fullscreen_enabled && video.fullscreen_available) { /* switch display to fullscreen mode, if available */ - DrawWindow *window_old = *backbuffer; - DrawWindow *window_new = CreateBitmapStruct(); - - if ((window_new->surface = SDL_SetVideoMode(video.width, video.height, - video.depth, surface_flags)) + if ((new_surface = SDL_SetVideoMode(video.width, video.height, + video.depth, surface_flags_fullscreen)) == NULL) { /* switching display to fullscreen mode failed */ @@ -83,23 +85,18 @@ inline boolean SDLSetVideoMode(DrawBuffer **backbuffer, boolean fullscreen) } else { - if (window_old) - FreeBitmap(window_old); - *backbuffer = window_new; + (*backbuffer)->surface = new_surface; video.fullscreen_enabled = TRUE; success = TRUE; } } - if ((!fullscreen && video.fullscreen_enabled) || !*backbuffer) + if ((!fullscreen && video.fullscreen_enabled) || new_surface == NULL) { /* switch display to window mode */ - DrawWindow *window_old = *backbuffer; - DrawWindow *window_new = CreateBitmapStruct(); - - if ((window_new->surface = SDL_SetVideoMode(video.width, video.height, - video.depth, surface_flags)) + if ((new_surface = SDL_SetVideoMode(video.width, video.height, + video.depth, surface_flags_window)) == NULL) { /* switching display to window mode failed -- should not happen */ @@ -109,9 +106,7 @@ inline boolean SDLSetVideoMode(DrawBuffer **backbuffer, boolean fullscreen) } else { - if (window_old) - FreeBitmap(window_old); - *backbuffer = window_new; + (*backbuffer)->surface = new_surface; video.fullscreen_enabled = FALSE; success = TRUE; diff --git a/src/screens.c b/src/screens.c index c593ac8f..486ad6d9 100644 --- a/src/screens.c +++ b/src/screens.c @@ -62,6 +62,28 @@ void DrawHeadline() DrawTextFCentered(46, FC_RED, WINDOW_SUBTITLE_STRING); } +static void ToggleFullscreenIfNeeded() +{ + if (setup.fullscreen != video.fullscreen_enabled) + { + /* save old door content */ + BlitBitmap(backbuffer, pix[PIX_DB_DOOR], + DX, DY, DXSIZE, DYSIZE, DOOR_GFX_PAGEX1, DOOR_GFX_PAGEY1); + + /* toggle fullscreen */ + setup.fullscreen = ChangeVideoModeIfNeeded(setup.fullscreen); + + /* redraw background to newly created backbuffer */ + BlitBitmap(pix[PIX_BACK], backbuffer, 0,0, WIN_XSIZE,WIN_YSIZE, 0,0); + + /* restore old door content */ + BlitBitmap(pix[PIX_DB_DOOR], backbuffer, + DOOR_GFX_PAGEX1, DOOR_GFX_PAGEY1, DXSIZE, DYSIZE, DX, DY); + + redraw_mask = REDRAW_ALL; + } +} + void DrawMainMenu() { static struct LevelDirInfo *leveldir_last_valid = NULL; @@ -84,7 +106,8 @@ void DrawMainMenu() UndrawSpecialEditorDoor(); /* needed if last screen was the setup screen and fullscreen state changed */ - setup.fullscreen = ChangeVideoModeIfNeeded(setup.fullscreen); + ToggleFullscreenIfNeeded(); + #ifdef TARGET_SDL SetDrawtoField(DRAW_BACKBUFFER); #endif