mirror of
https://github.com/zxing/zxing.git
synced 2024-11-14 23:14:09 -08:00
505af10197
Fixed up some memory issues. git-svn-id: https://zxing.googlecode.com/svn/trunk@1334 59b500cc-1b3d-0410-9834-0bbf25fbcc57
119 lines
3.3 KiB
Objective-C
119 lines
3.3 KiB
Objective-C
//
|
|
// ScannedImageView.m
|
|
// ZXing
|
|
//
|
|
// Created by Christian Brunschen on 01/07/2008.
|
|
/*
|
|
* Copyright 2008 ZXing authors
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
#import "ScannedImageView.h"
|
|
#import <math.h>
|
|
|
|
@implementation ScannedImageView
|
|
|
|
- (id)initWithFrame:(CGRect)frame {
|
|
if ((self = [super initWithFrame:frame])) {
|
|
resultPoints = [[NSMutableArray alloc] initWithCapacity:10];
|
|
}
|
|
return self;
|
|
}
|
|
|
|
- (id)initWithCoder:(NSCoder *)decoder {
|
|
if ((self = [super initWithCoder:decoder]) != nil) {
|
|
resultPoints = [[NSMutableArray alloc] initWithCapacity:10];
|
|
}
|
|
return self;
|
|
}
|
|
|
|
- (void)drawRect:(CGRect)rect {
|
|
[super drawRect:rect];
|
|
|
|
if (image) {
|
|
// draw the image, scaled to fit, top and center
|
|
CGSize imageSize = image.size;
|
|
CGRect bounds = [self bounds];
|
|
double imageScale = fminf(bounds.size.width / imageSize.width,
|
|
bounds.size.height / imageSize.height);
|
|
double dx = (bounds.size.width - imageSize.width * imageScale) / 2.0;
|
|
double dy = 0.0;
|
|
|
|
CGContextRef ctx = UIGraphicsGetCurrentContext();
|
|
CGContextSetInterpolationQuality(ctx, kCGInterpolationDefault);
|
|
CGRect imageRect = CGRectMake(dx, dy,
|
|
imageSize.width * imageScale,
|
|
imageSize.height * imageScale);
|
|
[image drawInRect:imageRect];
|
|
|
|
[[UIColor greenColor] set];
|
|
|
|
if (resultPoints && [resultPoints count]) {
|
|
#define R 4.0
|
|
if ([resultPoints count] == 2) {
|
|
CGPoint p0 = [[resultPoints objectAtIndex:0] CGPointValue];
|
|
CGPoint p1 = [[resultPoints objectAtIndex:1] CGPointValue];
|
|
CGContextMoveToPoint(ctx, dx + p0.x * imageScale, dy + p0.y * imageScale);
|
|
CGContextAddLineToPoint(ctx, dx + p1.x * imageScale, dy + p1.y * imageScale);
|
|
CGContextSetLineWidth(ctx, 4.0);
|
|
CGContextSetLineCap(ctx, kCGLineCapSquare);
|
|
CGContextStrokePath(ctx);
|
|
} else {
|
|
// for each resultPoint, draw it
|
|
for (NSValue *pointValue in resultPoints) {
|
|
CGPoint resultPoint = [pointValue CGPointValue];
|
|
float px = dx + resultPoint.x * imageScale;
|
|
float py = dy + resultPoint.y * imageScale;
|
|
CGContextAddRect(ctx,
|
|
CGRectMake(px - R, py - R, 2 * R, 2 * R));
|
|
}
|
|
CGContextFillPath(ctx);
|
|
}
|
|
CGContextFlush(ctx);
|
|
#undef R
|
|
}
|
|
}
|
|
}
|
|
|
|
- (void) addResultPoint:(CGPoint)p {
|
|
[resultPoints addObject:[NSValue valueWithCGPoint:p]];
|
|
[self setNeedsDisplay];
|
|
}
|
|
|
|
- (void) clearResultPoints {
|
|
[resultPoints removeAllObjects];
|
|
}
|
|
|
|
- (void) setImage:(UIImage *)newImage {
|
|
[newImage retain];
|
|
[image release];
|
|
image = newImage;
|
|
[self clearResultPoints];
|
|
[self setNeedsDisplay];
|
|
}
|
|
|
|
- (UIImage *)image {
|
|
return image;
|
|
}
|
|
|
|
|
|
- (void)dealloc {
|
|
[image release];
|
|
[resultPoints release];
|
|
[super dealloc];
|
|
}
|
|
|
|
|
|
@end
|