[Commits] SDL: Add X11 implementation of SDL_GetDisplayDPI.

libsdl.org revision control commits-owner at libsdl.org
Thu Jul 30 10:02:31 PDT 2015


details:   https://hg.libsdl.org/SDL/rev/4df28b087060
changeset: 9814:4df28b087060
user:      Alfred Reynolds <alfred at valvesoftware.com>
date:      Wed Jul 29 17:19:02 2015 -0700
description:
Add X11 implementation of SDL_GetDisplayDPI.

diffstat:

 src/video/x11/SDL_x11modes.c |  30 ++++++++++++++++++++++++++++++
 src/video/x11/SDL_x11modes.h |   4 ++++
 src/video/x11/SDL_x11video.c |   1 +
 3 files changed, 35 insertions(+), 0 deletions(-)

diffs (79 lines):

diff -r 0652406e46c6 -r 4df28b087060 src/video/x11/SDL_x11modes.c
--- a/src/video/x11/SDL_x11modes.c	Wed Jul 29 17:18:56 2015 -0700
+++ b/src/video/x11/SDL_x11modes.c	Wed Jul 29 17:19:02 2015 -0700
@@ -533,6 +533,18 @@
         displaydata->visual = vinfo.visual;
         displaydata->depth = vinfo.depth;
 
+        // We use the displaydata screen index here so that this works
+        // for both the Xinerama case, where we get the overall DPI,
+        // and the regular X11 screen info case.
+        displaydata->hdpi = (float)DisplayWidth(data->display, displaydata->screen) * 25.4f /
+            DisplayWidthMM(data->display, displaydata->screen);
+        displaydata->vdpi = (float)DisplayHeight(data->display, displaydata->screen) * 25.4f /
+            DisplayHeightMM(data->display, displaydata->screen);
+        displaydata->ddpi = SDL_ComputeDiagonalDPI(DisplayWidth(data->display, displaydata->screen),
+                                                   DisplayHeight(data->display, displaydata->screen),
+                                                   (float)DisplayWidthMM(data->display, displaydata->screen) / 25.4f,
+                                                   (float)DisplayHeightMM(data->display, displaydata->screen) / 25.4f);
+
         displaydata->scanline_pad = SDL_BYTESPERPIXEL(mode.format) * 8;
         pixmapFormats = X11_XListPixmapFormats(data->display, &n);
         if (pixmapFormats) {
@@ -923,6 +935,24 @@
     return 0;
 }
 
+int
+X11_GetDisplayDPI(_THIS, SDL_VideoDisplay * sdl_display, float * ddpi, float * hdpi, float * vdpi)
+{
+    SDL_DisplayData *data = (SDL_DisplayData *) sdl_display->driverdata;
+
+    if (ddpi) {
+        *ddpi = data->ddpi;
+    }
+    if (hdpi) {
+        *hdpi = data->hdpi;
+    }
+    if (vdpi) {
+        *vpid = data->vdpi;
+    }
+
+    return data->ddpi != 0.0f ? 0 : -1;
+}
+
 #endif /* SDL_VIDEO_DRIVER_X11 */
 
 /* vi: set ts=4 sw=4 expandtab: */
diff -r 0652406e46c6 -r 4df28b087060 src/video/x11/SDL_x11modes.h
--- a/src/video/x11/SDL_x11modes.h	Wed Jul 29 17:18:56 2015 -0700
+++ b/src/video/x11/SDL_x11modes.h	Wed Jul 29 17:19:02 2015 -0700
@@ -31,6 +31,9 @@
     int scanline_pad;
     int x;
     int y;
+    float ddpi;
+    float hdpi;
+    float vdpi;
 
     int use_xinerama;
     int use_xrandr;
@@ -74,6 +77,7 @@
 extern Uint32 X11_GetPixelFormatFromVisualInfo(Display * display,
                                                XVisualInfo * vinfo);
 extern int X11_GetDisplayBounds(_THIS, SDL_VideoDisplay * sdl_display, SDL_Rect * rect);
+extern int X11_GetDisplayDPI(_THIS, SDL_VideoDisplay * sdl_display, float * ddpi, float * hdpi, float * vdpi);
 
 #endif /* _SDL_x11modes_h */
 
diff -r 0652406e46c6 -r 4df28b087060 src/video/x11/SDL_x11video.c
--- a/src/video/x11/SDL_x11video.c	Wed Jul 29 17:18:56 2015 -0700
+++ b/src/video/x11/SDL_x11video.c	Wed Jul 29 17:19:02 2015 -0700
@@ -216,6 +216,7 @@
     device->VideoQuit = X11_VideoQuit;
     device->GetDisplayModes = X11_GetDisplayModes;
     device->GetDisplayBounds = X11_GetDisplayBounds;
+    device->GetDisplayDPI = X11_GetDisplayDPI;
     device->SetDisplayMode = X11_SetDisplayMode;
     device->SuspendScreenSaver = X11_SuspendScreenSaver;
     device->PumpEvents = X11_PumpEvents;


More information about the commits mailing list