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