Fixed display mode calculations for applications which are not DPI aware.
authorSam Lantinga <slouken@libsdl.org>
Mon, 30 Dec 2013 12:49:15 -0800
changeset 8086 b744b3f8754b
parent 8085 051c0c4cf161
child 8087 f9912ddfe17b
Fixed display mode calculations for applications which are not DPI aware. If your application wants to have access to the full resolution even when the system has DPI scaling enabled, call SetProcessDPIAware() before calling SDL_Init() e.g. typedef BOOL (WINAPI *SetProcessDPIAware_t)(void); HMODULE hMod = LoadLibrary("user32.dll"); if ( hMod ) { SetProcessDPIAware_t pSetProcessDPIAware = GetProcAddress( hMod, "SetProcessDPIAware" ); if ( pSetProcessDPIAware ) { pSetProcessDPIAware(); } FreeLibrary( hMod ); }
src/video/windows/SDL_windowsmodes.c
src/video/windows/SDL_windowsmodes.h
--- a/src/video/windows/SDL_windowsmodes.c	Fri Dec 27 10:18:19 2013 -0800
+++ b/src/video/windows/SDL_windowsmodes.c	Mon Dec 30 12:49:15 2013 -0800
@@ -50,6 +50,8 @@
     data->DeviceMode.dmFields =
         (DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT | DM_DISPLAYFREQUENCY |
          DM_DISPLAYFLAGS);
+	data->ScaleX = 1.0f;
+	data->ScaleY = 1.0f;
 
     /* Fill in the mode information */
     mode->format = SDL_PIXELFORMAT_UNKNOWN;
@@ -63,6 +65,13 @@
         char bmi_data[sizeof(BITMAPINFOHEADER) + 256 * sizeof(RGBQUAD)];
         LPBITMAPINFO bmi;
         HBITMAP hbm;
+		int logical_width = GetDeviceCaps( hdc, HORZRES );
+		int logical_height = GetDeviceCaps( hdc, VERTRES );
+
+		data->ScaleX = (float)logical_width / devmode.dmPelsWidth;
+		data->ScaleY = (float)logical_height / devmode.dmPelsHeight;
+		mode->w = logical_width;
+		mode->h = logical_height;
 
         SDL_zero(bmi_data);
         bmi = (LPBITMAPINFO) bmi_data;
@@ -93,7 +102,7 @@
         } else if (bmi->bmiHeader.biBitCount == 4) {
             mode->format = SDL_PIXELFORMAT_INDEX4LSB;
         }
-    } else {
+	} else {
         /* FIXME: Can we tell what this will be? */
         if ((devmode.dmFields & DM_BITSPERPEL) == DM_BITSPERPEL) {
             switch (devmode.dmBitsPerPel) {
@@ -224,10 +233,10 @@
 {
     SDL_DisplayModeData *data = (SDL_DisplayModeData *) display->current_mode.driverdata;
 
-    rect->x = (int)data->DeviceMode.dmPosition.x;
-    rect->y = (int)data->DeviceMode.dmPosition.y;
-    rect->w = data->DeviceMode.dmPelsWidth;
-    rect->h = data->DeviceMode.dmPelsHeight;
+    rect->x = (int)SDL_ceil(data->DeviceMode.dmPosition.x * data->ScaleX);
+    rect->y = (int)SDL_ceil(data->DeviceMode.dmPosition.y * data->ScaleY);
+    rect->w = (int)SDL_ceil(data->DeviceMode.dmPelsWidth * data->ScaleX);
+    rect->h = (int)SDL_ceil(data->DeviceMode.dmPelsHeight * data->ScaleY);
 
     return 0;
 }
@@ -252,8 +261,7 @@
             if (!SDL_AddDisplayMode(display, &mode)) {
                 SDL_free(mode.driverdata);
             }
-        }
-        else {
+        } else {
             SDL_free(mode.driverdata);
         }
     }
--- a/src/video/windows/SDL_windowsmodes.h	Fri Dec 27 10:18:19 2013 -0800
+++ b/src/video/windows/SDL_windowsmodes.h	Mon Dec 30 12:49:15 2013 -0800
@@ -31,6 +31,8 @@
 typedef struct
 {
     DEVMODE DeviceMode;
+	float ScaleX;
+	float ScaleY;
 } SDL_DisplayModeData;
 
 extern int WIN_InitModes(_THIS);