diff --git a/src/sdl/CVideoDriver.cpp b/src/sdl/CVideoDriver.cpp
index b1b118126..d77d44415 100644
--- a/src/sdl/CVideoDriver.cpp
+++ b/src/sdl/CVideoDriver.cpp
@@ -90,9 +90,18 @@ CVideoDriver::CVideoDriver() {
BGLayerSurface=NULL;
BlitSurface=NULL;
+#if defined(TARGET_OS_IPHONE) || defined(TARGET_IPHONE_SIMULATOR)
+ st_resolution resolution = {320, 480, 32};
+ m_Resolutionlist.push_back(resolution);
+ m_Resolution_pos = m_Resolutionlist.begin();
+
+ Zoom = 1;
+ Filtermode = 0;
+
+#else
m_Resolution_pos = m_Resolutionlist.begin();
-
initResolutionList();
+#endif
}
CVideoDriver::~CVideoDriver() {
@@ -205,6 +214,9 @@ void CVideoDriver::stop(void)
g_pLogFile->textOut(GREEN,"CVideoDriver Close%s
", SDL_GetError());
}
+#if defined(TARGET_OS_IPHONE) || defined(TARGET_IPHONE_SIMULATOR)
+extern "C" void iPhoneRotateScreen();
+#endif
bool CVideoDriver::start(void)
{
@@ -217,10 +229,8 @@ bool CVideoDriver::start(void)
}
else
g_pLogFile->textOut(GREEN,"SDL was successfully initialized!
");
-
+
SDL_WM_SetCaption("Commander Genius (CKP)", NULL);
- // When the program is through executing, call SDL_Quit
- atexit(SDL_Quit);
if(!applyMode())
{
@@ -229,6 +239,10 @@ bool CVideoDriver::start(void)
return false;
}
+#if defined(TARGET_OS_IPHONE) || defined(TARGET_IPHONE_SIMULATOR)
+ iPhoneRotateScreen();
+#endif
+
retval = createSurfaces();
initOpenGL();
@@ -420,6 +434,21 @@ void CVideoDriver::pal_apply(void)
}
}
+static void sb_lowblit(SDL_Surface* src, SDL_Rect* srcrect, SDL_Surface* dst, SDL_Rect* dstrect) {
+#if defined(TARGET_OS_IPHONE) || defined(TARGET_IPHONE_SIMULATOR)
+ // SDL_BlitSurface doesn't work for some reason
+ int _xend = srcrect->x + dstrect->w;
+ int _yend = srcrect->y + dstrect->h;
+ int _dst_xdiff = dstrect->x - srcrect->x;
+ int _dst_ydiff = dstrect->y - srcrect->y;
+ for(int x = srcrect->x; x < _xend; ++x)
+ for(int y = srcrect->y; y < _yend; ++y)
+ SDL_DrawPoint(dst, x + _dst_xdiff, y + _dst_ydiff, convert4to32BPPcolor( ((Uint8*)src->pixels)[y * 512 + x], dst ));
+#else
+ SDL_BlitSurface(src, srcrect, dst, dstrect);
+#endif
+}
+
void CVideoDriver::sb_blit(void)
{
SDL_Rect srcrect;
@@ -457,8 +486,8 @@ char tempbuf[80];
wrapvrt = 0;
}
- SDL_BlitSurface(ScrollSurface, &srcrect, BlitSurface, &dstrect);
-
+ sb_lowblit(ScrollSurface, &srcrect, BlitSurface, &dstrect);
+
if (wraphoz && wrapvrt)
{
// first do same thing we do for wraphoz
@@ -470,7 +499,7 @@ char tempbuf[80];
dstrect.w = 320 - dstrect.x;
srcrect.x = 0;
srcrect.w = (320 - srcrect.w);
- SDL_BlitSurface(ScrollSurface, &srcrect, BlitSurface, &dstrect);
+ sb_lowblit(ScrollSurface, &srcrect, BlitSurface, &dstrect);
// now repeat for the bottom
// (lower-right square)
@@ -478,13 +507,13 @@ char tempbuf[80];
dstrect.h = 200 - dstrect.y;
srcrect.y = 0;
srcrect.h = (200 - srcrect.h);
- SDL_BlitSurface(ScrollSurface, &srcrect, BlitSurface, &dstrect);
+ sb_lowblit(ScrollSurface, &srcrect, BlitSurface, &dstrect);
// (lower-left square)
dstrect.x = save_dstx;
dstrect.w = save_dstw;
srcrect.x = save_srcx;
srcrect.w = save_srcw;
- SDL_BlitSurface(ScrollSurface, &srcrect, BlitSurface, &dstrect);
+ sb_lowblit(ScrollSurface, &srcrect, BlitSurface, &dstrect);
}
else if (wraphoz)
{
@@ -492,7 +521,7 @@ char tempbuf[80];
dstrect.w = 320 - dstrect.x;
srcrect.x = 0;
srcrect.w = (320 - srcrect.w);
- SDL_BlitSurface(ScrollSurface, &srcrect, BlitSurface, &dstrect);
+ sb_lowblit(ScrollSurface, &srcrect, BlitSurface, &dstrect);
}
else if (wrapvrt)
{
@@ -500,7 +529,7 @@ char tempbuf[80];
dstrect.h = 200 - dstrect.y;
srcrect.y = 0;
srcrect.h = (200 - srcrect.h);
- SDL_BlitSurface(ScrollSurface, &srcrect, BlitSurface, &dstrect);
+ sb_lowblit(ScrollSurface, &srcrect, BlitSurface, &dstrect);
}
drawConsoleMessages();
@@ -539,8 +568,8 @@ void CVideoDriver::update_screen(void)
UnlockSurface(FGLayerSurface);
}
else // No OpenGL but Software Rendering
- {
#endif
+ {
SDL_BlitSurface(FGLayerSurface, NULL, BlitSurface, NULL);
// if we're doing zoom then we have copied the scroll buffer into
@@ -648,7 +677,7 @@ void CVideoDriver::update_screen(void)
UnlockSurface(screen);
UnlockSurface(BlitSurface);
}
-
+
SDL_Flip(screen);
//SDL_UpdateRect(screen, screenrect.x, screenrect.y, screenrect.w, screenrect.h);
@@ -657,9 +686,7 @@ void CVideoDriver::update_screen(void)
memset(FGLayerSurface->pixels,SDL_MapRGB(FGLayerSurface->format, 0, 0, 0),
GAME_STD_WIDTH*GAME_STD_HEIGHT*FGLayerSurface->format->BytesPerPixel);
UnlockSurface(FGLayerSurface);
-#ifdef USE_OPENGL
}
-#endif
}
void CVideoDriver::noscale(char *dest, char *src, short bbp)
diff --git a/src/sdl/iphone/iphone_video.m b/src/sdl/iphone/iphone_video.m
index 11a903aa8..a358460ce 100644
--- a/src/sdl/iphone/iphone_video.m
+++ b/src/sdl/iphone/iphone_video.m
@@ -551,3 +551,27 @@ uint getSizeNextPOT(uint size) {
@end
+// directly from SDL
+#import "video/uikit/SDL_uikitappdelegate.h"
+#import "video/uikit/SDL_uikitwindow.h"
+
+void iPhoneRotateScreen() {
+ CGRect myFrame = CGRectMake(0, 0, 480, 320);
+
+ [UIApplication sharedApplication].statusBarHidden = YES;
+
+ UIWindow* window = [SDLUIKitDelegate sharedAppDelegate].window;
+ UIView* view = window;
+// SDL_uikitopenglview* view = data->view;
+
+ CGAffineTransform transform = [view transform];
+ transform = CGAffineTransformTranslate(transform, 0, -35);
+ transform = CGAffineTransformRotate(transform, -0.5 * 3.14159265358979323846);
+ transform = CGAffineTransformScale(transform, 1.5, 1.6);
+ [view setFrame: myFrame];
+ [view setTransform: transform];
+
+ CGPoint center = CGPointMake(myFrame.size.width/2.0, myFrame.size.height/2.0);
+ [view setCenter: center];
+}
+