Mac and Linux SDL2 binary snapshots
Edward Rudd
2020-05-02 03f8528315fa46c95991a34f3325d7b33ae5538c
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 {