X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Ftools.c;h=d44e2cb48c6f83174133da7f2bc99cf40b704434;hb=ac94403f845928d307f2a7b60e81dfca1fd13cbb;hp=1762651003cd65ab3995e546b484237d09f5f997;hpb=b641818c787e48bbf03ce2a0cd5b542c4c21e523;p=rocksndiamonds.git diff --git a/src/tools.c b/src/tools.c index 17626510..d44e2cb4 100644 --- a/src/tools.c +++ b/src/tools.c @@ -9243,51 +9243,57 @@ void PlaySoundSelecting(void) #endif } -void ToggleFullscreenOrChangeWindowScalingIfNeeded(void) +void ToggleFullscreenIfNeeded(void) { - boolean change_fullscreen = (setup.fullscreen != - video.fullscreen_enabled); - boolean change_window_scaling_percent = (!video.fullscreen_enabled && - setup.window_scaling_percent != - video.window_scaling_percent); - - if (change_window_scaling_percent && video.fullscreen_enabled) - return; + if (setup.fullscreen != video.fullscreen_enabled && + video.fullscreen_available) + { + SDLSetWindowFullscreen(setup.fullscreen); - if (!change_window_scaling_percent && !video.fullscreen_available) - return; + // set setup value according to successfully changed fullscreen mode + setup.fullscreen = video.fullscreen_enabled; + } +} - if (change_window_scaling_percent) +void ChangeWindowScalingIfNeeded(void) +{ + if (setup.window_scaling_percent != video.window_scaling_percent && + !video.fullscreen_enabled) { SDLSetWindowScaling(setup.window_scaling_percent); - return; + // set setup value according to successfully changed window scaling + setup.window_scaling_percent = video.window_scaling_percent; } - else if (change_fullscreen) - { - SDLSetWindowFullscreen(setup.fullscreen); +} - // set setup value according to successfully changed fullscreen mode - setup.fullscreen = video.fullscreen_enabled; +void ChangeVsyncModeIfNeeded(void) +{ + int setup_vsync_mode = VSYNC_MODE_STR_TO_INT(setup.vsync_mode); + int video_vsync_mode = video.vsync_mode; + // if setup and video vsync mode are already matching, nothing do do + if (setup_vsync_mode == video_vsync_mode) return; - } - if (change_fullscreen || - change_window_scaling_percent) + // if renderer is using OpenGL, vsync mode can directly be changed + SDLSetScreenVsyncMode(setup.vsync_mode); + + // if vsync mode unchanged, try re-creating renderer to set vsync mode + if (video.vsync_mode == video_vsync_mode) { Bitmap *tmp_backbuffer = CreateBitmap(WIN_XSIZE, WIN_YSIZE, DEFAULT_DEPTH); - // save backbuffer content which gets lost when toggling fullscreen mode + // save backbuffer content which gets lost when re-creating screen BlitBitmap(backbuffer, tmp_backbuffer, 0, 0, WIN_XSIZE, WIN_YSIZE, 0, 0); - if (change_window_scaling_percent) - { - // keep window mode, but change window scaling - video.fullscreen_enabled = TRUE; // force new window scaling - } + // force re-creating screen and renderer to set new vsync mode + video.fullscreen_enabled = !setup.fullscreen; - // toggle fullscreen + // when creating new renderer, destroy textures linked to old renderer + FreeAllImageTextures(); // needs old renderer to free the textures + + // re-create screen and renderer (including change of vsync mode) ChangeVideoModeIfNeeded(setup.fullscreen); // set setup value according to successfully changed fullscreen mode @@ -9295,12 +9301,17 @@ void ToggleFullscreenOrChangeWindowScalingIfNeeded(void) // restore backbuffer content from temporary backbuffer backup bitmap BlitBitmap(tmp_backbuffer, backbuffer, 0, 0, WIN_XSIZE, WIN_YSIZE, 0, 0); - FreeBitmap(tmp_backbuffer); // update visible window/screen BlitBitmap(backbuffer, window, 0, 0, WIN_XSIZE, WIN_YSIZE, 0, 0); + + // when changing vsync mode, re-create textures for new renderer + InitImageTextures(); } + + // set setup value according to successfully changed vsync mode + setup.vsync_mode = VSYNC_MODE_INT_TO_STR(video.vsync_mode); } static void JoinRectangles(int *x, int *y, int *width, int *height, @@ -9641,6 +9652,6 @@ void ChangeViewportPropertiesIfNeeded(void) if (init_em_graphics) { - InitGraphicInfo_EM(); + InitGraphicInfo_EM(); } }