| | |
| | | /* |
| | | 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 |
| | |
| | | #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 |
| | | |
| | |
| | | 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); |
| | |
| | | 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); |
| | | |
| | |
| | | } |
| | | |
| | | 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 { |