From 03f8528315fa46c95991a34f3325d7b33ae5538c Mon Sep 17 00:00:00 2001
From: Edward Rudd <urkle@outoforder.cc>
Date: Sat, 02 May 2020 21:48:36 +0000
Subject: [PATCH] Update source to SDL2 2.0.12

---
 source/src/video/uikit/SDL_uikitmodes.m |  188 +++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 175 insertions(+), 13 deletions(-)

diff --git a/source/src/video/uikit/SDL_uikitmodes.m b/source/src/video/uikit/SDL_uikitmodes.m
index 7ddf107..4c1c09a 100644
--- a/source/src/video/uikit/SDL_uikitmodes.m
+++ b/source/src/video/uikit/SDL_uikitmodes.m
@@ -1,6 +1,6 @@
 /*
   Simple DirectMedia Layer
-  Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
+  Copyright (C) 1997-2020 Sam Lantinga <slouken@libsdl.org>
 
   This software is provided 'as-is', without any express or implied
   warranty.  In no event will the authors be held liable for any damages
@@ -23,13 +23,155 @@
 #if SDL_VIDEO_DRIVER_UIKIT
 
 #include "SDL_assert.h"
+#include "SDL_system.h"
 #include "SDL_uikitmodes.h"
 
 #include "../../events/SDL_events_c.h"
 
+#import <sys/utsname.h>
+
 @implementation SDL_DisplayData
 
+- (instancetype)initWithScreen:(UIScreen*)screen
+{
+    if (self = [super init]) {
+        self.uiscreen = screen;
+
+        /*
+         * A well up to date list of device info can be found here:
+         * https://github.com/lmirosevic/GBDeviceInfo/blob/master/GBDeviceInfo/GBDeviceInfo_iOS.m
+         */
+        NSDictionary* devices = @{
+            @"iPhone1,1": @163,
+            @"iPhone1,2": @163,
+            @"iPhone2,1": @163,
+            @"iPhone3,1": @326,
+            @"iPhone3,2": @326,
+            @"iPhone3,3": @326,
+            @"iPhone4,1": @326,
+            @"iPhone5,1": @326,
+            @"iPhone5,2": @326,
+            @"iPhone5,3": @326,
+            @"iPhone5,4": @326,
+            @"iPhone6,1": @326,
+            @"iPhone6,2": @326,
+            @"iPhone7,1": @401,
+            @"iPhone7,2": @326,
+            @"iPhone8,1": @326,
+            @"iPhone8,2": @401,
+            @"iPhone8,4": @326,
+            @"iPhone9,1": @326,
+            @"iPhone9,2": @401,
+            @"iPhone9,3": @326,
+            @"iPhone9,4": @401,
+            @"iPhone10,1": @326,
+            @"iPhone10,2": @401,
+            @"iPhone10,3": @458,
+            @"iPhone10,4": @326,
+            @"iPhone10,5": @401,
+            @"iPhone10,6": @458,
+            @"iPhone11,2": @458,
+            @"iPhone11,4": @458,
+            @"iPhone11,6": @458,
+            @"iPhone11,8": @326,
+            @"iPhone12,1": @326,
+            @"iPhone12,3": @458,
+            @"iPhone12,5": @458,
+            @"iPad1,1": @132,
+            @"iPad2,1": @132,
+            @"iPad2,2": @132,
+            @"iPad2,3": @132,
+            @"iPad2,4": @132,
+            @"iPad2,5": @163,
+            @"iPad2,6": @163,
+            @"iPad2,7": @163,
+            @"iPad3,1": @264,
+            @"iPad3,2": @264,
+            @"iPad3,3": @264,
+            @"iPad3,4": @264,
+            @"iPad3,5": @264,
+            @"iPad3,6": @264,
+            @"iPad4,1": @264,
+            @"iPad4,2": @264,
+            @"iPad4,3": @264,
+            @"iPad4,4": @326,
+            @"iPad4,5": @326,
+            @"iPad4,6": @326,
+            @"iPad4,7": @326,
+            @"iPad4,8": @326,
+            @"iPad4,9": @326,
+            @"iPad5,1": @326,
+            @"iPad5,2": @326,
+            @"iPad5,3": @264,
+            @"iPad5,4": @264,
+            @"iPad6,3": @264,
+            @"iPad6,4": @264,
+            @"iPad6,7": @264,
+            @"iPad6,8": @264,
+            @"iPad6,11": @264,
+            @"iPad6,12": @264,
+            @"iPad7,1": @264,
+            @"iPad7,2": @264,
+            @"iPad7,3": @264,
+            @"iPad7,4": @264,
+            @"iPad7,5": @264,
+            @"iPad7,6": @264,
+            @"iPad7,11": @264,
+            @"iPad7,12": @264,
+            @"iPad8,1": @264,
+            @"iPad8,2": @264,
+            @"iPad8,3": @264,
+            @"iPad8,4": @264,
+            @"iPad8,5": @264,
+            @"iPad8,6": @264,
+            @"iPad8,7": @264,
+            @"iPad8,8": @264,
+            @"iPad11,1": @326,
+            @"iPad11,2": @326,
+            @"iPad11,3": @326,
+            @"iPad11,4": @326,
+            @"iPod1,1": @163,
+            @"iPod2,1": @163,
+            @"iPod3,1": @163,
+            @"iPod4,1": @326,
+            @"iPod5,1": @326,
+            @"iPod7,1": @326,
+            @"iPod9,1": @326,
+        };
+
+        struct utsname systemInfo;
+        uname(&systemInfo);
+        NSString* deviceName =
+            [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];
+        id foundDPI = devices[deviceName];
+        if (foundDPI) {
+            self.screenDPI = (float)[foundDPI integerValue];
+        } else {
+            /*
+             * Estimate the DPI based on the screen scale multiplied by the base DPI for the device
+             * type (e.g. based on iPhone 1 and iPad 1)
+             */
+    #if __IPHONE_OS_VERSION_MIN_REQUIRED >= 80000
+            float scale = (float)screen.nativeScale;
+    #else
+            float scale = (float)screen.scale;
+    #endif
+            float defaultDPI;
+            if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
+                defaultDPI = 132.0f;
+            } else if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
+                defaultDPI = 163.0f;
+            } else {
+                defaultDPI = 160.0f;
+            }
+            self.screenDPI = scale * defaultDPI;
+        }
+    }
+    return self;
+}
+
 @synthesize uiscreen;
+@synthesize screenDPI;
 
 @end
 
@@ -153,13 +295,11 @@
     display.current_mode = mode;
 
     /* Allocate the display data */
-    SDL_DisplayData *data = [[SDL_DisplayData alloc] init];
+    SDL_DisplayData *data = [[SDL_DisplayData alloc] initWithScreen:uiscreen];
     if (!data) {
         UIKit_FreeDisplayModeData(&display.desktop_mode);
         return SDL_OutOfMemory();
     }
-
-    data.uiscreen = uiscreen;
 
     display.driverdata = (void *) CFBridgingRetain(data);
     SDL_AddVideoDisplay(&display);
@@ -216,17 +356,18 @@
         availableModes = data.uiscreen.availableModes;
 #endif
 
-#ifdef __IPHONE_8_0
-        /* The UIScreenMode of an iPhone 6 Plus should be 1080x1920 rather than
-         * 1242x2208 (414x736@3x), so we should use the native scale. */
-        if ([data.uiscreen respondsToSelector:@selector(nativeScale)]) {
-            scale = data.uiscreen.nativeScale;
-        }
-#endif
-
         for (UIScreenMode *uimode in availableModes) {
             /* The size of a UIScreenMode is in pixels, but we deal exclusively
-             * in points (except in SDL_GL_GetDrawableSize.) */
+             * in points (except in SDL_GL_GetDrawableSize.)
+             *
+             * For devices such as iPhone 6/7/8 Plus, the UIScreenMode reported
+             * by iOS is not in physical pixels of the display, but rather the
+             * point size times the scale.  For example, on iOS 12.2 on iPhone 8
+             * Plus the uimode.size is 1242x2208 and the uiscreen.scale is 3
+             * thus this will give the size in points which is 414x736. The code
+             * used to use the nativeScale, assuming UIScreenMode returned raw
+             * physical pixels (as suggested by its documentation, but in
+             * practice it is returning the retina pixels). */
             int w = (int)(uimode.size.width / scale);
             int h = (int)(uimode.size.height / scale);
 
@@ -243,6 +384,27 @@
 }
 
 int
+UIKit_GetDisplayDPI(_THIS, SDL_VideoDisplay * display, float * ddpi, float * hdpi, float * vdpi)
+{
+    @autoreleasepool {
+        SDL_DisplayData *data = (__bridge SDL_DisplayData *) display->driverdata;
+        float dpi = data.screenDPI;
+
+        if (ddpi) {
+            *ddpi = dpi * (float)SDL_sqrt(2.0);
+        }
+        if (hdpi) {
+            *hdpi = dpi;
+        }
+        if (vdpi) {
+            *vdpi = dpi;
+        }
+    }
+
+    return 0;
+}
+
+int
 UIKit_SetDisplayMode(_THIS, SDL_VideoDisplay * display, SDL_DisplayMode * mode)
 {
     @autoreleasepool {

--
Gitblit v1.9.3