added functions for window scaling

This commit is contained in:
funcelot 2021-01-05 12:08:48 +03:00
parent d5361d45fe
commit ce4f3b7c6c
3 changed files with 44 additions and 19 deletions

View File

@ -16,6 +16,9 @@ RLAPI bool IsWindowResized(void); // Check if wi
RLAPI bool IsWindowState(unsigned int flag); // Check if one specific window flag is enabled
RLAPI void SetWindowState(unsigned int flags); // Set window configuration state using flags
RLAPI void ClearWindowState(unsigned int flags); // Clear window configuration state flags
RLAPI void SetWindowScale(float scaleFactor); // Set window scale factor
RLAPI void SaveWindowScale(void); // Save window scale to defaults
RLAPI void RestoreWindowScale(void); // Load window scale from defaults
RLAPI void ToggleFullscreen(void); // Toggle window state: fullscreen/windowed (only PLATFORM_DESKTOP)
RLAPI void MaximizeWindow(void); // Set window state: maximized, if resizable (only PLATFORM_DESKTOP)
RLAPI void MinimizeWindow(void); // Set window state: minimized, if resizable (only PLATFORM_DESKTOP)

View File

@ -1035,11 +1035,7 @@ void ToggleFullscreen(void)
CORE.Window.flags ^= FLAG_FULLSCREEN_MODE;
if (CORE.Window.fullscreen)
{
CORE.Window.defaultScreenScaleX = CORE.Window.screenScaleX;
CORE.Window.defaultScreenScaleY = CORE.Window.screenScaleY;
CORE.Window.defaultScreen = CORE.Window.screen;
CORE.Window.defaultRender = CORE.Window.render;
CORE.Window.defaultScreenScale = CORE.Window.screenScale;
SaveWindowScale();
// Store previous window position (in case we exit fullscreen)
glfwGetWindowPos(CORE.Window.handle, &CORE.Window.position.x, &CORE.Window.position.y);
@ -1070,9 +1066,7 @@ void ToggleFullscreen(void)
}
const GLFWvidmode *mode = glfwGetVideoMode(monitor);
CORE.Window.screenScaleX = 1.0f;
CORE.Window.screenScaleY = 1.0f;
CORE.Window.screenScale = MatrixIdentity();
SetWindowScale(1.0f);
glfwSetWindowMonitor(CORE.Window.handle, monitor, 0, 0, CORE.Window.screen.width, CORE.Window.screen.height, mode->refreshRate);
// Try to enable GPU V-Sync, so frames are limited to screen refresh rate (60Hz -> 60 FPS)
@ -1080,11 +1074,7 @@ void ToggleFullscreen(void)
if (CORE.Window.flags & FLAG_VSYNC_HINT) glfwSwapInterval(1);
}
else {
CORE.Window.screenScaleX = CORE.Window.defaultScreenScaleX;
CORE.Window.screenScaleY = CORE.Window.defaultScreenScaleY;
CORE.Window.screen = CORE.Window.defaultScreen;
CORE.Window.render = CORE.Window.defaultRender;
CORE.Window.screenScale = CORE.Window.defaultScreenScale;
RestoreWindowScale();
glfwSetWindowMonitor(CORE.Window.handle, NULL, CORE.Window.position.x, CORE.Window.position.y, (int)((float)CORE.Window.screen.width * CORE.Window.screenScaleX), (int)((float)CORE.Window.screen.height * CORE.Window.screenScaleY), GLFW_DONT_CARE);
}
@ -1130,6 +1120,39 @@ void ToggleFullscreen(void)
#endif
}
// Set window scale factor
void SetWindowScale(float scaleFactor)
{
#if defined(PLATFORM_DESKTOP)
CORE.Window.screenScaleX = scaleFactor;
CORE.Window.screenScaleY = scaleFactor;
CORE.Window.screenScale = (scaleFactor == 1.0f) ? MatrixIdentity(): MatrixScale(scaleFactor, scaleFactor, 1.0f);
#endif
}
// Save window scale to defaults
void SaveWindowScale()
{
#if defined(PLATFORM_DESKTOP)
CORE.Window.defaultScreenScaleX = CORE.Window.screenScaleX;
CORE.Window.defaultScreenScaleY = CORE.Window.screenScaleY;
CORE.Window.defaultScreen = CORE.Window.screen;
CORE.Window.defaultRender = CORE.Window.render;
CORE.Window.defaultScreenScale = CORE.Window.screenScale;
#endif
}
// Load window scale from defaults
void RestoreWindowScale() {
#if defined(PLATFORM_DESKTOP)
CORE.Window.screenScaleX = CORE.Window.defaultScreenScaleX;
CORE.Window.screenScaleY = CORE.Window.defaultScreenScaleY;
CORE.Window.screen = CORE.Window.defaultScreen;
CORE.Window.render = CORE.Window.defaultRender;
CORE.Window.screenScale = CORE.Window.defaultScreenScale;
#endif
}
// Set window state: maximized, if resizable (only PLATFORM_DESKTOP)
void MaximizeWindow(void)
{
@ -4095,16 +4118,12 @@ static void SetupWindowContentScale(int width, int height)
glfwGetWindowContentScale(CORE.Window.handle, screenScaleX, screenScaleY);
CORE.Window.screenScale = MatrixScale(CORE.Window.screenScaleX, CORE.Window.screenScaleY, 1.0f);
} else {
CORE.Window.screenScaleX = 1.0f;
CORE.Window.screenScaleY = 1.0f;
CORE.Window.screenScale = MatrixIdentity();
SetWindowScale(1.0f);
}
}
else
{
CORE.Window.screenScaleX = 1.0f;
CORE.Window.screenScaleY = 1.0f;
CORE.Window.screenScale = MatrixIdentity();
SetWindowScale(1.0f);
}
if (width == 0) {
width = (int)(((float)CORE.Window.defaultScreen.width)/CORE.Window.screenScaleX);

View File

@ -902,6 +902,9 @@ RLAPI bool IsWindowResized(void); // Check if wi
RLAPI bool IsWindowState(unsigned int flag); // Check if one specific window flag is enabled
RLAPI void SetWindowState(unsigned int flags); // Set window configuration state using flags
RLAPI void ClearWindowState(unsigned int flags); // Clear window configuration state flags
RLAPI void SetWindowScale(float scaleFactor); // Set window scale factor
RLAPI void SaveWindowScale(void); // Save window scale to defaults
RLAPI void RestoreWindowScale(void); // Load window scale from defaults
RLAPI void ToggleFullscreen(void); // Toggle window state: fullscreen/windowed (only PLATFORM_DESKTOP)
RLAPI void MaximizeWindow(void); // Set window state: maximized, if resizable (only PLATFORM_DESKTOP)
RLAPI void MinimizeWindow(void); // Set window state: minimized, if resizable (only PLATFORM_DESKTOP)