[iphone] Memory leak fixed. Widget does not crash anymore after a few seconds. No more memory warning either

git-svn-id: https://zxing.googlecode.com/svn/trunk@1396 59b500cc-1b3d-0410-9834-0bbf25fbcc57
This commit is contained in:
rpechayr 2010-05-29 11:31:41 +00:00
parent a86b0e7cf3
commit dc8f256848
8 changed files with 258 additions and 224 deletions

View file

@ -18,16 +18,20 @@
- (void)viewDidLoad { - (void)viewDidLoad {
[super viewDidLoad]; [super viewDidLoad];
[self setTitle:@"ZXing"]; [self setTitle:@"ZXing"];
scanController = [ZXingWidgetController alloc];
scanController = [[ZXingWidgetController alloc] initWithDelegate:self];
[scanController setOneDMode:NO]; [scanController setOneDMode:NO];
[scanController setShowCancel:YES]; [scanController setShowCancel:YES];
scanController = [scanController initWithDelegate:self]; scanController = [scanController initWithDelegate:self];
NSBundle *mainBundle = [NSBundle mainBundle]; NSBundle *mainBundle = [NSBundle mainBundle];
[scanController setSoundToPlay:[[NSURL fileURLWithPath:[mainBundle pathForResource:@"beep-beep" ofType:@"aiff"] isDirectory:NO] retain]]; [scanController setSoundToPlay:[[NSURL fileURLWithPath:[mainBundle pathForResource:@"beep-beep" ofType:@"aiff"] isDirectory:NO] retain]];
} }
- (IBAction)scanPressed:(id)sender { - (IBAction)scanPressed:(id)sender {
[self presentModalViewController:scanController animated:YES]; //UIImagePickerController *picker = [[UIImagePickerController alloc] init];
[self presentModalViewController:scanController
animated:YES];
// [self.navigationController pushViewController:scanController animated:true]; // [self.navigationController pushViewController:scanController animated:true];
} }
@ -64,7 +68,7 @@
- (void)scanResult:(NSString *)result { - (void)scanResult:(NSString *)result {
//[self.resultsView setText:result]; //[self.resultsView setText:result];
[self dismissModalViewControllerAnimated:NO]; [self dismissModalViewControllerAnimated:YES];
self.resultsToDisplay = result; self.resultsToDisplay = result;
} }
@ -78,7 +82,7 @@
} }
- (void)cancelled { - (void)cancelled {
[self dismissModalViewControllerAnimated:true]; [self dismissModalViewControllerAnimated:YES];
} }
#pragma mark - #pragma mark -

View file

@ -297,6 +297,7 @@
ARCHS = "$(ARCHS_STANDARD_32_BIT)"; ARCHS = "$(ARCHS_STANDARD_32_BIT)";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
GCC_C_LANGUAGE_STANDARD = c99; GCC_C_LANGUAGE_STANDARD = c99;
GCC_VERSION = 4.2;
GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES;
GCC_WARN_UNUSED_VARIABLE = YES; GCC_WARN_UNUSED_VARIABLE = YES;
HEADER_SEARCH_PATHS = "../ZXingWidget/Classes/**"; HEADER_SEARCH_PATHS = "../ZXingWidget/Classes/**";
@ -316,7 +317,7 @@
HEADER_SEARCH_PATHS = "../ZXingWidget/Classes/**"; HEADER_SEARCH_PATHS = "../ZXingWidget/Classes/**";
OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1";
PREBINDING = NO; PREBINDING = NO;
SDKROOT = iphoneos3.1.3; SDKROOT = iphonesimulator3.1.3;
}; };
name = Release; name = Release;
}; };

View file

@ -32,6 +32,7 @@
size_t subsetHeight; size_t subsetHeight;
size_t subsetBytesPerRow; size_t subsetBytesPerRow;
id<DecoderDelegate> delegate; id<DecoderDelegate> delegate;
NSOperationQueue *operationQueue;
} }
@property(nonatomic, retain) UIImage *image; @property(nonatomic, retain) UIImage *image;
@ -42,6 +43,7 @@
@property(assign) size_t subsetHeight; @property(assign) size_t subsetHeight;
@property(assign) size_t subsetBytesPerRow; @property(assign) size_t subsetBytesPerRow;
@property(nonatomic, assign) id<DecoderDelegate> delegate; @property(nonatomic, assign) id<DecoderDelegate> delegate;
@property (nonatomic, retain) NSOperationQueue *operationQueue;
- (void) decodeImage:(UIImage *)image; - (void) decodeImage:(UIImage *)image;
- (void) decodeImage:(UIImage *)image cropRect:(CGRect)cropRect; - (void) decodeImage:(UIImage *)image cropRect:(CGRect)cropRect;

View file

@ -42,7 +42,17 @@ using namespace zxing;
@synthesize subsetHeight; @synthesize subsetHeight;
@synthesize subsetBytesPerRow; @synthesize subsetBytesPerRow;
@synthesize delegate; @synthesize delegate;
@synthesize operationQueue;
- (id)init {
if (self = [super init]) {
NSOperationQueue *opQueue = [[NSOperationQueue alloc] init];
self.operationQueue = opQueue;
[opQueue release];
}
return self;
}
- (void)willDecodeImage { - (void)willDecodeImage {
if ([self.delegate respondsToSelector:@selector(decoder:willDecodeImage:usingSubset:)]) { if ([self.delegate respondsToSelector:@selector(decoder:willDecodeImage:usingSubset:)]) {
[self.delegate decoder:self willDecodeImage:self.image usingSubset:self.subsetImage]; [self.delegate decoder:self willDecodeImage:self.image usingSubset:self.subsetImage];
@ -56,6 +66,7 @@ using namespace zxing;
} }
- (void)didDecodeImage:(TwoDDecoderResult *)result { - (void)didDecodeImage:(TwoDDecoderResult *)result {
if ([self.delegate respondsToSelector:@selector(decoder:didDecodeImage:usingSubset:withResult:)]) { if ([self.delegate respondsToSelector:@selector(decoder:didDecodeImage:usingSubset:withResult:)]) {
[self.delegate decoder:self didDecodeImage:self.image usingSubset:self.subsetImage withResult:result]; [self.delegate decoder:self didDecodeImage:self.image usingSubset:self.subsetImage withResult:result];
} }
@ -64,6 +75,7 @@ using namespace zxing;
} }
- (void)failedToDecodeImage:(NSString *)reason { - (void)failedToDecodeImage:(NSString *)reason {
if ([self.delegate respondsToSelector:@selector(decoder:failedToDecodeImage:usingSubset:reason:)]) { if ([self.delegate respondsToSelector:@selector(decoder:failedToDecodeImage:usingSubset:reason:)]) {
[self.delegate decoder:self failedToDecodeImage:self.image usingSubset:self.subsetImage reason:reason]; [self.delegate decoder:self failedToDecodeImage:self.image usingSubset:self.subsetImage reason:reason];
} }
@ -143,13 +155,13 @@ using namespace zxing;
} }
- (void)decode:(id)arg { - (void)decode:(id)arg {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSAutoreleasePool* mainpool = [[NSAutoreleasePool alloc] init];
{ {
NSSet *formatReaders = [FormatReader formatReaders]; NSSet *formatReaders = [FormatReader formatReaders];
Ref<LuminanceSource> source (new GrayBytesMonochromeBitmapSource(subsetData, subsetWidth, subsetHeight, subsetBytesPerRow)); Ref<LuminanceSource> source (new GrayBytesMonochromeBitmapSource(subsetData, subsetWidth, subsetHeight, subsetBytesPerRow));
Ref<Binarizer> binarizer (new GlobalHistogramBinarizer(source)); Ref<Binarizer> binarizer (new GlobalHistogramBinarizer(source));
Ref<BinaryBitmap> grayImage (new BinaryBitmap(binarizer)); Ref<BinaryBitmap> grayImage (new BinaryBitmap(binarizer));
#ifdef DEBUG #ifdef DEBUG
@ -163,10 +175,11 @@ using namespace zxing;
for (int i = 0; !decoderResult && i < 4; i++) { for (int i = 0; !decoderResult && i < 4; i++) {
#endif #endif
for (FormatReader *reader in formatReaders) { for (FormatReader *reader in formatReaders) {
NSAutoreleasePool *secondarypool = [[NSAutoreleasePool alloc] init];
try { try {
#ifdef DEBUG #ifdef DEBUG
NSLog(@"decoding gray image"); NSLog(@"decoding gray image");
#endif #endif
Ref<Result> result([reader decode:grayImage]); Ref<Result> result([reader decode:grayImage]);
#ifdef DEBUG #ifdef DEBUG
NSLog(@"gray image decoded"); NSLog(@"gray image decoded");
@ -198,6 +211,7 @@ using namespace zxing;
} catch (...) { } catch (...) {
NSLog(@"Caught unknown exception!"); NSLog(@"Caught unknown exception!");
} }
[secondarypool release];
} }
#ifdef TRY_ROTATIONS #ifdef TRY_ROTATIONS
@ -226,15 +240,12 @@ using namespace zxing;
waitUntilDone:NO]; waitUntilDone:NO];
} }
} }
[pool drain];
#ifdef DEBUG #ifdef DEBUG
NSLog(@"finished decoding."); NSLog(@"finished decoding.");
#endif #endif
[mainpool release];
// if this is not the main thread, then we end it
if (![NSThread isMainThread]) {
[NSThread exit];
}
} }
- (void) decodeImage:(UIImage *)i { - (void) decodeImage:(UIImage *)i {
@ -249,17 +260,25 @@ using namespace zxing;
[self willDecodeImage]; [self willDecodeImage];
[self performSelectorOnMainThread:@selector(progressDecodingImage:) [self performSelectorOnMainThread:@selector(progressDecodingImage:)
withObject:NSLocalizedString(@"Decoder MessageWhileDecoding", @"Decoding ...") withObject:NSLocalizedString(@"Decoder MessageWhileDecoding", @"Decoding ...")
waitUntilDone:NO]; waitUntilDone:NO];
NSInvocationOperation *op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(decode:) object:nil];
[NSThread detachNewThreadSelector:@selector(decode:) [operationQueue addOperation:op];
[op release];
//[self performSelectorInBackground:@selector(decode:) withObject:nil];
//[self performSelector:@selector(decode:) onThread:decodingThread withObject:nil waitUntilDone:NO];
/*[NSThread detachNewThreadSelector:@selector(decode:)
toTarget:self toTarget:self
withObject:nil]; withObject:nil];*/
} }
- (void) dealloc { - (void) dealloc {
[image release]; [image release];
[subsetImage release]; [subsetImage release];
if (subsetData) free(subsetData); if (subsetData) free(subsetData);
[operationQueue release];
[super dealloc]; [super dealloc];
} }

View file

@ -23,15 +23,15 @@
@protocol ZXingDelegate; @protocol ZXingDelegate;
@interface ZXingWidgetController : UIImagePickerController <DecoderDelegate, CancelDelegate> { @interface ZXingWidgetController : UIImagePickerController <DecoderDelegate, CancelDelegate> {
ParsedResult *result; ParsedResult *result;
NSArray *actions; NSArray *actions;
OverlayView *overlayView; OverlayView *overlayView;
SystemSoundID beepSound; SystemSoundID beepSound;
BOOL showCancel; BOOL showCancel;
NSURL *soundToPlay; NSURL *soundToPlay;
id<ZXingDelegate> delegate; id<ZXingDelegate> delegate;
BOOL wasCancelled; BOOL wasCancelled;
BOOL oneDMode; BOOL oneDMode;
} }
@property (nonatomic, assign) id<ZXingDelegate> delegate; @property (nonatomic, assign) id<ZXingDelegate> delegate;
@ -48,4 +48,4 @@
@protocol ZXingDelegate @protocol ZXingDelegate
- (void)scanResult:(NSString *)result; - (void)scanResult:(NSString *)result;
- (void)cancelled; - (void)cancelled;
@end @end

View file

@ -33,192 +33,199 @@ CGImageRef UIGetScreenImage();
@synthesize result, actions, showCancel, delegate, soundToPlay, oneDMode; @synthesize result, actions, showCancel, delegate, soundToPlay, oneDMode;
- (id)initWithDelegate:(id<ZXingDelegate>)scanDelegate { - (id)initWithDelegate:(id<ZXingDelegate>)scanDelegate {
if (self = [super init]) { if (self = [super init]) {
[self setDelegate:scanDelegate]; [self setDelegate:scanDelegate];
beepSound = -1; beepSound = -1;
self.wantsFullScreenLayout = YES; self.wantsFullScreenLayout = YES;
self.sourceType = UIImagePickerControllerSourceTypeCamera; if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera])
float zoomFactor = CAMERA_SCALAR; self.sourceType = UIImagePickerControllerSourceTypeCamera;
if ([self fixedFocus]) { float zoomFactor = CAMERA_SCALAR;
zoomFactor *= 2.0; if ([self fixedFocus]) {
} zoomFactor *= 2.0;
self.cameraViewTransform = CGAffineTransformScale( }
self.cameraViewTransform, zoomFactor, zoomFactor); if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera])
overlayView = [OverlayView alloc]; self.cameraViewTransform = CGAffineTransformScale(
[overlayView setOneDMode:oneDMode]; self.cameraViewTransform, zoomFactor, zoomFactor);
overlayView = [overlayView initWithCancelEnabled:showCancel frame:[UIScreen mainScreen].bounds]; overlayView = [OverlayView alloc];
[overlayView setDelegate:self]; [overlayView setOneDMode:oneDMode];
self.sourceType = UIImagePickerControllerSourceTypeCamera; overlayView = [overlayView initWithCancelEnabled:showCancel frame:[UIScreen mainScreen].bounds];
self.showsCameraControls = NO; [overlayView setDelegate:self];
self.cameraOverlayView = overlayView; if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera])
self.allowsEditing = NO; // [[NSUserDefaults standardUserDefaults] boolForKey:@"allowEditing"]; {
} self.showsCameraControls = NO;
self.cameraOverlayView = overlayView;
return self; self.allowsEditing = NO; // [[NSUserDefaults standardUserDefaults] boolForKey:@"allowEditing"];
}
}
return self;
} }
- (void)dealloc { - (void)dealloc {
if (beepSound != -1) { if (beepSound != -1) {
AudioServicesDisposeSystemSoundID(beepSound); AudioServicesDisposeSystemSoundID(beepSound);
} }
[overlayView dealloc]; [overlayView dealloc];
[super dealloc]; [super dealloc];
} }
- (void)cancelled { - (void)cancelled {
NSLog(@"cancelled called in ZXingWidgetController"); NSLog(@"cancelled called in ZXingWidgetController");
wasCancelled = true; wasCancelled = true;
if (delegate != nil) { if (delegate != nil) {
[delegate cancelled]; [delegate cancelled];
} }
} }
- (NSString *)getPlatform { - (NSString *)getPlatform {
size_t size; size_t size;
sysctlbyname("hw.machine", NULL, &size, NULL, 0); sysctlbyname("hw.machine", NULL, &size, NULL, 0);
char *machine = malloc(size); char *machine = malloc(size);
sysctlbyname("hw.machine", machine, &size, NULL, 0); sysctlbyname("hw.machine", machine, &size, NULL, 0);
NSString *platform = [NSString stringWithCString:machine encoding:NSASCIIStringEncoding]; NSString *platform = [NSString stringWithCString:machine encoding:NSASCIIStringEncoding];
free(machine); free(machine);
return platform; return platform;
} }
- (BOOL)fixedFocus { - (BOOL)fixedFocus {
NSString *platform = [self getPlatform]; NSString *platform = [self getPlatform];
if ([platform isEqualToString:@"iPhone1,1"] || if ([platform isEqualToString:@"iPhone1,1"] ||
[platform isEqualToString:@"iPhone1,2"]) return true; [platform isEqualToString:@"iPhone1,2"]) return true;
return false; return false;
} }
- (void)viewWillAppear:(BOOL)animated { - (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated]; [super viewWillAppear:animated];
if ([self soundToPlay] != nil) { if ([self soundToPlay] != nil) {
OSStatus error = AudioServicesCreateSystemSoundID((CFURLRef)[self soundToPlay], &beepSound); OSStatus error = AudioServicesCreateSystemSoundID((CFURLRef)[self soundToPlay], &beepSound);
if (error != kAudioServicesNoError) { if (error != kAudioServicesNoError) {
NSLog(@"Problem loading nearSound.caf"); NSLog(@"Problem loading nearSound.caf");
} }
} }
} }
- (void)viewDidAppear:(BOOL)animated { - (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated]; [super viewDidAppear:animated];
[overlayView setPoints:nil]; [overlayView setPoints:nil];
wasCancelled = false; wasCancelled = false;
[NSTimer scheduledTimerWithTimeInterval: FIRST_TAKE_DELAY [NSTimer scheduledTimerWithTimeInterval: FIRST_TAKE_DELAY
target: self target: self
selector: @selector(takePicture:) selector: @selector(takePicture:)
userInfo: nil userInfo: nil
repeats: NO]; repeats: NO];
} }
- (CGImageRef)CGImageRotated90:(CGImageRef)imgRef - (CGImageRef)CGImageRotated90:(CGImageRef)imgRef
{ {
CGFloat angleInRadians = -90 * (M_PI / 180); CGFloat angleInRadians = -90 * (M_PI / 180);
CGFloat width = CGImageGetWidth(imgRef); CGFloat width = CGImageGetWidth(imgRef);
CGFloat height = CGImageGetHeight(imgRef); CGFloat height = CGImageGetHeight(imgRef);
CGRect imgRect = CGRectMake(0, 0, width, height); CGRect imgRect = CGRectMake(0, 0, width, height);
CGAffineTransform transform = CGAffineTransformMakeRotation(angleInRadians); CGAffineTransform transform = CGAffineTransformMakeRotation(angleInRadians);
CGRect rotatedRect = CGRectApplyAffineTransform(imgRect, transform); CGRect rotatedRect = CGRectApplyAffineTransform(imgRect, transform);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef bmContext = CGBitmapContextCreate(NULL, CGContextRef bmContext = CGBitmapContextCreate(NULL,
rotatedRect.size.width, rotatedRect.size.width,
rotatedRect.size.height, rotatedRect.size.height,
8, 8,
0, 0,
colorSpace, colorSpace,
kCGImageAlphaPremultipliedFirst); kCGImageAlphaPremultipliedFirst);
CGContextSetAllowsAntialiasing(bmContext, FALSE); CGContextSetAllowsAntialiasing(bmContext, FALSE);
CGContextSetInterpolationQuality(bmContext, kCGInterpolationNone); CGContextSetInterpolationQuality(bmContext, kCGInterpolationNone);
CGColorSpaceRelease(colorSpace); CGColorSpaceRelease(colorSpace);
// CGContextTranslateCTM(bmContext, // CGContextTranslateCTM(bmContext,
// +(rotatedRect.size.width/2), // +(rotatedRect.size.width/2),
// +(rotatedRect.size.height/2)); // +(rotatedRect.size.height/2));
CGContextScaleCTM(bmContext, rotatedRect.size.width/rotatedRect.size.height, 1.0); CGContextScaleCTM(bmContext, rotatedRect.size.width/rotatedRect.size.height, 1.0);
CGContextTranslateCTM(bmContext, 0.0, rotatedRect.size.height); CGContextTranslateCTM(bmContext, 0.0, rotatedRect.size.height);
CGContextRotateCTM(bmContext, angleInRadians); CGContextRotateCTM(bmContext, angleInRadians);
// CGContextTranslateCTM(bmContext, // CGContextTranslateCTM(bmContext,
// -(rotatedRect.size.width/2), // -(rotatedRect.size.width/2),
// -(rotatedRect.size.height/2)); // -(rotatedRect.size.height/2));
CGContextDrawImage(bmContext, CGRectMake(0, 0, CGContextDrawImage(bmContext, CGRectMake(0, 0,
rotatedRect.size.width, rotatedRect.size.width,
rotatedRect.size.height), rotatedRect.size.height),
imgRef); imgRef);
CGImageRef rotatedImage = CGBitmapContextCreateImage(bmContext); CGImageRef rotatedImage = CGBitmapContextCreateImage(bmContext);
CFRelease(bmContext); CFRelease(bmContext);
[(id)rotatedImage autorelease]; [(id)rotatedImage autorelease];
return rotatedImage; return rotatedImage;
} }
- (CGImageRef)CGImageRotated180:(CGImageRef)imgRef - (CGImageRef)CGImageRotated180:(CGImageRef)imgRef
{ {
CGFloat angleInRadians = M_PI; CGFloat angleInRadians = M_PI;
CGFloat width = CGImageGetWidth(imgRef); CGFloat width = CGImageGetWidth(imgRef);
CGFloat height = CGImageGetHeight(imgRef); CGFloat height = CGImageGetHeight(imgRef);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef bmContext = CGBitmapContextCreate(NULL, CGContextRef bmContext = CGBitmapContextCreate(NULL,
width, width,
height, height,
8, 8,
0, 0,
colorSpace, colorSpace,
kCGImageAlphaPremultipliedFirst); kCGImageAlphaPremultipliedFirst);
CGContextSetAllowsAntialiasing(bmContext, FALSE); CGContextSetAllowsAntialiasing(bmContext, FALSE);
CGContextSetInterpolationQuality(bmContext, kCGInterpolationNone); CGContextSetInterpolationQuality(bmContext, kCGInterpolationNone);
CGColorSpaceRelease(colorSpace); CGColorSpaceRelease(colorSpace);
CGContextTranslateCTM(bmContext, CGContextTranslateCTM(bmContext,
+(width/2), +(width/2),
+(height/2)); +(height/2));
CGContextRotateCTM(bmContext, angleInRadians); CGContextRotateCTM(bmContext, angleInRadians);
CGContextTranslateCTM(bmContext, CGContextTranslateCTM(bmContext,
-(width/2), -(width/2),
-(height/2)); -(height/2));
CGContextDrawImage(bmContext, CGRectMake(0, 0, width, height), imgRef); CGContextDrawImage(bmContext, CGRectMake(0, 0, width, height), imgRef);
CGImageRef rotatedImage = CGBitmapContextCreateImage(bmContext); CGImageRef rotatedImage = CGBitmapContextCreateImage(bmContext);
CFRelease(bmContext); CFRelease(bmContext);
[(id)rotatedImage autorelease]; [(id)rotatedImage autorelease];
return rotatedImage; return rotatedImage;
} }
- (void)takePicture:(NSTimer*)theTimer { - (void)takePicture:(NSTimer*)theTimer {
CGImageRef capture = UIGetScreenImage(); CGImageRef capture = UIGetScreenImage();
CGRect cropRect = [overlayView cropRect]; CGRect cropRect = [overlayView cropRect];
if (oneDMode) { if (oneDMode) {
// let's just give the decoder a vertical band right above the red line // let's just give the decoder a vertical band right above the red line
cropRect.origin.x = cropRect.origin.x + (cropRect.size.width / 2) - (ONE_D_BAND_HEIGHT + 1); cropRect.origin.x = cropRect.origin.x + (cropRect.size.width / 2) - (ONE_D_BAND_HEIGHT + 1);
cropRect.size.width = ONE_D_BAND_HEIGHT; cropRect.size.width = ONE_D_BAND_HEIGHT;
// do a rotate // do a rotate
CGImageRef croppedImg = CGImageCreateWithImageInRect(capture, cropRect); CGImageRef croppedImg = CGImageCreateWithImageInRect(capture, cropRect);
CGImageRelease(capture); capture = [self CGImageRotated90:croppedImg];
capture = [self CGImageRotated90:croppedImg]; capture = [self CGImageRotated180:capture];
capture = [self CGImageRotated180:capture]; // UIImageWriteToSavedPhotosAlbum([UIImage imageWithCGImage:capture], nil, nil, nil);
// UIImageWriteToSavedPhotosAlbum([UIImage imageWithCGImage:capture], nil, nil, nil); CGImageRelease(croppedImg);
CGImageRelease(croppedImg); cropRect.origin.x = 0.0;
cropRect.origin.x = 0.0; cropRect.origin.y = 0.0;
cropRect.origin.y = 0.0; cropRect.size.width = CGImageGetWidth(capture);
cropRect.size.width = CGImageGetWidth(capture); cropRect.size.height = CGImageGetHeight(capture);
cropRect.size.height = CGImageGetHeight(capture); }
} CGImageRef newImage = CGImageCreateWithImageInRect(capture, cropRect);
CGImageRelease(capture);
UIImage *scrn = [UIImage imageWithCGImage:CGImageCreateWithImageInRect(capture, cropRect)]; //UIImage *scrn = [UIImage imageWithCGImage:newImage];
Decoder *d = [[Decoder alloc] init]; UIImage *scrn = [[UIImage alloc] initWithCGImage:newImage];
d.delegate = self; CGImageRelease(newImage);
cropRect.origin.x = 0.0; Decoder *d = [[Decoder alloc] init];
cropRect.origin.y = 0.0; d.delegate = self;
[d decodeImage:scrn cropRect:cropRect]; cropRect.origin.x = 0.0;
cropRect.origin.y = 0.0;
[d decodeImage:scrn cropRect:cropRect];
[scrn release];
} }
// DecoderDelegate methods // DecoderDelegate methods
- (void)decoder:(Decoder *)decoder willDecodeImage:(UIImage *)image usingSubset:(UIImage *)subset{ - (void)decoder:(Decoder *)decoder willDecodeImage:(UIImage *)image usingSubset:(UIImage *)subset{
#ifdef DEBUG #ifdef DEBUG
NSLog(@"DecoderViewController MessageWhileDecodingWithDimensions: Decoding image (%.0fx%.0f) ...", image.size.width, image.size.height); NSLog(@"DecoderViewController MessageWhileDecodingWithDimensions: Decoding image (%.0fx%.0f) ...", image.size.width, image.size.height);
#endif #endif
} }
@ -229,48 +236,48 @@ CGImageRef UIGetScreenImage();
} }
- (void)presentResultForString:(NSString *)resultString { - (void)presentResultForString:(NSString *)resultString {
self.result = [ResultParser parsedResultForString:resultString]; self.result = [ResultParser parsedResultForString:resultString];
if (beepSound != -1) { if (beepSound != -1) {
AudioServicesPlaySystemSound(beepSound); AudioServicesPlaySystemSound(beepSound);
} }
#ifdef DEBUG #ifdef DEBUG
NSLog(@"result string = %@", resultString); NSLog(@"result string = %@", resultString);
NSLog(@"result has %d actions", actions ? 0 : actions.count); NSLog(@"result has %d actions", actions ? 0 : actions.count);
#endif #endif
// [self updateToolbar]; // [self updateToolbar];
} }
- (void)presentResultPoints:(NSArray *)resultPoints - (void)presentResultPoints:(NSArray *)resultPoints
forImage:(UIImage *)image forImage:(UIImage *)image
usingSubset:(UIImage *)subset { usingSubset:(UIImage *)subset {
// simply add the points to the image view // simply add the points to the image view
[overlayView setPoints:resultPoints]; [overlayView setPoints:resultPoints];
} }
- (void)decoder:(Decoder *)decoder didDecodeImage:(UIImage *)image usingSubset:(UIImage *)subset withResult:(TwoDDecoderResult *)twoDResult { - (void)decoder:(Decoder *)decoder didDecodeImage:(UIImage *)image usingSubset:(UIImage *)subset withResult:(TwoDDecoderResult *)twoDResult {
[self presentResultForString:[twoDResult text]]; [self presentResultForString:[twoDResult text]];
[self presentResultPoints:[twoDResult points] forImage:image usingSubset:subset]; [self presentResultPoints:[twoDResult points] forImage:image usingSubset:subset];
// now, in a selector, call the delegate to give this overlay time to show the points // now, in a selector, call the delegate to give this overlay time to show the points
[self performSelector:@selector(alertDelegate:) withObject:[[twoDResult text] copy] afterDelay:1.0]; [self performSelector:@selector(alertDelegate:) withObject:[[twoDResult text] copy] afterDelay:1.0];
decoder.delegate = nil; decoder.delegate = nil;
[decoder release]; [decoder release];
} }
- (void)alertDelegate:(id)text { - (void)alertDelegate:(id)text {
if (delegate != nil) { if (delegate != nil) {
[delegate scanResult:text]; [delegate scanResult:text];
} }
} }
- (void)decoder:(Decoder *)decoder failedToDecodeImage:(UIImage *)image usingSubset:(UIImage *)subset reason:(NSString *)reason { - (void)decoder:(Decoder *)decoder failedToDecodeImage:(UIImage *)image usingSubset:(UIImage *)subset reason:(NSString *)reason {
decoder.delegate = nil; decoder.delegate = nil;
[decoder release]; [decoder release];
[overlayView setPoints:nil]; [overlayView setPoints:nil];
if (!wasCancelled) { if (!wasCancelled) {
[self takePicture:nil]; [self takePicture:nil];
} }
//[self updateToolbar]; //[self updateToolbar];
} }
@end @end

View file

@ -54,6 +54,7 @@
[parts addObject:[NSString stringWithFormat:NSLocalizedString(@"EmailParsedResult Display: Body", @"%@"), self.body]]; [parts addObject:[NSString stringWithFormat:NSLocalizedString(@"EmailParsedResult Display: Body", @"%@"), self.body]];
} }
return [parts componentsJoinedByString:@"\n"]; return [parts componentsJoinedByString:@"\n"];
[parts release];
} }
+ (NSString *)typeName { + (NSString *)typeName {

View file

@ -461,22 +461,6 @@
children = ( children = (
E53458B311987396000CB77F /* CoreSrc */, E53458B311987396000CB77F /* CoreSrc */,
08FB77AEFE84172EC02AAC07 /* Classes */, 08FB77AEFE84172EC02AAC07 /* Classes */,
1F027FB711A7BEBF006B06DE /* TwoDDecoderResult.h */,
1F027FB811A7BEBF006B06DE /* TwoDDecoderResult.m */,
1F027FB911A7BEBF006B06DE /* ZXingWidgetController.h */,
1F027FBA11A7BEBF006B06DE /* ZXingWidgetController.m */,
1F027F9F11A7BEAF006B06DE /* Decoder.h */,
1F027FA011A7BEAF006B06DE /* Decoder.mm */,
1F027FA111A7BEAF006B06DE /* DecoderDelegate.h */,
1F027FA211A7BEAF006B06DE /* FormatReader.h */,
1F027FA311A7BEAF006B06DE /* FormatReader.mm */,
1F027FA411A7BEAF006B06DE /* GrayBytesMonochromeBitmapSource.cpp */,
1F027FA511A7BEAF006B06DE /* GrayBytesMonochromeBitmapSource.h */,
1F027FA611A7BEAF006B06DE /* MultiFormatReader.mm */,
1F027FA711A7BEAF006B06DE /* NSString+HTML.h */,
1F027FA811A7BEAF006B06DE /* NSString+HTML.m */,
1F027FA911A7BEAF006B06DE /* OverlayView.h */,
1F027FAA11A7BEAF006B06DE /* OverlayView.m */,
32C88DFF0371C24200C91783 /* Other Sources */, 32C88DFF0371C24200C91783 /* Other Sources */,
0867D69AFE84028FC02AAC07 /* Frameworks */, 0867D69AFE84028FC02AAC07 /* Frameworks */,
E5345D2811999F53000CB77F /* Resources */, E5345D2811999F53000CB77F /* Resources */,
@ -499,6 +483,22 @@
08FB77AEFE84172EC02AAC07 /* Classes */ = { 08FB77AEFE84172EC02AAC07 /* Classes */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
1F027FB711A7BEBF006B06DE /* TwoDDecoderResult.h */,
1F027FB811A7BEBF006B06DE /* TwoDDecoderResult.m */,
1F027FB911A7BEBF006B06DE /* ZXingWidgetController.h */,
1F027FBA11A7BEBF006B06DE /* ZXingWidgetController.m */,
1F027F9F11A7BEAF006B06DE /* Decoder.h */,
1F027FA011A7BEAF006B06DE /* Decoder.mm */,
1F027FA111A7BEAF006B06DE /* DecoderDelegate.h */,
1F027FA211A7BEAF006B06DE /* FormatReader.h */,
1F027FA311A7BEAF006B06DE /* FormatReader.mm */,
1F027FA411A7BEAF006B06DE /* GrayBytesMonochromeBitmapSource.cpp */,
1F027FA511A7BEAF006B06DE /* GrayBytesMonochromeBitmapSource.h */,
1F027FA611A7BEAF006B06DE /* MultiFormatReader.mm */,
1F027FA711A7BEAF006B06DE /* NSString+HTML.h */,
1F027FA811A7BEAF006B06DE /* NSString+HTML.m */,
1F027FA911A7BEAF006B06DE /* OverlayView.h */,
1F027FAA11A7BEAF006B06DE /* OverlayView.m */,
E5345A00119876A5000CB77F /* Actions */, E5345A00119876A5000CB77F /* Actions */,
E53459EF119876A5000CB77F /* ParsedResults */, E53459EF119876A5000CB77F /* ParsedResults */,
E53459D4119876A5000CB77F /* ResultParsers */, E53459D4119876A5000CB77F /* ResultParsers */,
@ -1144,7 +1144,7 @@
IPHONEOS_DEPLOYMENT_TARGET = 3.1.3; IPHONEOS_DEPLOYMENT_TARGET = 3.1.3;
OTHER_LDFLAGS = "-ObjC"; OTHER_LDFLAGS = "-ObjC";
PREBINDING = NO; PREBINDING = NO;
SDKROOT = iphoneos3.1.3; SDKROOT = iphoneos4.0;
}; };
name = Debug; name = Debug;
}; };
@ -1158,7 +1158,7 @@
IPHONEOS_DEPLOYMENT_TARGET = 3.1.3; IPHONEOS_DEPLOYMENT_TARGET = 3.1.3;
OTHER_LDFLAGS = "-ObjC"; OTHER_LDFLAGS = "-ObjC";
PREBINDING = NO; PREBINDING = NO;
SDKROOT = iphoneos3.1.3; SDKROOT = iphoneos4.0;
}; };
name = Release; name = Release;
}; };