diff -r 727da72f754a -r 27fb500dd6b1 project_files/HedgewarsMobile/Classes/InGameMenuViewController.m --- a/project_files/HedgewarsMobile/Classes/InGameMenuViewController.m Mon Feb 07 23:22:14 2011 +0100 +++ b/project_files/HedgewarsMobile/Classes/InGameMenuViewController.m Tue Feb 08 02:43:07 2011 +0100 @@ -25,6 +25,9 @@ #import "CommodityFunctions.h" #import "SDL_sysvideo.h" #import "SDL_uikitkeyboard.h" +#import "OpenGLES/ES1/gl.h" + +#define VIEW_HEIGHT 200 @implementation InGameMenuViewController @synthesize menuList; @@ -43,6 +46,7 @@ NSArray *array = [[NSArray alloc] initWithObjects: NSLocalizedString(@"Show Help", @""), NSLocalizedString(@"Tag", @""), + NSLocalizedString(@"Snapshot",@""), NSLocalizedString(@"End Game", @""), nil]; self.menuList = array; @@ -67,11 +71,11 @@ -(void) present { CGRect screen = [[UIScreen mainScreen] bounds]; self.view.backgroundColor = [UIColor clearColor]; - self.view.frame = CGRectMake(screen.size.height, 0, 200, 170); + self.view.frame = CGRectMake(screen.size.height, 0, 200, VIEW_HEIGHT); [UIView beginAnimations:@"showing popover" context:NULL]; [UIView setAnimationDuration:0.35]; - self.view.frame = CGRectMake(screen.size.height-200, 0, 200, 170); + self.view.frame = CGRectMake(screen.size.height-200, 0, 200, VIEW_HEIGHT); [UIView commitAnimations]; } @@ -80,13 +84,33 @@ CGRect screen = [[UIScreen mainScreen] bounds]; [UIView beginAnimations:@"hiding popover" context:NULL]; [UIView setAnimationDuration:0.35]; - self.view.frame = CGRectMake(screen.size.height, 0, 200, 170); + self.view.frame = CGRectMake(screen.size.height, 0, 200, VIEW_HEIGHT); [UIView commitAnimations]; [self.view performSelector:@selector(removeFromSuperview) withObject:nil afterDelay:0.35]; } HW_chatEnd(); SDL_iPhoneKeyboardHide((SDL_Window *)HW_getSDLWindow()); + + if (shouldTakeScreenshot) { + UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Please wait" + message:nil + delegate:nil + cancelButtonTitle:nil + otherButtonTitles:nil]; + [alert show]; + UIActivityIndicatorView *indicator = [[UIActivityIndicatorView alloc] + initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge]; + indicator.center = CGPointMake(alert.bounds.size.width / 2, alert.bounds.size.height - 45); + [indicator startAnimating]; + [alert addSubview:indicator]; + [indicator release]; + + // all these hacks because of the PAUSE caption on top of everything... + [self performSelector:@selector(saveCurrentScreenToPhotoAlbum:) withObject:alert afterDelay:0.3]; + } + shouldTakeScreenshot = NO; + } #pragma mark - @@ -96,7 +120,7 @@ } -(NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { - return 3; + return 4; } -(UITableViewCell *)tableView:(UITableView *)aTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { @@ -117,16 +141,30 @@ -(void) tableView:(UITableView *)aTableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { UIActionSheet *actionSheet; + UIAlertView *alert; switch ([indexPath row]) { case 0: [[NSNotificationCenter defaultCenter] postNotificationName:@"show help ingame" object:nil]; + break; case 1: HW_chat(); SDL_iPhoneKeyboardShow((SDL_Window *)HW_getSDLWindow()); + break; case 2: + alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Going to take a screenshot",@"") + message:NSLocalizedString(@"The game snapshot will be placed in your Photo Album and it will be taken as soon as the pause menu is dismissed",@"") + delegate:nil + cancelButtonTitle:NSLocalizedString(@"Ok, got it",@"") + otherButtonTitles:nil]; + [alert show]; + [alert release]; + shouldTakeScreenshot = YES; + + break; + case 3: // expand the view (and table) so that the actionsheet can be selected on the iPhone if (IS_IPAD() == NO) { CGRect screen = [[UIScreen mainScreen] bounds]; @@ -160,7 +198,7 @@ CGRect screen = [[UIScreen mainScreen] bounds]; [UIView beginAnimations:@"table width less" context:NULL]; [UIView setAnimationDuration:0.2]; - self.view.frame = CGRectMake(screen.size.height-200, 0, 200, 170); + self.view.frame = CGRectMake(screen.size.height-200, 0, 200, VIEW_HEIGHT); [UIView commitAnimations]; } @@ -171,4 +209,59 @@ } } +#pragma mark save screenshot +//by http://www.bit-101.com/blog/?p=1861 +// callback for CGDataProviderCreateWithData +void releaseData(void *info, const void *data, size_t dataSize) { + DLog(@"freeing raw data\n"); + free((void *)data); +} + +// callback for UIImageWriteToSavedPhotosAlbum +-(void) image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo { + DLog(@"Save finished\n"); + [image release]; + UIAlertView *alert = (UIAlertView *)contextInfo; + [alert dismissWithClickedButtonIndex:0 animated:YES]; + [alert release]; +} + +// the resolution of the buffer is always equal to the hardware device even if scaled +-(void) saveCurrentScreenToPhotoAlbum:(UIAlertView *)alert { + CGRect screenRect = [[UIScreen mainScreen] bounds]; + int width = screenRect.size.width; + int height = screenRect.size.height; + + NSInteger size = width * height * 4; + GLubyte *buffer = (GLubyte *) malloc(size * sizeof(GLubyte)); + GLubyte *buffer_flipped = (GLubyte *) malloc(size * sizeof(GLubyte)); + + glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, buffer); + + // flip the data as glReadPixels here reads upside down + for(int y = 0; y