summaryrefslogtreecommitdiff
path: root/src/video/video_driver.hpp
diff options
context:
space:
mode:
authorMichael Lutz <michi@icosahedron.de>2021-01-14 21:53:06 +0100
committerGitHub <noreply@github.com>2021-01-14 21:53:06 +0100
commitfa60c1f8b94dd5584a5d5331de277ca23a203422 (patch)
tree7849166d1c2ee40f4d48f4fc4442af1ee24b3b2f /src/video/video_driver.hpp
parent711723d7387df67b1abe98ca9ed4d7f2bd7de57d (diff)
downloadopenttd-fa60c1f8b94dd5584a5d5331de277ca23a203422.tar.xz
Feature: Choose a sensible window size on a fresh OTTD config file. (#8536)
Diffstat (limited to 'src/video/video_driver.hpp')
-rw-r--r--src/video/video_driver.hpp35
1 files changed, 30 insertions, 5 deletions
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 <vector>
+extern std::string _ini_videodriver;
+extern std::vector<Dimension> _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<VideoDriver*>(*DriverFactoryBase::GetActiveDriver(Driver::DT_VIDEO));
}
-};
-extern std::string _ini_videodriver;
-extern std::vector<Dimension> _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 */