# HG changeset patch # User koda # Date 1286742721 -7200 # Node ID 24daa33a31149407adf0c39db0fce3b1dda36c2d # Parent 709fdb89f76c23836a019863b2dc4e2ee4821d9b some rethinking of initial menu presentation and initial orientation (also merging images should be threadsafe now) diff -r 709fdb89f76c -r 24daa33a3114 hedgewars/PascalExports.pas --- a/hedgewars/PascalExports.pas Sun Oct 10 21:32:18 2010 +0400 +++ b/hedgewars/PascalExports.pas Sun Oct 10 22:32:01 2010 +0200 @@ -167,18 +167,6 @@ if closeFrontend then alsoShutdownFrontend:= true; end; -procedure HW_setLandscape(landscape: boolean); cdecl; export; -begin - if landscape then - begin - cOffsetY:= 0; - end - else - begin - cOffsetY:= 120; - end; -end; - procedure HW_setCursor(x,y: LongInt); cdecl; export; begin CursorPoint.X:= x; diff -r 709fdb89f76c -r 24daa33a3114 hedgewars/uMobile.pas --- a/hedgewars/uMobile.pas Sun Oct 10 21:32:18 2010 +0400 +++ b/hedgewars/uMobile.pas Sun Oct 10 22:32:01 2010 +0200 @@ -31,19 +31,19 @@ procedure updateVisualsNewTurn; cdecl; external; function isApplePhone: Boolean; cdecl; external; {$ENDIF} -function isPhone: Boolean; -procedure doRumble; -procedure perfExt_AddProgress; -procedure perfExt_FinishProgress; -procedure perfExt_AmmoUpdate; -procedure perfExt_NewTurnBeginning; -procedure perfExt_SaveBeganSynching; -procedure perfExt_SaveFinishedSynching; +function isPhone: Boolean; inline; +procedure doRumble; inline; +procedure perfExt_AddProgress; inline; +procedure perfExt_FinishProgress; inline; +procedure perfExt_AmmoUpdate; // don't inline +procedure perfExt_NewTurnBeginning; inline; +procedure perfExt_SaveBeganSynching; inline; +procedure perfExt_SaveFinishedSynching; inline; implementation uses uTeams; -function isPhone: Boolean; +function isPhone: Boolean; inline; begin {$IFDEF IPHONEOS} exit(isApplePhone()); @@ -51,26 +51,26 @@ exit(false); end; -procedure doRumble; +procedure doRumble; inline; begin // fill me! end; -procedure perfExt_AddProgress; +procedure perfExt_AddProgress; inline; begin {$IFDEF IPHONEOS} startSpinning(); {$ENDIF} end; -procedure perfExt_FinishProgress; +procedure perfExt_FinishProgress; inline; begin {$IFDEF IPHONEOS} stopSpinning(); {$ENDIF} end; -procedure perfExt_AmmoUpdate; +procedure perfExt_AmmoUpdate; // don't inline begin {$IFDEF IPHONEOS} if (CurrentTeam^.ExtDriven) or (CurrentTeam^.Hedgehogs[0].BotLevel <> 0) then @@ -79,22 +79,22 @@ {$ENDIF} end; -procedure perfExt_NewTurnBeginning; +procedure perfExt_NewTurnBeginning; inline; begin {$IFDEF IPHONEOS} clearView(); - updateVisualsNewTurn(); + perfExt_AmmoUpdate(); {$ENDIF} end; -procedure perfExt_SaveBeganSynching; +procedure perfExt_SaveBeganSynching; inline; begin {$IFDEF IPHONEOS} replayBegan(); {$ENDIF} end; -procedure perfExt_SaveFinishedSynching; +procedure perfExt_SaveFinishedSynching; inline; begin {$IFDEF IPHONEOS} replayFinished(); diff -r 709fdb89f76c -r 24daa33a3114 project_files/HedgewarsMobile/Classes/GameConfigViewController.h --- a/project_files/HedgewarsMobile/Classes/GameConfigViewController.h Sun Oct 10 21:32:18 2010 +0400 +++ b/project_files/HedgewarsMobile/Classes/GameConfigViewController.h Sun Oct 10 22:32:01 2010 +0200 @@ -27,7 +27,6 @@ @class SchemeWeaponConfigViewController; @interface GameConfigViewController : UIViewController { - UIImage *hedgehogImage; UIView *imgContainer; HelpPageViewController *helpPage; @@ -36,8 +35,7 @@ SchemeWeaponConfigViewController *schemeWeaponConfigViewController; } -@property (nonatomic,retain) UIImage *hedgehogImage; -@property (nonatomic,retain) UIView *imgContainer; +@property (retain) UIView *imgContainer; @property (nonatomic,retain) HelpPageViewController *helpPage; @property (nonatomic,retain) MapConfigViewController *mapConfigViewController; @property (nonatomic,retain) TeamConfigViewController *teamConfigViewController; diff -r 709fdb89f76c -r 24daa33a3114 project_files/HedgewarsMobile/Classes/GameConfigViewController.m --- a/project_files/HedgewarsMobile/Classes/GameConfigViewController.m Sun Oct 10 21:32:18 2010 +0400 +++ b/project_files/HedgewarsMobile/Classes/GameConfigViewController.m Sun Oct 10 22:32:01 2010 +0200 @@ -30,7 +30,7 @@ #import "PascalImports.h" @implementation GameConfigViewController -@synthesize hedgehogImage, imgContainer, helpPage, mapConfigViewController, teamConfigViewController, schemeWeaponConfigViewController; +@synthesize imgContainer, helpPage, mapConfigViewController, teamConfigViewController, schemeWeaponConfigViewController; -(BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { @@ -202,12 +202,13 @@ teamConfigViewController.listOfSelectedTeams,@"teams_list", schemeWeaponConfigViewController.selectedScheme,@"scheme", schemeWeaponConfigViewController.selectedWeapon,@"weapon", + [NSNumber numberWithInt:self.interfaceOrientation],@"orientation", nil]; // finally launch game and remove this controller DLog(@"sending config %@", gameDictionary); - if ([[gameDictionary allKeys] count] == 10) { + if ([[gameDictionary allKeys] count] == 11) { NSDictionary *allDataNecessary = [NSDictionary dictionaryWithObjectsAndKeys:gameDictionary,@"game_dictionary", @"",@"savefile", [NSNumber numberWithBool:NO],@"netgame", nil]; [[SDLUIKitDelegate sharedAppDelegate] startSDLgame:allDataNecessary]; @@ -242,6 +243,37 @@ } +-(void) loadNiceHogs { + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + NSString *filePath = [NSString stringWithFormat:@"%@/Hedgehog.png",GRAPHICS_DIRECTORY()]; + UIImage *sprite = [[UIImage alloc] initWithContentsOfFile:filePath andCutAt:CGRectMake(96, 0, 32, 32)]; + + NSArray *hatArray = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:HATS_DIRECTORY() error:NULL]; + int numberOfHats = [hatArray count]; + + if (self.imgContainer != nil) + [self.imgContainer removeFromSuperview]; + + self.imgContainer = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 300, 40)]; + for (int i = 0; i < 1 + random()%40; i++) { + NSString *hat = [hatArray objectAtIndex:random()%numberOfHats]; + + NSString *hatFile = [[NSString alloc] initWithFormat:@"%@/%@", HATS_DIRECTORY(), hat]; + UIImage *hatSprite = [[UIImage alloc] initWithContentsOfFile: hatFile andCutAt:CGRectMake(0, 0, 32, 32)]; + [hatFile release]; + UIImage *hogWithHat = [sprite mergeWith:hatSprite atPoint:CGPointMake(0, 5)]; + [hatSprite release]; + + UIImageView *hog = [[UIImageView alloc] initWithImage:hogWithHat]; + hog.frame = CGRectMake(10*(i+1)+random()%30, 30, 32, 32); + [self.imgContainer addSubview:hog]; + [hog release]; + } + [self.view addSubview:self.imgContainer]; + [sprite release]; + [pool drain]; +} + -(void) viewDidLoad { self.view.backgroundColor = [UIColor blackColor]; @@ -254,7 +286,6 @@ name:@"buttonPressed" object:nil]; srandom(time(NULL)); - self.hedgehogImage = nil; // load other controllers if (self.mapConfigViewController == nil) @@ -271,48 +302,20 @@ } else { // this is the visible controller - if (mapConfigViewController == nil) - mapConfigViewController = [[MapConfigViewController alloc] initWithNibName:@"MapConfigViewController-iPhone" bundle:nil]; - // this must be loaded & added to auto set default scheme and ammo - schemeWeaponConfigViewController = [[SchemeWeaponConfigViewController alloc] initWithStyle:UITableViewStyleGrouped]; - [self.view addSubview:schemeWeaponConfigViewController.view]; + if (self.mapConfigViewController == nil) + self.mapConfigViewController = [[MapConfigViewController alloc] initWithNibName:@"MapConfigViewController-iPhone" bundle:nil]; + // this must be loaded & added in order to auto set default scheme and ammo + self.schemeWeaponConfigViewController = [[SchemeWeaponConfigViewController alloc] initWithStyle:UITableViewStyleGrouped]; + [self.view addSubview:self.schemeWeaponConfigViewController.view]; } - [self.view addSubview:mapConfigViewController.view]; + [self.view addSubview:self.mapConfigViewController.view]; [super viewDidLoad]; } -(void) viewWillAppear:(BOOL)animated { - if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { - // load a base image that will be updated in viewWill Load - if (self.hedgehogImage == nil) { - NSString *filePath = [NSString stringWithFormat:@"%@/Hedgehog.png",GRAPHICS_DIRECTORY()]; - UIImage *sprite = [[UIImage alloc] initWithContentsOfFile:filePath andCutAt:CGRectMake(96, 0, 32, 32)]; - self.hedgehogImage = sprite; - [sprite release]; - } - - NSArray *hatArray = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:HATS_DIRECTORY() error:NULL]; - int numberOfHats = [hatArray count]; - if (self.imgContainer == nil) - self.imgContainer = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 300, 40)]; - - for (int i=0; i < 1 + random()%40; i++) { - NSString *hat = [hatArray objectAtIndex:random()%numberOfHats]; - - NSString *hatFile = [[NSString alloc] initWithFormat:@"%@/%@", HATS_DIRECTORY(), hat]; - UIImage *hatSprite = [[UIImage alloc] initWithContentsOfFile: hatFile andCutAt:CGRectMake(0, 0, 32, 32)]; - [hatFile release]; - UIImage *hogWithHat = [self.hedgehogImage mergeWith:hatSprite atPoint:CGPointMake(0, -5)]; - [hatSprite release]; - - UIImageView *hog = [[UIImageView alloc] initWithImage:hogWithHat]; - hog.frame = CGRectMake(10*(i+1)+random()%30, 30, 32, 32); - [self.imgContainer addSubview:hog]; - [hog release]; - } - [self.view addSubview:self.imgContainer]; - } + if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) + [NSThread detachNewThreadSelector:@selector(loadNiceHogs) toTarget:self withObject:nil]; [mapConfigViewController viewWillAppear:animated]; [teamConfigViewController viewWillAppear:animated]; @@ -337,11 +340,6 @@ } -(void) viewDidDisappear:(BOOL)animated { - if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { - [self.imgContainer removeFromSuperview]; - releaseAndNil(self.imgContainer); - } - [mapConfigViewController viewDidDisappear:animated]; [teamConfigViewController viewDidDisappear:animated]; [schemeWeaponConfigViewController viewDidDisappear:animated]; @@ -361,14 +359,12 @@ // Release any cached data, images, etc that aren't in use. self.imgContainer = nil; - self.hedgehogImage = nil; MSG_MEMCLEAN(); [super didReceiveMemoryWarning]; } -(void) viewDidUnload { - [[NSNotificationCenter defaultCenter] removeObserver:self forKeyPath:@"buttonPressed"]; - self.hedgehogImage = nil; + [[NSNotificationCenter defaultCenter] removeObserver:self]; self.imgContainer = nil; self.mapConfigViewController = nil; self.teamConfigViewController = nil; @@ -379,7 +375,6 @@ } -(void) dealloc { - [hedgehogImage release]; [imgContainer release]; [mapConfigViewController release]; [teamConfigViewController release]; diff -r 709fdb89f76c -r 24daa33a3114 project_files/HedgewarsMobile/Classes/GameSetup.m --- a/project_files/HedgewarsMobile/Classes/GameSetup.m Sun Oct 10 21:32:18 2010 +0400 +++ b/project_files/HedgewarsMobile/Classes/GameSetup.m Sun Oct 10 22:32:01 2010 +0200 @@ -35,19 +35,24 @@ if (self = [super init]) { ipcPort = randomPort(); - // should check they exist and throw and exection if not + // the general settings file + menu style (read by the overlay) NSDictionary *dictSett = [[NSDictionary alloc] initWithContentsOfFile:SETTINGS_FILE()]; + self.menuStyle = [[dictSett objectForKey:@"menu"] boolValue]; self.systemSettings = dictSett; - self.menuStyle = [[dictSett objectForKey:@"menu"] boolValue]; [dictSett release]; + // this game run settings self.gameConfig = [gameDictionary objectForKey:@"game_dictionary"]; + + // is it a netgame? isNetGame = [[gameDictionary objectForKey:@"netgame"] boolValue]; + + // is it a Save? NSString *path = [gameDictionary objectForKey:@"savefile"]; - // if path is empty it means i have to create a new file, otherwise i read from that file + // if path is empty it means that you have to create a new file, otherwise read from that file if ([path isEqualToString:@""] == YES) { NSDateFormatter *outputFormatter = [[NSDateFormatter alloc] init]; - [outputFormatter setDateFormat:@"yyyy-MM-dd 'at' HH,mm"]; + [outputFormatter setDateFormat:@"yyyy.MM.dd '@' HH-mm"]; NSString *newDateString = [outputFormatter stringFromDate:[NSDate date]]; self.savePath = [SAVES_DIRECTORY() stringByAppendingFormat:@"%@.hws", newDateString]; [outputFormatter release]; @@ -451,7 +456,12 @@ CGRect screenBounds = [[UIScreen mainScreen] bounds]; width = (int) screenBounds.size.height; height = (int) screenBounds.size.width; - rotation = @"-90"; + UIDeviceOrientation orientation = (UIDeviceOrientation) [[self.gameConfig objectForKey:@"orientation"] intValue]; + if (orientation == UIDeviceOrientationLandscapeLeft) + rotation = @"-90"; + else + rotation = @"90"; + } NSString *horizontalSize = [[NSString alloc] initWithFormat:@"%d", width]; diff -r 709fdb89f76c -r 24daa33a3114 project_files/HedgewarsMobile/Classes/HogButtonView.m --- a/project_files/HedgewarsMobile/Classes/HogButtonView.m Sun Oct 10 21:32:18 2010 +0400 +++ b/project_files/HedgewarsMobile/Classes/HogButtonView.m Sun Oct 10 22:32:01 2010 +0200 @@ -66,7 +66,7 @@ for (int i = 0; i < numberOfHogs; i++) { teamHogs = [singleHog mergeWith:teamHogs atPoint:CGPointMake(8, 0) - atSize:CGSizeMake(88, 32)]; + ofSize:CGSizeMake(88, 32)]; } [self setImage:teamHogs forState:UIControlStateNormal]; } diff -r 709fdb89f76c -r 24daa33a3114 project_files/HedgewarsMobile/Classes/HogHatViewController.m --- a/project_files/HedgewarsMobile/Classes/HogHatViewController.m Sun Oct 10 21:32:18 2010 +0400 +++ b/project_files/HedgewarsMobile/Classes/HogHatViewController.m Sun Oct 10 22:32:01 2010 +0200 @@ -31,7 +31,6 @@ return rotationManager(interfaceOrientation); } - #pragma mark - #pragma mark View lifecycle - (void)viewDidLoad { @@ -88,7 +87,7 @@ NSString *hatFile = [[NSString alloc] initWithFormat:@"%@/%@", HATS_DIRECTORY(), hat]; UIImage *hatSprite = [[UIImage alloc] initWithContentsOfFile: hatFile andCutAt:CGRectMake(0, 0, 32, 32)]; [hatFile release]; - cell.imageView.image = [self.normalHogSprite mergeWith:hatSprite atPoint:CGPointMake(0, -5)]; + cell.imageView.image = [self.normalHogSprite mergeWith:hatSprite atPoint:CGPointMake(0, 5)]; [hatSprite release]; if ([hat isEqualToString:[hog objectForKey:@"hat"]]) { diff -r 709fdb89f76c -r 24daa33a3114 project_files/HedgewarsMobile/Classes/OverlayViewController.m --- a/project_files/HedgewarsMobile/Classes/OverlayViewController.m Sun Oct 10 21:32:18 2010 +0400 +++ b/project_files/HedgewarsMobile/Classes/OverlayViewController.m Sun Oct 10 22:32:01 2010 +0200 @@ -63,32 +63,12 @@ if (IS_DUALHEAD() == NO) sdlView.transform = CGAffineTransformMakeRotation(degreesToRadians(0)); self.view.transform = CGAffineTransformMakeRotation(degreesToRadians(90)); - HW_setLandscape(YES); break; case UIDeviceOrientationLandscapeRight: if (IS_DUALHEAD() == NO) sdlView.transform = CGAffineTransformMakeRotation(degreesToRadians(180)); self.view.transform = CGAffineTransformMakeRotation(degreesToRadians(-90)); - HW_setLandscape(YES); break; - /* - case UIDeviceOrientationPortrait: - if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { - sdlView.transform = CGAffineTransformMakeRotation(degreesToRadian(270)); - self.view.transform = CGAffineTransformMakeRotation(degreesToRadian(0)); - [self chatAppear]; - HW_setLandscape(NO); - } - break; - case UIDeviceOrientationPortraitUpsideDown: - if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { - sdlView.transform = CGAffineTransformMakeRotation(degreesToRadian(90)); - self.view.transform = CGAffineTransformMakeRotation(degreesToRadian(180)); - [self chatAppear]; - HW_setLandscape(NO); - } - break; - */ default: // a debug log would spam too much break; @@ -112,25 +92,7 @@ self.view.center = CGPointMake(self.view.frame.size.height/2.0, self.view.frame.size.width/2.0); initialScreenCount = [[UIScreen screens] count]; - - // set initial orientation wrt the controller orientation - UIDeviceOrientation orientation = self.interfaceOrientation; - UIView *sdlView = [[[UIApplication sharedApplication] keyWindow] viewWithTag:SDL_VIEW_TAG]; - switch (orientation) { - case UIDeviceOrientationLandscapeLeft: - if (IS_DUALHEAD() == NO) - sdlView.transform = CGAffineTransformMakeRotation(degreesToRadians(0)); - self.view.transform = CGAffineTransformMakeRotation(degreesToRadians(90)); - break; - case UIDeviceOrientationLandscapeRight: - if (IS_DUALHEAD() == NO) - sdlView.transform = CGAffineTransformMakeRotation(degreesToRadians(180)); - self.view.transform = CGAffineTransformMakeRotation(degreesToRadians(-90)); - break; - default: - DLog(@"unknown orientation"); - break; - } + CGRect screenRect = [[UIScreen mainScreen] bounds]; self.view.frame = CGRectMake(0, 0, screenRect.size.width, screenRect.size.height); diff -r 709fdb89f76c -r 24daa33a3114 project_files/HedgewarsMobile/Classes/PascalImports.h --- a/project_files/HedgewarsMobile/Classes/PascalImports.h Sun Oct 10 21:32:18 2010 +0400 +++ b/project_files/HedgewarsMobile/Classes/PascalImports.h Sun Oct 10 22:32:01 2010 +0200 @@ -67,7 +67,6 @@ void HW_terminate(BOOL andCloseFrontend); - void HW_setLandscape(BOOL rotate); void HW_setCursor(int x, int y); void HW_getCursor(int *x, int *y); diff -r 709fdb89f76c -r 24daa33a3114 project_files/HedgewarsMobile/Classes/SingleTeamViewController.m --- a/project_files/HedgewarsMobile/Classes/SingleTeamViewController.m Sun Oct 10 21:32:18 2010 +0400 +++ b/project_files/HedgewarsMobile/Classes/SingleTeamViewController.m Sun Oct 10 22:32:01 2010 +0200 @@ -221,7 +221,7 @@ NSString *hatFile = [[NSString alloc] initWithFormat:@"%@/%@.png", HATS_DIRECTORY(), [[hogArray objectAtIndex:row] objectForKey:@"hat"]]; UIImage *hatSprite = [[UIImage alloc] initWithContentsOfFile: hatFile andCutAt:CGRectMake(0, 0, 32, 32)]; [hatFile release]; - editableCell.imageView.image = [self.normalHogSprite mergeWith:hatSprite atPoint:CGPointMake(0, -5)]; + editableCell.imageView.image = [self.normalHogSprite mergeWith:hatSprite atPoint:CGPointMake(0, 5)]; [hatSprite release]; editableCell.textField.text = [[hogArray objectAtIndex:row] objectForKey:@"hogname"]; diff -r 709fdb89f76c -r 24daa33a3114 project_files/HedgewarsMobile/Classes/UIImageExtra.h --- a/project_files/HedgewarsMobile/Classes/UIImageExtra.h Sun Oct 10 21:32:18 2010 +0400 +++ b/project_files/HedgewarsMobile/Classes/UIImageExtra.h Sun Oct 10 22:32:01 2010 +0200 @@ -26,7 +26,7 @@ -(UIImage *)scaleToSize:(CGSize) size; -(UIImage *)mergeWith:(UIImage *)secondImage atPoint:(CGPoint) secondImagePoint; --(UIImage *)mergeWith:(UIImage *)secondImage atPoint:(CGPoint) secondImagePoint atSize:(CGSize) resultingSize; +-(UIImage *)mergeWith:(UIImage *)secondImage atPoint:(CGPoint) secondImagePoint ofSize:(CGSize) resultingSize; -(id) initWithContentsOfFile:(NSString *)path andCutAt:(CGRect) rect; -(UIImage *)cutAt:(CGRect) rect; -(UIImage *)convertToGrayScale; diff -r 709fdb89f76c -r 24daa33a3114 project_files/HedgewarsMobile/Classes/UIImageExtra.m --- a/project_files/HedgewarsMobile/Classes/UIImageExtra.m Sun Oct 10 21:32:18 2010 +0400 +++ b/project_files/HedgewarsMobile/Classes/UIImageExtra.m Sun Oct 10 22:32:01 2010 +0200 @@ -45,31 +45,41 @@ -(UIImage *)mergeWith:(UIImage *)secondImage atPoint:(CGPoint) secondImagePoint { // create a contex of size of the background image - return [self mergeWith:secondImage atPoint:secondImagePoint atSize:self.size]; + return [self mergeWith:secondImage atPoint:secondImagePoint ofSize:self.size]; } --(UIImage *)mergeWith:(UIImage *)secondImage atPoint:(CGPoint) secondImagePoint atSize:(CGSize) resultingSize { +-(UIImage *)mergeWith:(UIImage *)secondImage atPoint:(CGPoint) secondImagePoint ofSize:(CGSize) resultingSize { if (secondImage == nil) { DLog(@"Warning, secondImage == nil"); return self; } + int w = resultingSize.width; + int h = resultingSize.height; + + if (w == 0 || h == 0) { + DLog(@"Can have 0 dimesions"); + return self; + } // Create a bitmap graphics context; this will also set it as the current context - UIGraphicsBeginImageContext(resultingSize); - - // draw the background image in the current context - [self drawAtPoint:CGPointMake(0,0)]; - - // draw the image on top of the first image (because the context is the same) - [secondImage drawAtPoint:secondImagePoint]; + CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); + CGContextRef context = CGBitmapContextCreate(NULL, w, h, 8, 4 * w, colorSpace, kCGImageAlphaPremultipliedFirst); + + // draw the two images in the current context + CGContextDrawImage(context, CGRectMake(0, 0, self.size.width, self.size.height), [self CGImage]); + CGContextDrawImage(context, CGRectMake(secondImagePoint.x, secondImagePoint.y, secondImage.size.width, secondImage.size.height), [secondImage CGImage]); + + // Create bitmap image info from pixel data in current context + CGImageRef imageRef = CGBitmapContextCreateImage(context); + + // Create a new UIImage object + UIImage *resultImage = [UIImage imageWithCGImage:imageRef]; - // create an image from the current contex (not thread safe) - UIImage *resultImage = UIGraphicsGetImageFromCurrentImageContext(); - - // free drawing contex - UIGraphicsEndImageContext(); - - // return the resulting autoreleased image + // Release colorspace, context and bitmap information + CGColorSpaceRelease(colorSpace); + CGContextRelease(context); + CFRelease(imageRef); + return resultImage; } @@ -215,13 +225,13 @@ CGContextSetBlendMode(UIGraphicsGetCurrentContext(), kCGBlendModeDifference); CGContextSetFillColorWithColor(UIGraphicsGetCurrentContext(),[UIColor whiteColor].CGColor); CGContextFillRect(UIGraphicsGetCurrentContext(), CGRectMake(0, 0, self.size.width, self.size.height)); + // create an image from the current contex (not thread safe) UIImage *result = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return result; } +(UIImage *)whiteImage:(CGSize) ofSize { - // white rounded rectangle as background image for previewButton UIGraphicsBeginImageContext(ofSize); CGContextRef context = UIGraphicsGetCurrentContext(); UIGraphicsPushContext(context);