21 #include "../../SDL_internal.h" 23 #if SDL_VIDEO_DRIVER_WINDOWS 28 #ifndef CDS_FULLSCREEN 29 #define CDS_FULLSCREEN 0 32 typedef struct _WIN_GetMonitorDPIData {
36 } WIN_GetMonitorDPIData;
39 WIN_GetMonitorDPI(HMONITOR hMonitor,
44 WIN_GetMonitorDPIData *
data = (WIN_GetMonitorDPIData*) dwData;
52 data->mode_data->
HorzDPI = (float)hdpi;
53 data->mode_data->VertDPI = (float)vdpi;
56 hsize = data->mode->w / data->mode_data->HorzDPI;
57 vsize = data->mode->h / data->mode_data->VertDPI;
80 devmode.dmSize =
sizeof(devmode);
81 devmode.dmDriverExtra = 0;
82 if (!EnumDisplaySettings(deviceName, index, &devmode)) {
90 data->DeviceMode = devmode;
91 data->DeviceMode.dmFields =
92 (DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT | DM_DISPLAYFREQUENCY |
102 mode->
w = devmode.dmPelsWidth;
103 mode->
h = devmode.dmPelsHeight;
107 if (index == ENUM_CURRENT_SETTINGS
109 char bmi_data[
sizeof(BITMAPINFOHEADER) + 256 *
sizeof(RGBQUAD)];
112 int logical_width = GetDeviceCaps( hdc, HORZRES );
113 int logical_height = GetDeviceCaps( hdc, VERTRES );
115 data->ScaleX = (float)logical_width / devmode.dmPelsWidth;
116 data->ScaleY = (
float)logical_height / devmode.dmPelsHeight;
117 mode->
w = logical_width;
118 mode->
h = logical_height;
122 if (vid_data->GetDpiForMonitor) {
123 WIN_GetMonitorDPIData dpi_data;
126 dpi_data.vid_data = vid_data;
127 dpi_data.mode =
mode;
128 dpi_data.mode_data =
data;
129 monitor_rect.left = devmode.dmPosition.x;
130 monitor_rect.top = devmode.dmPosition.y;
131 monitor_rect.right = monitor_rect.left + 1;
132 monitor_rect.bottom = monitor_rect.top + 1;
133 EnumDisplayMonitors(
NULL, &monitor_rect, WIN_GetMonitorDPI, (LPARAM)&dpi_data);
137 data->HorzDPI = (float)GetDeviceCaps( hdc, LOGPIXELSX );
138 data->VertDPI = (float)GetDeviceCaps( hdc, LOGPIXELSY );
139 if (data->HorzDPI == data->VertDPI) {
140 data->DiagDPI = data->HorzDPI;
144 (
float)GetDeviceCaps( hdc, HORZSIZE ) / 25.4
f,
145 (
float)GetDeviceCaps( hdc, VERTSIZE ) / 25.4
f );
150 bmi = (LPBITMAPINFO) bmi_data;
151 bmi->bmiHeader.biSize =
sizeof(BITMAPINFOHEADER);
153 hbm = CreateCompatibleBitmap(hdc, 1, 1);
154 GetDIBits(hdc, hbm, 0, 1,
NULL, bmi, DIB_RGB_COLORS);
155 GetDIBits(hdc, hbm, 0, 1,
NULL, bmi, DIB_RGB_COLORS);
159 switch (*(
Uint32 *) bmi->bmiColors) {
173 }
else if (bmi->bmiHeader.biBitCount == 8) {
175 }
else if (bmi->bmiHeader.biBitCount == 4) {
180 if ((devmode.dmFields & DM_BITSPERPEL) == DM_BITSPERPEL) {
181 switch (devmode.dmBitsPerPel) {
207 WIN_AddDisplay(
_THIS, LPTSTR DeviceName)
212 DISPLAY_DEVICE device;
217 if (!WIN_GetDisplayMode(
_this, DeviceName, ENUM_CURRENT_SETTINGS, &mode)) {
229 device.cb =
sizeof(device);
230 if (EnumDisplayDevices(DeviceName, 0, &device, 0)) {
246 DISPLAY_DEVICE device;
248 device.cb =
sizeof(device);
251 for (pass = 0; pass < 2; ++pass) {
253 TCHAR DeviceName[32];
255 if (!EnumDisplayDevices(
NULL, i, &device, 0)) {
258 if (!(device.StateFlags & DISPLAY_DEVICE_ATTACHED_TO_DESKTOP)) {
262 if (!(device.StateFlags & DISPLAY_DEVICE_PRIMARY_DEVICE)) {
266 if (device.StateFlags & DISPLAY_DEVICE_PRIMARY_DEVICE) {
270 SDL_memcpy(DeviceName, device.DeviceName,
sizeof(DeviceName));
276 if (!EnumDisplayDevices(DeviceName, j, &device, 0)) {
279 if (!(device.StateFlags & DISPLAY_DEVICE_ATTACHED_TO_DESKTOP)) {
283 if (!(device.StateFlags & DISPLAY_DEVICE_PRIMARY_DEVICE)) {
287 if (device.StateFlags & DISPLAY_DEVICE_PRIMARY_DEVICE) {
291 count += WIN_AddDisplay(
_this, device.DeviceName);
294 WIN_AddDisplay(
_this, DeviceName);
332 return data->
DiagDPI != 0.0f ? 0 : -1;
371 status = ChangeDisplaySettingsEx(displaydata->
DeviceName, &data->DeviceMode,
NULL, CDS_FULLSCREEN,
NULL);
373 if (status != DISP_CHANGE_SUCCESSFUL) {
374 const char *reason =
"Unknown reason";
376 case DISP_CHANGE_BADFLAGS:
377 reason =
"DISP_CHANGE_BADFLAGS";
379 case DISP_CHANGE_BADMODE:
380 reason =
"DISP_CHANGE_BADMODE";
382 case DISP_CHANGE_BADPARAM:
383 reason =
"DISP_CHANGE_BADPARAM";
385 case DISP_CHANGE_FAILED:
386 reason =
"DISP_CHANGE_FAILED";
389 return SDL_SetError(
"ChangeDisplaySettingsEx() failed: %s", reason);
391 EnumDisplaySettings(displaydata->
DeviceName, ENUM_CURRENT_SETTINGS, &data->DeviceMode);
uint32_t Uint32
An unsigned 32-bit integer type.
void WIN_QuitModes(_THIS)
#define SDL_ISPIXELFORMAT_INDEXED(format)
GLuint GLuint GLsizei count
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
The structure that defines a display mode.
int SDL_AddVideoDisplay(const SDL_VideoDisplay *display)
static SDL_VideoDevice * _this
void WIN_GetDisplayModes(_THIS, SDL_VideoDisplay *display)
int WIN_GetDisplayBounds(_THIS, SDL_VideoDisplay *display, SDL_Rect *rect)
int WIN_SetDisplayMode(_THIS, SDL_VideoDisplay *display, SDL_DisplayMode *mode)
SDL_DisplayMode current_mode
#define WIN_StringToUTF8(S)
return Display return Display Bool Bool int int int return Display XEvent Bool(*) XPointer return Display return Display Drawable _Xconst char unsigned int unsigned int return Display Pixmap Pixmap XColor XColor unsigned int unsigned int return Display _Xconst char char int char return Display Visual unsigned int int int char unsigned int unsigned int in i)
SDL_DisplayMode desktop_mode
SDL_bool SDL_AddDisplayMode(SDL_VideoDisplay *display, const SDL_DisplayMode *mode)
int WIN_GetDisplayDPI(_THIS, SDL_VideoDisplay *display, float *ddpi, float *hdpi, float *vdpi)
float SDL_ComputeDiagonalDPI(int hpix, int vpix, float hinches, float vinches)
A rectangle, with the origin at the upper left.
return Display return Display Bool Bool int int int return Display XEvent Bool(*) XPointer return Display return Display Drawable _Xconst char unsigned int unsigned int return Display Pixmap Pixmap XColor XColor unsigned int unsigned int return Display _Xconst char char int char return Display Visual unsigned int int int char unsigned int unsigned int int in j)