1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121
|
/*
* ScreenHandler.h, part of VCMI engine
*
* Authors: listed in file AUTHORS in main folder
*
* License: GNU General Public License v2.0 or later
* Full text of license available in license.txt file, in main folder
*
*/
#pragma once
struct SDL_Texture;
struct SDL_Window;
struct SDL_Renderer;
struct SDL_Surface;
#include "../../lib/Point.h"
#include "../render/IScreenHandler.h"
enum class EWindowMode
{
// game runs in a window that covers part of the screen
WINDOWED,
// game runs in a 'window' that always covers entire screen and uses unmodified desktop resolution
// The only mode that is available on mobile devices
FULLSCREEN_BORDERLESS_WINDOWED,
// game runs in a fullscreen mode with resolution selected by player
FULLSCREEN_EXCLUSIVE
};
enum class EUpscalingFilter
{
AUTO, // used only for loading from config, replaced with autoselected value on init
NONE,
//BILINEAR, // TODO?
//BICUBIC, // TODO?
XBRZ_2,
XBRZ_3,
XBRZ_4,
// NOTE: xbrz also provides x5 and x6 filters, but those would require high-end gaming PC's due to huge memory usage with no visible gain
};
/// This class is responsible for management of game window and its main rendering surface
class ScreenHandler final : public IScreenHandler
{
EUpscalingFilter upscalingFilter = EUpscalingFilter::AUTO;
/// Dimensions of target surfaces/textures, this value is what game logic views as screen size
Point getPreferredLogicalResolution() const;
/// Dimensions of output window, if different from logicalResolution SDL will perform scaling
/// This value is what player views as window size
Point getPreferredWindowResolution() const;
EWindowMode getPreferredWindowMode() const;
/// Returns index of display on which window should be created
int getPreferredDisplayIndex() const;
/// Returns index of rendering driver preferred by player or -1 if no preference
int getPreferredRenderingDriver() const;
/// Creates SDL window with specified parameters
SDL_Window * createWindowImpl(Point dimensions, int flags, bool center);
/// Creates SDL window using OS-specific settings & user-specific config
SDL_Window * createWindow();
/// Manages window and SDL renderer
void initializeWindow();
void destroyWindow();
/// Manages surfaces & textures used for
void initializeScreenBuffers();
void destroyScreenBuffers();
/// Updates state (e.g. position) of game window after resolution/fullscreen change
void updateWindowState();
/// Initializes or reiniitalizes all screen state
void recreateWindowAndScreenBuffers();
/// Performs validation of settings and updates them to valid values if necessary
void validateSettings();
EUpscalingFilter loadUpscalingFilter() const;
void selectDownscalingFilter();
void selectUpscalingFilter();
public:
/// Creates and initializes screen, window and SDL state
ScreenHandler();
/// Updates and potentially recreates target screen to match selected fullscreen status
void onScreenResize() final;
/// De-initializes and destroys screen, window and SDL state
void close() final;
/// Fills screen with black color, erasing any existing content
void clearScreen() final;
/// Dimensions of render output, usually same as window size except for high-DPI screens on macOS / iOS
Point getRenderResolution() const final;
/// Window has focus
bool hasFocus() final;
Point getLogicalResolution() const final;
int getScalingFactor() const final;
int getInterfaceScalingPercentage() const final;
std::vector<Point> getSupportedResolutions() const final;
std::vector<Point> getSupportedResolutions(int displayIndex) const;
std::tuple<int, int> getSupportedScalingRange() const final;
Rect convertLogicalPointsToWindow(const Rect & input) const final;
};
|