From fa60c1f8b94dd5584a5d5331de277ca23a203422 Mon Sep 17 00:00:00 2001 From: Michael Lutz Date: Thu, 14 Jan 2021 21:53:06 +0100 Subject: Feature: Choose a sensible window size on a fresh OTTD config file. (#8536) --- src/video/video_driver.hpp | 35 ++++++++++++++++++++++++++++++----- 1 file changed, 30 insertions(+), 5 deletions(-) (limited to 'src/video/video_driver.hpp') diff --git a/src/video/video_driver.hpp b/src/video/video_driver.hpp index 15dd5d0d4..d4e750134 100644 --- a/src/video/video_driver.hpp +++ b/src/video/video_driver.hpp @@ -12,10 +12,19 @@ #include "../driver.h" #include "../core/geometry_type.hpp" +#include "../core/math_func.hpp" #include +extern std::string _ini_videodriver; +extern std::vector _resolutions; +extern Dimension _cur_resolution; +extern bool _rightclick_emulate; + /** The base of all video drivers. */ class VideoDriver : public Driver { + const uint DEFAULT_WINDOW_WIDTH = 640u; ///< Default window width. + const uint DEFAULT_WINDOW_HEIGHT = 480u; ///< Default window height. + public: /** * Mark a particular area dirty. @@ -102,11 +111,27 @@ public: static VideoDriver *GetInstance() { return static_cast(*DriverFactoryBase::GetActiveDriver(Driver::DT_VIDEO)); } -}; -extern std::string _ini_videodriver; -extern std::vector _resolutions; -extern Dimension _cur_resolution; -extern bool _rightclick_emulate; +protected: + /* + * Get the resolution of the main screen. + */ + virtual Dimension GetScreenSize() const { return { DEFAULT_WINDOW_WIDTH, DEFAULT_WINDOW_HEIGHT }; } + + /** + * Apply resolution auto-detection and clamp to sensible defaults. + */ + void UpdateAutoResolution() + { + if (_cur_resolution.width == 0 || _cur_resolution.height == 0) { + /* Auto-detect a good resolution. We aim for 75% of the screen size. + * Limit width times height times bytes per pixel to fit a 32 bit + * integer, This way all internal drawing routines work correctly. */ + Dimension res = this->GetScreenSize(); + _cur_resolution.width = ClampU(res.width * 3 / 4, DEFAULT_WINDOW_WIDTH, UINT16_MAX / 2); + _cur_resolution.height = ClampU(res.height * 3 / 4, DEFAULT_WINDOW_HEIGHT, UINT16_MAX / 2); + } + } +}; #endif /* VIDEO_VIDEO_DRIVER_HPP */ -- cgit v1.2.3-54-g00ecf