diff -r f589230fa21b -r 59dbd31e9953 project_files/HedgewarsMobile/Classes/otherSrc/UIImageExtra.m --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/HedgewarsMobile/Classes/otherSrc/UIImageExtra.m Thu Jun 17 20:30:39 2010 +0200 @@ -0,0 +1,189 @@ +// +// UIImageExtra.m +// HedgewarsMobile +// +// Created by Vittorio on 08/04/10. +// Copyright 2010 __MyCompanyName__. All rights reserved. +// + +#import "UIImageExtra.h" + + +@implementation UIImage (extra) + +-(UIImage *)scaleToSize:(CGSize) size { + // Create a bitmap graphics context + // This will also set it as the current context + UIGraphicsBeginImageContext(size); + + // Draw the scaled image in the current context + [self drawInRect:CGRectMake(0, 0, size.width, size.height)]; + + // Create a new image from current context + UIImage* scaledImage = UIGraphicsGetImageFromCurrentImageContext(); + + // Pop the current context from the stack + UIGraphicsEndImageContext(); + + // Return our new scaled image (autoreleased) + return scaledImage; +} + +-(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]; +} + +-(UIImage *)mergeWith:(UIImage *)secondImage atPoint:(CGPoint) secondImagePoint atSize:(CGSize) resultingSize { + UIGraphicsBeginImageContext(resultingSize); + + // drav the background image + [self drawAtPoint:CGPointMake(0,0)]; + + // draw the image on top of the first image + [secondImage drawAtPoint:secondImagePoint]; + + // create an image from the current contex (not thread safe) + UIImage *resultImage = UIGraphicsGetImageFromCurrentImageContext(); + + // free drawing contex + UIGraphicsEndImageContext(); + + // return the resulting autoreleased image + return resultImage; +} + +-(id) initWithContentsOfFile:(NSString *)path andCutAt:(CGRect) rect { + // load image from path + UIImage *image = [[UIImage alloc] initWithContentsOfFile: path]; + + if (nil != image) { + // get its CGImage representation with a give size + CGImageRef cgImgage = CGImageCreateWithImageInRect([image CGImage], rect); + + // clean memory + [image release]; + + // create a UIImage from the CGImage (memory must be allocated already) + UIImage *sprite = [self initWithCGImage:cgImgage]; + + // clean memory + CGImageRelease(cgImgage); + + // return resulting image + return sprite; + } else { + NSLog(@"initWithContentsOfFile: andCutAt: FAILED"); + return nil; + } +} + +-(UIImage *)convertToGrayScale { + // Create image rectangle with current image width/height + CGRect imageRect = CGRectMake(0, 0, self.size.width, self.size.height); + + // Grayscale color space + CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray(); + + // Create bitmap content with current image size and grayscale colorspace + CGContextRef context = CGBitmapContextCreate(nil, self.size.width, self.size.height, 8, 0, colorSpace, kCGImageAlphaNone); + + // Draw image into current context, with specified rectangle + // using previously defined context (with grayscale colorspace) + CGContextDrawImage(context, imageRect, [self CGImage]); + + // Create bitmap image info from pixel data in current context + CGImageRef imageRef = CGBitmapContextCreateImage(context); + + // Create a new UIImage object + UIImage *newImage = [UIImage imageWithCGImage:imageRef]; + + // Release colorspace, context and bitmap information + CGColorSpaceRelease(colorSpace); + CGContextRelease(context); + CFRelease(imageRef); + + // Return the new grayscale image + return newImage; +} + +// by http://iphonedevelopertips.com/cocoa/how-to-mask-an-image.html turned into a category by koda +-(UIImage*) maskImageWith:(UIImage *)maskImage { + CGImageRef maskRef = maskImage.CGImage; + + CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(maskRef), + CGImageGetHeight(maskRef), + CGImageGetBitsPerComponent(maskRef), + CGImageGetBitsPerPixel(maskRef), + CGImageGetBytesPerRow(maskRef), + CGImageGetDataProvider(maskRef), NULL, false); + + CGImageRef masked = CGImageCreateWithMask([self CGImage], mask); + + CGImageRelease(mask); + + UIImage* retImage = [UIImage imageWithCGImage:masked]; + + CGImageRelease(masked); + + return retImage; +} + +// by http://blog.sallarp.com/iphone-uiimage-round-corners/ turned into a category by koda +void addRoundedRectToPath(CGContextRef context, CGRect rect, float ovalWidth, float ovalHeight) +{ + float fw, fh; + if (ovalWidth == 0 || ovalHeight == 0) { + CGContextAddRect(context, rect); + return; + } + CGContextSaveGState(context); + CGContextTranslateCTM (context, CGRectGetMinX(rect), CGRectGetMinY(rect)); + CGContextScaleCTM (context, ovalWidth, ovalHeight); + fw = CGRectGetWidth (rect) / ovalWidth; + fh = CGRectGetHeight (rect) / ovalHeight; + CGContextMoveToPoint(context, fw, fh/2); + CGContextAddArcToPoint(context, fw, fh, fw/2, fh, 1); + CGContextAddArcToPoint(context, 0, fh, 0, fh/2, 1); + CGContextAddArcToPoint(context, 0, 0, fw/2, 0, 1); + CGContextAddArcToPoint(context, fw, 0, fw, fh/2, 1); + CGContextClosePath(context); + CGContextRestoreGState(context); +} + +-(UIImage *)makeRoundCornersOfSize:(CGSize) sizewh { + UIImage * newImage = nil; + + NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; + + NSInteger cornerWidth = sizewh.width; + NSInteger cornerHeight = sizewh.height; + int w = self.size.width; + int h = self.size.height; + + CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); + CGContextRef context = CGBitmapContextCreate(NULL, w, h, 8, 4 * w, colorSpace, kCGImageAlphaPremultipliedFirst); + + CGContextBeginPath(context); + CGRect rect = CGRectMake(0, 0, w, h); + addRoundedRectToPath(context, rect, cornerWidth, cornerHeight); + CGContextClosePath(context); + CGContextClip(context); + + CGContextDrawImage(context, CGRectMake(0, 0, w, h), self.CGImage); + + CGImageRef imageMasked = CGBitmapContextCreateImage(context); + CGContextRelease(context); + CGColorSpaceRelease(colorSpace); + [self release]; + + newImage = [[UIImage imageWithCGImage:imageMasked] retain]; + CGImageRelease(imageMasked); + + [pool release]; + + return newImage; +} + + +@end