summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorArnaud Valensi <[email protected]>2021-10-10 22:34:56 +0200
committerGitHub <[email protected]>2021-10-10 22:34:56 +0200
commit7c36f3f6b8aac6b59bd9693f0d3e27e723ff5e3b (patch)
tree8ce25d96c27274d82b46a8a1038689e0b0222907 /src
parent3d6d5558c96b818d7016cb92001b2e14e6a8001b (diff)
downloadraylib-7c36f3f6b8aac6b59bd9693f0d3e27e723ff5e3b.tar.gz
raylib-7c36f3f6b8aac6b59bd9693f0d3e27e723ff5e3b.zip
Fix dpi issues (#1987)
Diffstat (limited to 'src')
-rw-r--r--src/rcore.c79
1 files changed, 56 insertions, 23 deletions
diff --git a/src/rcore.c b/src/rcore.c
index 5e5d99a3..13540209 100644
--- a/src/rcore.c
+++ b/src/rcore.c
@@ -1538,13 +1538,25 @@ void SetWindowSize(int width, int height)
// Get current screen width
int GetScreenWidth(void)
{
- return CORE.Window.currentFbo.width;
+ return CORE.Window.screen.width;
}
// Get current screen height
int GetScreenHeight(void)
{
- return CORE.Window.currentFbo.height;
+ return CORE.Window.screen.height;
+}
+
+// Get current render width which is equal to screen width * dpi scale
+int GetRenderWidth(void)
+{
+ return CORE.Window.render.width;
+}
+
+// Get current screen height which is equal to screen height * dpi scale
+int GetRenderHeight(void)
+{
+ return CORE.Window.render.height;
}
// Get native window handle
@@ -2136,8 +2148,8 @@ void EndTextureMode(void)
SetupViewport(CORE.Window.render.width, CORE.Window.render.height);
// Reset current fbo to screen size
- CORE.Window.currentFbo.width = CORE.Window.screen.width;
- CORE.Window.currentFbo.height = CORE.Window.screen.height;
+ CORE.Window.currentFbo.width = CORE.Window.render.width;
+ CORE.Window.currentFbo.height = CORE.Window.render.height;
}
// Begin custom shader mode
@@ -2172,7 +2184,17 @@ void BeginScissorMode(int x, int y, int width, int height)
rlDrawRenderBatchActive(); // Update and draw internal render batch
rlEnableScissorTest();
- rlScissor(x, CORE.Window.currentFbo.height - (y + height), width, height);
+
+ if ((CORE.Window.flags & FLAG_WINDOW_HIGHDPI) > 0) {
+ Vector2 scale = GetWindowScaleDPI();
+ rlScissor(
+ x * scale.x,
+ CORE.Window.currentFbo.height - (y + height) * scale.y,
+ width * scale.x,
+ height * scale.y);
+ } else {
+ rlScissor(x, CORE.Window.currentFbo.height - (y + height), width, height);
+ }
}
// End scissor mode
@@ -3842,16 +3864,6 @@ static bool InitGraphicsDevice(int width, int height)
TRACELOG(LOG_WARNING, "GLFW: Failed to initialize Window");
return false;
}
- else
- {
- TRACELOG(LOG_INFO, "DISPLAY: Device initialized successfully");
-#if defined(PLATFORM_DESKTOP)
- TRACELOG(LOG_INFO, " > Display size: %i x %i", CORE.Window.display.width, CORE.Window.display.height);
-#endif
- TRACELOG(LOG_INFO, " > Render size: %i x %i", CORE.Window.render.width, CORE.Window.render.height);
- TRACELOG(LOG_INFO, " > Screen size: %i x %i", CORE.Window.screen.width, CORE.Window.screen.height);
- TRACELOG(LOG_INFO, " > Viewport offsets: %i, %i", CORE.Window.renderOffset.x, CORE.Window.renderOffset.y);
- }
// Set window callback events
glfwSetWindowSizeCallback(CORE.Window.handle, WindowSizeCallback); // NOTE: Resizing not allowed by default!
@@ -4300,12 +4312,8 @@ static bool InitGraphicsDevice(int width, int height)
rlLoadExtensions(eglGetProcAddress);
#endif
- // Initialize OpenGL context (states and resources)
- // NOTE: CORE.Window.screen.width and CORE.Window.screen.height not used, just stored as globals in rlgl
- rlglInit(CORE.Window.screen.width, CORE.Window.screen.height);
-
- int fbWidth = CORE.Window.render.width;
- int fbHeight = CORE.Window.render.height;
+ int fbWidth = CORE.Window.screen.width;
+ int fbHeight = CORE.Window.screen.height;
#if defined(PLATFORM_DESKTOP)
if ((CORE.Window.flags & FLAG_WINDOW_HIGHDPI) > 0)
@@ -4324,11 +4332,25 @@ static bool InitGraphicsDevice(int width, int height)
}
#endif
+ CORE.Window.currentFbo.width = fbWidth;
+ CORE.Window.currentFbo.height = fbHeight;
+ CORE.Window.render.width = CORE.Window.currentFbo.width;
+ CORE.Window.render.height = CORE.Window.currentFbo.height;
+
+ // Initialize OpenGL context (states and resources)
+ // NOTE: CORE.Window.currentFbo.width and CORE.Window.currentFbo.height not used, just stored as globals in rlgl
+ rlglInit(CORE.Window.currentFbo.width, CORE.Window.currentFbo.height);
+
// Setup default viewport
SetupViewport(fbWidth, fbHeight);
- CORE.Window.currentFbo.width = CORE.Window.screen.width;
- CORE.Window.currentFbo.height = CORE.Window.screen.height;
+ TRACELOG(LOG_INFO, "DISPLAY: Device initialized successfully");
+#if defined(PLATFORM_DESKTOP)
+ TRACELOG(LOG_INFO, " > Display size: %i x %i", CORE.Window.display.width, CORE.Window.display.height);
+#endif
+ TRACELOG(LOG_INFO, " > Screen size: %i x %i", CORE.Window.screen.width, CORE.Window.screen.height);
+ TRACELOG(LOG_INFO, " > Render size: %i x %i", CORE.Window.render.width, CORE.Window.render.height);
+ TRACELOG(LOG_INFO, " > Viewport offsets: %i, %i", CORE.Window.renderOffset.x, CORE.Window.renderOffset.y);
ClearBackground(RAYWHITE); // Default background color for raylib games :P
@@ -4893,8 +4915,19 @@ static void WindowSizeCallback(GLFWwindow *window, int width, int height)
if (IsWindowFullscreen()) return;
// Set current screen size
+#if defined(__APPLE__)
CORE.Window.screen.width = width;
CORE.Window.screen.height = height;
+#else
+ if ((CORE.Window.flags & FLAG_WINDOW_HIGHDPI) > 0) {
+ Vector2 windowScaleDPI = GetWindowScaleDPI();
+ CORE.Window.screen.width = width / windowScaleDPI.x;
+ CORE.Window.screen.height = height / windowScaleDPI.y;
+ } else {
+ CORE.Window.screen.width = width;
+ CORE.Window.screen.height = height;
+ }
+#endif
// NOTE: Postprocessing texture is not scaled to new size
}