mirror of https://github.com/encounter/SDL.git
Fixed bug 2563 - Remove obsolete code for supporting iOS < 5
Alex Szpakowski Now that SDL for iOS requires at least iOS 5.1 at runtime, there are several old codepaths in the UIKit backend which can be removed. I've attached a patch which does so.
This commit is contained in:
parent
e8f8e6727a
commit
d7924c73d6
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -79,7 +79,7 @@
|
|||
- (void)startAnimation;
|
||||
- (void)stopAnimation;
|
||||
|
||||
- (void)doLoop:(id)sender;
|
||||
- (void)doLoop:(CADisplayLink*)sender;
|
||||
|
||||
@end
|
||||
|
||||
|
|
|
@ -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()) {
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
];
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue