#include "pch.h" #include "fullscrn.h" #include "options.h" #include "pb.h" #include "render.h" #include "winmain.h" int fullscrn::screen_mode; int fullscrn::display_changed; int fullscrn::resolution = 0; const resolution_info fullscrn::resolution_array[3] = { {640, 480, 600, 416, 501}, {800, 600, 752, 520, 502}, {1024, 768, 960, 666, 503}, }; float fullscrn::ScaleX = 1; float fullscrn::ScaleY = 1; int fullscrn::OffsetX = 0; int fullscrn::OffsetY = 0; void fullscrn::init() { window_size_changed(); } void fullscrn::shutdown() { if (display_changed) set_screen_mode(0); } int fullscrn::set_screen_mode(int isFullscreen) { int result = isFullscreen; if (isFullscreen == screen_mode) return result; screen_mode = isFullscreen; if (isFullscreen) { enableFullscreen(); result = 1; } else { disableFullscreen(); result = 1; } return result; } int fullscrn::enableFullscreen() { if (!display_changed) { if (SDL_SetWindowFullscreen(winmain::MainWindow, SDL_WINDOW_FULLSCREEN_DESKTOP) == 0) { display_changed = 1; return 1; } } return 0; } int fullscrn::disableFullscreen() { if (display_changed) { if (SDL_SetWindowFullscreen(winmain::MainWindow, 0) == 0) display_changed = 0; } return 0; } void fullscrn::activate(int flag) { if (screen_mode) { if (!flag) { set_screen_mode(0); } } } int fullscrn::GetResolution() { return resolution; } void fullscrn::SetResolution(int value) { if (!pb::FullTiltMode) value = 0; assertm(value >= 0 && value <= 2, "Resolution value out of bounds"); resolution = value; } int fullscrn::GetMaxResolution() { return pb::FullTiltMode ? 2 : 0; } void fullscrn::window_size_changed() { int width, height; SDL_GetRendererOutputSize(winmain::Renderer, &width, &height); int menuHeight = options::Options.ShowMenu ? winmain::MainMenuHeight : 0; height -= menuHeight; auto res = &resolution_array[resolution]; ScaleX = static_cast(width) / res->TableWidth; ScaleY = static_cast(height) / res->TableHeight; OffsetX = OffsetY = 0; if (options::Options.UniformScaling) { ScaleY = ScaleX = std::min(ScaleX, ScaleY); OffsetX = static_cast(floor((width - res->TableWidth * ScaleX) / 2)); OffsetY = static_cast(floor((height - res->TableHeight * ScaleY) / 2)); } render::DestinationRect = SDL_Rect { OffsetX, OffsetY + menuHeight, width - OffsetX * 2, height - OffsetY * 2 }; }