SDL: Use the term "points" instead of "screen coordinates"

From 4de7433a9e64ffaecbd43f5349804f88150269f4 Mon Sep 17 00:00:00 2001
From: Sam Lantinga <[EMAIL REDACTED]>
Date: Mon, 15 May 2023 11:16:46 -0700
Subject: [PATCH] Use the term "points" instead of "screen coordinates"

It turns out that screen coordinates were confusing people, thinking that meant pixels, when instead they are virtual coordinates; device independent units defined as pixels scaled by the display scale. We'll use the term "points" for this going forward, to reduce confusion.
---
 docs/README-ios.md                        | 29 ++++++++++-------------
 docs/README-migration.md                  |  4 ++--
 include/SDL3/SDL_render.h                 | 21 ++++++++--------
 src/video/wayland/SDL_waylandvideo.c      |  2 +-
 src/video/windows/SDL_windowsmodes.c      |  2 +-
 src/video/windows/SDL_windowswindow.c     |  4 ++--
 src/video/winrt/SDL_winrtpointerinput.cpp |  6 ++---
 7 files changed, 31 insertions(+), 37 deletions(-)

diff --git a/docs/README-ios.md b/docs/README-ios.md
index 715d337ea09f..0dc1e5e7b271 100644
--- a/docs/README-ios.md
+++ b/docs/README-ios.md
@@ -33,29 +33,26 @@ TODO: Add information regarding App Store requirements such as icons, etc.
 Notes -- Retina / High-DPI and window sizes
 ==============================================================================
 
-Window and display mode sizes in SDL are in "screen coordinates" (or "points",
-in Apple's terminology) rather than in pixels. On iOS this means that a window
-created on an iPhone 6 will have a size in screen coordinates of 375 x 667,
-rather than a size in pixels of 750 x 1334. All iOS apps are expected to
-size their content based on screen coordinates / points rather than pixels,
+Window and display mode sizes in SDL are in points rather than in pixels.
+On iOS this means that a window created on an iPhone 6 will have a size in
+points of 375 x 667, rather than a size in pixels of 750 x 1334. All iOS apps
+are expected to size their content based on points rather than pixels,
 as this allows different iOS devices to have different pixel densities
 (Retina versus non-Retina screens, etc.) without apps caring too much.
 
-SDL_GetWindowSize() and mouse coordinates are in screen coordinates rather
-than pixels, but the window will have a much greater pixel density when the
-device supports it, and the SDL_GetWindowSizeInPixels() can be called to
-determine the size in pixels of the drawable screen framebuffer.
+SDL_GetWindowSize() and mouse coordinates are in points rather than pixels,
+but the window will have a much greater pixel density when the device supports
+it, and the SDL_GetWindowSizeInPixels() can be called to determine the size
+in pixels of the drawable screen framebuffer.
 
 The SDL 2D rendering API will automatically handle this for you, by default
-providing a rendering area in screen coordinates, and you can call
-SDL_SetRenderLogicalPresentation() to gain access to the higher density
-resolution.
+providing a rendering area in points, and you can call SDL_SetRenderLogicalPresentation()
+to gain access to the higher density resolution.
 
 Some OpenGL ES functions such as glViewport expect sizes in pixels rather than
-sizes in screen coordinates. When doing 2D rendering with OpenGL ES, an
-orthographic projection matrix using the size in screen coordinates
-(SDL_GetWindowSize()) can be used in order to display content at the same scale
-no matter whether a Retina device is used or not.
+sizes in points. When doing 2D rendering with OpenGL ES, an orthographic projection
+matrix using the size in points (SDL_GetWindowSize()) can be used in order to
+display content at the same scale no matter whether a Retina device is used or not.
 
 
 Notes -- Application events
diff --git a/docs/README-migration.md b/docs/README-migration.md
index e701068c7eda..2e0b3a27dfd1 100644
--- a/docs/README-migration.md
+++ b/docs/README-migration.md
@@ -668,8 +668,8 @@ here, now. Passing NULL is the same as passing -1 here in SDL2, to signify you w
 to decide for you.
 
 When a renderer is created, it will automatically set the logical size to the size of
-the window in screen coordinates. For high DPI displays, this will set up scaling from
-window coordinates to pixels. You can disable this scaling with:
+the window in points. For high DPI displays, this will set up scaling from points to
+pixels. You can disable this scaling with:
 ```c
     SDL_SetRenderLogicalPresentation(renderer, 0, 0, SDL_LOGICAL_PRESENTATION_DISABLED, SDL_SCALEMODE_NEAREST);

diff --git a/include/SDL3/SDL_render.h b/include/SDL3/SDL_render.h
index 766a72767408…959a8c9f1535 100644
— a/include/SDL3/SDL_render.h
+++ b/include/SDL3/SDL_render.h
@@ -140,7 +140,7 @@ typedef enum
typedef enum
{
SDL_LOGICAL_PRESENTATION_DISABLED, /**< There is no logical size in effect */

  • SDL_LOGICAL_PRESENTATION_MATCH, /**< The rendered content matches the window size in screen coordinates */
  • SDL_LOGICAL_PRESENTATION_MATCH, /< The rendered content matches the window size in points */
    SDL_LOGICAL_PRESENTATION_STRETCH, /
    < The rendered content is stretched to the output resolution */
    SDL_LOGICAL_PRESENTATION_LETTERBOX, /< The rendered content is fit to the largest dimension and the other dimension is letterboxed with black bars */
    SDL_LOGICAL_PRESENTATION_OVERSCAN, /
    < The rendered content is fit to the smallest dimension and the other dimension extends beyond the output bounds */
    @@ -235,8 +235,8 @@ extern DECLSPEC int SDLCALL SDL_CreateWindowAndRenderer(int width, int height, U
  • need a specific renderer, specify NULL and SDL will attempt to chooes the
  • best option for you, based on what is available on the user’s system.
    • By default the rendering size matches the window size in screen
    • coordinates, but you can call SDL_SetRenderLogicalPresentation() to enable
    • By default the rendering size matches the window size in points,
    • but you can call SDL_SetRenderLogicalPresentation() to enable
    • high DPI rendering or change the content size and scaling options.
    • \param window the window where rendering is displayed
      @@ -317,14 +317,14 @@ extern DECLSPEC SDL_Window *SDLCALL SDL_GetRenderWindow(SDL_Renderer *renderer);
      extern DECLSPEC int SDLCALL SDL_GetRendererInfo(SDL_Renderer *renderer, SDL_RendererInfo *info);

/**

    • Get the output size in screen coordinates of a rendering context.
    • Get the output size in points of a rendering context.
    • This returns the true output size in screen coordinates, ignoring any
    • This returns the true output size in points, ignoring any
    • render targets or logical size and presentation.
    • \param renderer the rendering context
    • \param w a pointer filled in with the width in screen coordinates
    • \param h a pointer filled in with the height in screen coordinates
    • \param w a pointer filled in with the width in points
    • \param h a pointer filled in with the height in points
    • \returns 0 on success or a negative error code on failure; call
    •      SDL_GetError() for more information.
      

@@ -841,8 +841,7 @@ extern DECLSPEC SDL_Texture *SDLCALL SDL_GetRenderTarget(SDL_Renderer *renderer)

  • then copied to the output during presentation.
  • When a renderer is created, the logical size is set to match the window
    • size in screen coordinates. The actual output size may be higher pixel
    • density, and can be queried with SDL_GetRenderOutputSize().
    • size in points. The actual output size may be higher pixel density, and can be queried with SDL_GetRenderOutputSize().
    • You can disable logical coordinates by setting the mode to
    • SDL_LOGICAL_PRESENTATION_DISABLED, and in that case you get the full
      @@ -887,7 +886,7 @@ extern DECLSPEC int SDLCALL SDL_SetRenderLogicalPresentation(SDL_Renderer *rende
      extern DECLSPEC int SDLCALL SDL_GetRenderLogicalPresentation(SDL_Renderer *renderer, int *w, int *h, SDL_RendererLogicalPresentation *mode, SDL_ScaleMode *scale_mode);

/**

    • Get a point in render coordinates when given a point in window coordinates.
    • Get a point in render coordinates when given a point in window coordinates (points).
    • \param renderer the rendering context
    • \param window_x the x coordinate in window coordinates
      @@ -905,7 +904,7 @@ extern DECLSPEC int SDLCALL SDL_GetRenderLogicalPresentation(SDL_Renderer *rende
      extern DECLSPEC int SDLCALL SDL_RenderCoordinatesFromWindow(SDL_Renderer *renderer, float window_x, float window_y, float *x, float *y);

/**

    • Get a point in window coordinates when given a point in render coordinates.
    • Get a point in window coordinates (points) when given a point in render coordinates.
    • \param renderer the rendering context
    • \param x the x coordinate in render coordinates
      diff --git a/src/video/wayland/SDL_waylandvideo.c b/src/video/wayland/SDL_waylandvideo.c
      index edb74a0fa073…7f4a8c0e7bf9 100644
      — a/src/video/wayland/SDL_waylandvideo.c
      +++ b/src/video/wayland/SDL_waylandvideo.c
      @@ -599,7 +599,7 @@ static void display_handle_done(void *data,
      driverdata->screen_height /= (int)driverdata->scale_factor;
      }
      } else {
  •    /* Calculate the screen coordinates from the pixel values, if xdg-output isn't present.
    
  •    /* Calculate the points from the pixel values, if xdg-output isn't present.
        * Use the native mode pixel values since they are pre-transformed.
        */
       driverdata->screen_width = native_mode.pixel_w / (int)driverdata->scale_factor;
    

diff --git a/src/video/windows/SDL_windowsmodes.c b/src/video/windows/SDL_windowsmodes.c
index 38fe6d1853e6…1d3905a8552a 100644
— a/src/video/windows/SDL_windowsmodes.c
+++ b/src/video/windows/SDL_windowsmodes.c
@@ -597,7 +597,7 @@ void WIN_ScreenPointFromSDLFloat(float x, float y, LONG *xOut, LONG *yOut, int *
goto passthrough;
}

  • /* Can’t use MonitorFromPoint for this because we currently have SDL coordinates, not pixels */
  • /* Can’t use MonitorFromPoint for this because we currently have SDL points, not pixels */
    displayID = SDL_GetDisplayForPoint(&point);
    if (displayID == 0) {
    goto passthrough;
    diff --git a/src/video/windows/SDL_windowswindow.c b/src/video/windows/SDL_windowswindow.c
    index a8a7f5c7f616…8c49255a213f 100644
    — a/src/video/windows/SDL_windowswindow.c
    +++ b/src/video/windows/SDL_windowswindow.c
    @@ -139,7 +139,7 @@ static int WIN_AdjustWindowRectWithStyle(SDL_Window *window, DWORD style, BOOL m
    UINT frame_dpi;
    #endif
  • /* Client rect, in SDL screen coordinates */
  • /* Client rect, in points */
    SDL_RelativeToGlobalForWindow(window,
    (use_current ? window->x : window->windowed.x),
    (use_current ? window->y : window->windowed.y),
    @@ -147,7 +147,7 @@ static int WIN_AdjustWindowRectWithStyle(SDL_Window *window, DWORD style, BOOL m
    *width = (use_current ? window->w : window->windowed.w);
    *height = (use_current ? window->h : window->windowed.h);
  • /* Convert client rect from SDL coordinates to pixels (no-op if DPI scaling not enabled) */
  • /* Convert client rect from points to pixels (no-op if DPI scaling not enabled) */
    #if !defined(XBOXONE) && !defined(XBOXSERIES)
    WIN_ScreenPointFromSDL(x, y, &dpi);
    #endif
    diff --git a/src/video/winrt/SDL_winrtpointerinput.cpp b/src/video/winrt/SDL_winrtpointerinput.cpp
    index e30952f9e71b…7f49d2ce88d4 100644
    — a/src/video/winrt/SDL_winrtpointerinput.cpp
    +++ b/src/video/winrt/SDL_winrtpointerinput.cpp
    @@ -379,10 +379,8 @@ void WINRT_ProcessMouseMovedEvent(SDL_Window *window, Windows::Devices::Input::M
    //
    // There may be some room for a workaround whereby OnPointerMoved’s values
    // are compared to the values from OnMouseMoved in order to detect
  • // when this bug is active. A suitable transformation could then be made to
  • // OnMouseMoved’s values. For now, however, the system-reported values are sent
  • // to SDL with minimal transformation: from native screen coordinates (in DIPs)
  • // to SDL window coordinates.
  • // when this bug is active. A suitable transformation could then be made to
  • // OnMouseMoved’s values.
    //
    const Windows::Foundation::Point mouseDeltaInDIPs((float)args->MouseDelta.X, (float)args->MouseDelta.Y);
    const Windows::Foundation::Point mouseDeltaInSDLWindowCoords = WINRT_TransformCursorPosition(window, mouseDeltaInDIPs, TransformToSDLWindowSize);