diff --git a/include/SDL_config_iphoneos.h b/include/SDL_config_iphoneos.h index 8b268b7f6..7ffb1c55b 100644 --- a/include/SDL_config_iphoneos.h +++ b/include/SDL_config_iphoneos.h @@ -134,6 +134,7 @@ #define SDL_VIDEO_DRIVER_DUMMY 1 /* enable OpenGL ES */ +#define SDL_VIDEO_OPENGL_ES2 1 #define SDL_VIDEO_OPENGL_ES 1 #define SDL_VIDEO_RENDER_OGL_ES 1 #define SDL_VIDEO_RENDER_OGL_ES2 1 diff --git a/src/video/uikit/SDL_uikitmodes.h b/src/video/uikit/SDL_uikitmodes.h index ae9ced659..9f2e9dd34 100644 --- a/src/video/uikit/SDL_uikitmodes.h +++ b/src/video/uikit/SDL_uikitmodes.h @@ -37,8 +37,6 @@ typedef struct CGFloat scale; } SDL_DisplayModeData; -extern BOOL SDL_UIKit_supports_multiple_displays; - extern SDL_bool UIKit_IsDisplayLandscape(UIScreen *uiscreen); extern int UIKit_InitModes(_THIS); diff --git a/src/video/uikit/SDL_uikitmodes.m b/src/video/uikit/SDL_uikitmodes.m index dddb2f145..05e33d9c9 100644 --- a/src/video/uikit/SDL_uikitmodes.m +++ b/src/video/uikit/SDL_uikitmodes.m @@ -26,9 +26,6 @@ #include "SDL_uikitmodes.h" -BOOL SDL_UIKit_supports_multiple_displays = NO; - - static int UIKit_AllocateDisplayModeData(SDL_DisplayMode * mode, UIScreenMode * uiscreenmode, CGFloat scale) @@ -56,10 +53,7 @@ UIKit_AllocateDisplayModeData(SDL_DisplayMode * mode, static void UIKit_FreeDisplayModeData(SDL_DisplayMode * mode) { - if (!SDL_UIKit_supports_multiple_displays) { - /* Not on at least iPhoneOS 3.2 (versions prior to iPad). */ - SDL_assert(mode->driverdata == NULL); - } else if (mode->driverdata != NULL) { + if (mode->driverdata != NULL) { SDL_DisplayModeData *data = (SDL_DisplayModeData *)mode->driverdata; [data->uiscreenmode release]; SDL_free(data); @@ -121,19 +115,12 @@ UIKit_AddDisplay(UIScreen *uiscreen) } /* When dealing with UIKit all coordinates are specified in terms of - * what Apple refers to as points. On earlier devices without the - * so called "Retina" display, there is a one to one mapping between - * points and pixels. In other cases [UIScreen scale] indicates the + * what Apple refers to as points. [UIScreen scale] indicates the * relationship between points and pixels. Since SDL has no notion * of points, we must compensate in all cases where dealing with such * units. */ - CGFloat scale; - if ([UIScreen instancesRespondToSelector:@selector(scale)]) { - scale = [uiscreen scale]; /* iOS >= 4.0 */ - } else { - scale = 1.0f; /* iOS < 4.0 */ - } + CGFloat scale = [uiscreen scale]; SDL_VideoDisplay display; SDL_DisplayMode mode; @@ -142,13 +129,7 @@ UIKit_AddDisplay(UIScreen *uiscreen) mode.w = (int)(size.width * scale); mode.h = (int)(size.height * scale); - UIScreenMode * uiscreenmode = nil; - /* UIScreenMode showed up in 3.2 (the iPad and later). We're - * misusing this supports_multiple_displays flag here for that. - */ - if (SDL_UIKit_supports_multiple_displays) { - uiscreenmode = [uiscreen currentMode]; - } + UIScreenMode * uiscreenmode = [uiscreen currentMode]; if (UIKit_AllocateDisplayModeData(&mode, uiscreenmode, scale) < 0) { return -1; @@ -189,30 +170,12 @@ UIKit_IsDisplayLandscape(UIScreen *uiscreen) int UIKit_InitModes(_THIS) { - /* this tells us whether we are running on ios >= 3.2 */ - SDL_UIKit_supports_multiple_displays = [UIScreen instancesRespondToSelector:@selector(currentMode)]; - - /* Add the main screen. */ - if (UIKit_AddDisplay([UIScreen mainScreen]) < 0) { - return -1; - } - - /* If this is iPhoneOS < 3.2, all devices are one screen, 320x480 pixels. */ - /* The iPad added both a larger main screen and the ability to use - * external displays. So, add the other displays (screens in UI speak). - */ - if (SDL_UIKit_supports_multiple_displays) { - for (UIScreen *uiscreen in [UIScreen screens]) { - /* Only add the other screens */ - if (uiscreen != [UIScreen mainScreen]) { - if (UIKit_AddDisplay(uiscreen) < 0) { - return -1; - } - } + for (UIScreen *uiscreen in [UIScreen screens]) { + if (UIKit_AddDisplay(uiscreen) < 0) { + return -1; } } - /* We're done! */ return 0; } @@ -224,37 +187,8 @@ UIKit_GetDisplayModes(_THIS, SDL_VideoDisplay * display) SDL_bool isLandscape = UIKit_IsDisplayLandscape(data->uiscreen); SDL_bool addRotation = (data->uiscreen == [UIScreen mainScreen]); - if (SDL_UIKit_supports_multiple_displays) { - /* availableModes showed up in 3.2 (the iPad and later). We should only - * land here for at least that version of the OS. - */ - for (UIScreenMode *uimode in [data->uiscreen availableModes]) { - CGSize size = [uimode size]; - int w = (int)size.width; - int h = (int)size.height; - - /* Make sure the width/height are oriented correctly */ - if (isLandscape != (w > h)) { - int tmp = w; - w = h; - h = tmp; - } - - /* Add the native screen resolution. */ - UIKit_AddDisplayMode(display, w, h, data->scale, uimode, addRotation); - - if (data->scale != 1.0f) { - /* Add the native screen resolution divided by its scale. - * This is so devices capable of e.g. 640x960 also advertise 320x480. - */ - UIKit_AddDisplayMode(display, - (int)(size.width / data->scale), - (int)(size.height / data->scale), - 1.0f, uimode, addRotation); - } - } - } else { - const CGSize size = [data->uiscreen bounds].size; + for (UIScreenMode *uimode in [data->uiscreen availableModes]) { + CGSize size = [uimode size]; int w = (int)size.width; int h = (int)size.height; @@ -265,7 +199,18 @@ UIKit_GetDisplayModes(_THIS, SDL_VideoDisplay * display) h = tmp; } - UIKit_AddDisplayMode(display, w, h, 1.0f, nil, addRotation); + /* Add the native screen resolution. */ + UIKit_AddDisplayMode(display, w, h, data->scale, uimode, addRotation); + + if (data->scale != 1.0f) { + /* Add the native screen resolution divided by its scale. + * This is so devices capable of e.g. 640x960 also advertise 320x480. + */ + UIKit_AddDisplayMode(display, + (int)(size.width / data->scale), + (int)(size.height / data->scale), + 1.0f, uimode, addRotation); + } } } @@ -273,26 +218,22 @@ int UIKit_SetDisplayMode(_THIS, SDL_VideoDisplay * display, SDL_DisplayMode * mode) { SDL_DisplayData *data = (SDL_DisplayData *) display->driverdata; + SDL_DisplayModeData *modedata = (SDL_DisplayModeData *)mode->driverdata; - if (!SDL_UIKit_supports_multiple_displays) { - /* Not on at least iPhoneOS 3.2 (versions prior to iPad). */ - SDL_assert(mode->driverdata == NULL); - } else { - SDL_DisplayModeData *modedata = (SDL_DisplayModeData *)mode->driverdata; - [data->uiscreen setCurrentMode:modedata->uiscreenmode]; + [data->uiscreen setCurrentMode:modedata->uiscreenmode]; - if (data->uiscreen == [UIScreen mainScreen]) { - if (mode->w > mode->h) { - if (!UIKit_IsDisplayLandscape(data->uiscreen)) { - [[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeRight animated:NO]; - } - } else if (mode->w < mode->h) { - if (UIKit_IsDisplayLandscape(data->uiscreen)) { - [[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait animated:NO]; - } + if (data->uiscreen == [UIScreen mainScreen]) { + if (mode->w > mode->h) { + if (!UIKit_IsDisplayLandscape(data->uiscreen)) { + [[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeRight animated:NO]; + } + } else if (mode->w < mode->h) { + if (UIKit_IsDisplayLandscape(data->uiscreen)) { + [[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait animated:NO]; } } } + return 0; } diff --git a/src/video/uikit/SDL_uikitopenglview.h b/src/video/uikit/SDL_uikitopenglview.h index f04b5b0bb..eed2e5b70 100644 --- a/src/video/uikit/SDL_uikitopenglview.h +++ b/src/video/uikit/SDL_uikitopenglview.h @@ -79,7 +79,7 @@ - (void)startAnimation; - (void)stopAnimation; -- (void)doLoop:(id)sender; +- (void)doLoop:(CADisplayLink*)sender; @end diff --git a/src/video/uikit/SDL_uikitopenglview.m b/src/video/uikit/SDL_uikitopenglview.m index 5c163c9a0..144100bf7 100644 --- a/src/video/uikit/SDL_uikitopenglview.m +++ b/src/video/uikit/SDL_uikitopenglview.m @@ -84,8 +84,7 @@ } /* Set the appropriate scale (for retina display support) */ - if ([self respondsToSelector:@selector(contentScaleFactor)]) - self.contentScaleFactor = scale; + self.contentScaleFactor = scale; /* create the buffers */ glGenFramebuffersOES(1, &viewFramebuffer); @@ -171,11 +170,7 @@ - (void)startAnimation { - /* CADisplayLink is API new to iPhone SDK 3.1. - * Compiling against earlier versions will result in a warning, but can be dismissed - * if the system version runtime check for CADisplayLink exists in -initWithCoder:. - */ - displayLink = [NSClassFromString(@"CADisplayLink") displayLinkWithTarget:self selector:@selector(doLoop:)]; + displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(doLoop:)]; [displayLink setFrameInterval:animationInterval]; [displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; } @@ -186,7 +181,7 @@ displayLink = nil; } -- (void)doLoop:(id)sender +- (void)doLoop:(CADisplayLink*)sender { /* Don't run the game loop while a messagebox is up */ if (!UIKit_ShowingMessageBox()) { diff --git a/src/video/uikit/SDL_uikitview.m b/src/video/uikit/SDL_uikitview.m index f890b7a8e..bee5a586e 100644 --- a/src/video/uikit/SDL_uikitview.m +++ b/src/video/uikit/SDL_uikitview.m @@ -372,6 +372,7 @@ void _uikit_keyboard_update() { int height = view.keyboardHeight; int offsetx = 0; int offsety = 0; + float scale = [UIScreen mainScreen].scale; if (height) { int sw,sh; SDL_GetWindowSize(window,&sw,&sh); @@ -392,11 +393,10 @@ void _uikit_keyboard_update() { if (ui_orient == UIInterfaceOrientationPortraitUpsideDown) { offsety = -offsety; } - if ([[UIScreen mainScreen] respondsToSelector:@selector(displayLinkWithTarget:selector:)]) { - float scale = [UIScreen mainScreen].scale; - offsetx /= scale; - offsety /= scale; - } + + offsetx /= scale; + offsety /= scale; + view.frame = CGRectMake(offsetx,offsety,view.frame.size.width,view.frame.size.height); } @@ -424,9 +424,7 @@ void _uikit_keyboard_init() { if (ui_orient == UIInterfaceOrientationLandscapeRight || ui_orient == UIInterfaceOrientationLandscapeLeft) { height = keyboardSize.width; } - if ([[UIScreen mainScreen] respondsToSelector:@selector(displayLinkWithTarget:selector:)]) { - height *= [UIScreen mainScreen].scale; - } + height *= [UIScreen mainScreen].scale; _uikit_keyboard_set_height(height); } ]; diff --git a/src/video/uikit/SDL_uikitwindow.m b/src/video/uikit/SDL_uikitwindow.m index a1dd1a9e2..a8052276e 100644 --- a/src/video/uikit/SDL_uikitwindow.m +++ b/src/video/uikit/SDL_uikitwindow.m @@ -130,6 +130,7 @@ UIKit_CreateWindow(_THIS, SDL_Window *window) SDL_VideoDisplay *display = SDL_GetDisplayForWindow(window); SDL_DisplayData *data = (SDL_DisplayData *) display->driverdata; const BOOL external = ([UIScreen mainScreen] != data->uiscreen); + const CGSize origsize = [[data->uiscreen currentMode] size]; /* SDL currently puts this window at the start of display's linked list. We rely on this. */ SDL_assert(_this->windows == window); @@ -143,31 +144,28 @@ UIKit_CreateWindow(_THIS, SDL_Window *window) * user, so it's in standby), try to force the display to a resolution * that most closely matches the desired window size. */ - if (SDL_UIKit_supports_multiple_displays) { - const CGSize origsize = [[data->uiscreen currentMode] size]; - if ((origsize.width == 0.0f) && (origsize.height == 0.0f)) { - if (display->num_display_modes == 0) { - _this->GetDisplayModes(_this, display); - } + if ((origsize.width == 0.0f) && (origsize.height == 0.0f)) { + if (display->num_display_modes == 0) { + _this->GetDisplayModes(_this, display); + } - int i; - const SDL_DisplayMode *bestmode = NULL; - for (i = display->num_display_modes; i >= 0; i--) { - const SDL_DisplayMode *mode = &display->display_modes[i]; - if ((mode->w >= window->w) && (mode->h >= window->h)) - bestmode = mode; - } + int i; + const SDL_DisplayMode *bestmode = NULL; + for (i = display->num_display_modes; i >= 0; i--) { + const SDL_DisplayMode *mode = &display->display_modes[i]; + if ((mode->w >= window->w) && (mode->h >= window->h)) + bestmode = mode; + } - if (bestmode) { - SDL_DisplayModeData *modedata = (SDL_DisplayModeData *)bestmode->driverdata; - [data->uiscreen setCurrentMode:modedata->uiscreenmode]; + if (bestmode) { + SDL_DisplayModeData *modedata = (SDL_DisplayModeData *)bestmode->driverdata; + [data->uiscreen setCurrentMode:modedata->uiscreenmode]; - /* desktop_mode doesn't change here (the higher level will - * use it to set all the screens back to their defaults - * upon window destruction, SDL_Quit(), etc. - */ - display->current_mode = *bestmode; - } + /* desktop_mode doesn't change here (the higher level will + * use it to set all the screens back to their defaults + * upon window destruction, SDL_Quit(), etc. + */ + display->current_mode = *bestmode; } }