├── .gitignore ├── .gitmodules ├── Classes ├── DLCBlurOverlayView.h ├── DLCBlurOverlayView.m ├── DLCGrayscaleContrastFilter.h ├── DLCGrayscaleContrastFilter.m ├── DLCImagePickerController.h ├── DLCImagePickerController.m ├── PhotoViewController.h └── PhotoViewController.m ├── DLCImagePickerController.podspec ├── DLCImagePickerController.xcodeproj └── project.pbxproj ├── DLCImagePickerController ├── AppDelegate.h ├── AppDelegate.m ├── DLCImagePickerController-Info.plist ├── DLCImagePickerController-Prefix.pch ├── en.lproj │ └── InfoPlist.strings └── main.m ├── Default-568h@2x.png ├── Images ├── FilterSamples │ ├── 1.jpg │ ├── 10.jpg │ ├── 10@2x.jpg │ ├── 1@2x.jpg │ ├── 2.jpg │ ├── 2@2x.jpg │ ├── 3.jpg │ ├── 3@2x.jpg │ ├── 4.jpg │ ├── 4@2x.jpg │ ├── 5.jpg │ ├── 5@2x.jpg │ ├── 6.jpg │ ├── 6@2x.jpg │ ├── 7.jpg │ ├── 7@2x.jpg │ ├── 8.jpg │ ├── 8@2x.jpg │ ├── 9.jpg │ └── 9@2x.jpg ├── Overlays │ ├── blackframe.png │ └── mask.png ├── Samples │ └── sample1.jpg └── UI │ ├── blur-on.png │ ├── blur-on@2x.png │ ├── blur.png │ ├── blur@2x.png │ ├── camera-button.png │ ├── camera-button@2x.png │ ├── camera-icon.png │ ├── camera-icon@2x.png │ ├── close.png │ ├── close@2x.png │ ├── dock_bg.png │ ├── dock_bg@2x.png │ ├── filter-close.png │ ├── filter-close@2x.png │ ├── filter-open.png │ ├── filter-open@2x.png │ ├── filter.png │ ├── filter@2x.png │ ├── flash-auto.png │ ├── flash-auto@2x.png │ ├── flash-off.png │ ├── flash-off@2x.png │ ├── flash.png │ ├── flash@2x.png │ ├── focus-crosshair.png │ ├── focus-crosshair@2x.png │ ├── front-camera.png │ ├── front-camera@2x.png │ ├── library.png │ ├── library@2x.png │ ├── micro_carbon.png │ ├── micro_carbon@2x.png │ ├── photo_bar.png │ └── photo_bar@2x.png ├── LICENSE ├── README.md └── Resources ├── DLCImagePicker.xib └── Filters ├── 02.acv ├── 06.acv ├── 17.acv ├── aqua.acv ├── crossprocess.acv ├── purple-green.acv └── yellow-red.acv /.gitignore: -------------------------------------------------------------------------------- 1 | DLCImagePickerController.xcodeproj/xcuserdata 2 | DLCImagePickerController.xcodeproj/project.xcworkspace 3 | .DS_Store 4 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "GPUImage"] 2 | path = GPUImage 3 | url = git://github.com/BradLarson/GPUImage.git 4 | -------------------------------------------------------------------------------- /Classes/DLCBlurOverlayView.h: -------------------------------------------------------------------------------- 1 | // 2 | // DLCBlurOverlayView.h 3 | // Backspaces 4 | // 5 | // Created by Dmitri Cherniak on 11/18/12. 6 | // Copyright (c) 2012 DLC Inc. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface DLCBlurOverlayView : UIView 12 | 13 | @property (nonatomic, assign) CGFloat radius; 14 | @property (nonatomic, assign) CGPoint circleCenter; 15 | 16 | @end 17 | -------------------------------------------------------------------------------- /Classes/DLCBlurOverlayView.m: -------------------------------------------------------------------------------- 1 | // 2 | // DLCBlurOverlayView.m 3 | // Backspaces 4 | // 5 | // Created by Dmitri Cherniak on 11/18/12. 6 | // Copyright (c) 2012 DLC Inc. All rights reserved. 7 | // 8 | 9 | #import "DLCBlurOverlayView.h" 10 | 11 | @implementation DLCBlurOverlayView { 12 | CGRect holeRect; 13 | } 14 | 15 | - (id)initWithFrame:(CGRect)frame 16 | { 17 | self = [super initWithFrame:frame]; 18 | if (self) { 19 | _radius = 80.0f; 20 | // Initialization code 21 | self.userInteractionEnabled = NO; 22 | self.opaque = NO; 23 | CGPoint center = CGPointMake(CGRectGetMidX(frame),CGRectGetMidY(frame)); 24 | holeRect = CGRectMake(center.x-self.radius, center.y-self.radius, self.radius*2, self.radius*2); 25 | } 26 | return self; 27 | } 28 | 29 | -(void) setCircleCenter:(CGPoint)circleCenter{ 30 | _circleCenter = circleCenter; 31 | holeRect = CGRectMake(circleCenter.x-self.radius, circleCenter.y-self.radius, 32 | self.radius*2, 33 | self.radius*2); 34 | [self setNeedsDisplay]; 35 | } 36 | 37 | -(void) setRadius:(CGFloat)radius{ 38 | _radius = radius; 39 | CGPoint center = CGPointMake(CGRectGetMidX(holeRect),CGRectGetMidY(holeRect)); 40 | holeRect = CGRectMake(center.x-self.radius, center.y-self.radius, 41 | self.radius*2, 42 | self.radius*2); 43 | [self setNeedsDisplay]; 44 | } 45 | 46 | - (void)drawRect:(CGRect)rect { 47 | CGContextRef context = UIGraphicsGetCurrentContext(); 48 | size_t numLocations = 2; 49 | CGFloat locations[2] = {0.0, 1.0}; 50 | CGFloat components[8] = {1.0,1.0,1.0, 0.0, 51 | 1.0, 1.0, 1.0, 1.0}; 52 | 53 | CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 54 | CGGradientRef gradient = CGGradientCreateWithColorComponents(colorSpace, 55 | components, 56 | locations, 57 | numLocations); 58 | CGPoint center = CGPointMake(CGRectGetMidX(holeRect),CGRectGetMidY(holeRect)); 59 | CGContextDrawRadialGradient(context, gradient, center, 60 | self.radius - 25.0, center, self.radius, 61 | kCGGradientDrawsAfterEndLocation); 62 | CGColorSpaceRelease(colorSpace); 63 | CGGradientRelease(gradient); 64 | } 65 | 66 | 67 | @end 68 | -------------------------------------------------------------------------------- /Classes/DLCGrayscaleContrastFilter.h: -------------------------------------------------------------------------------- 1 | #import "GPUImageFilter.h" 2 | 3 | extern NSString *const kGrayscaleContrastFragmentShaderString; 4 | 5 | /** Converts an image to grayscale (a slightly faster implementation of the saturation filter, without the ability to vary the color contribution) 6 | */ 7 | @interface DLCGrayscaleContrastFilter : GPUImageFilter 8 | { 9 | GLint intensityUniform; 10 | GLint slopeUniform; 11 | } 12 | 13 | @property(readwrite, nonatomic) CGFloat intensity; 14 | 15 | @end 16 | -------------------------------------------------------------------------------- /Classes/DLCGrayscaleContrastFilter.m: -------------------------------------------------------------------------------- 1 | #import "DLCGrayscaleContrastFilter.h" 2 | 3 | @implementation DLCGrayscaleContrastFilter 4 | 5 | NSString *const kGrayscaleContrastFragmentShaderString = SHADER_STRING 6 | ( 7 | precision highp float; 8 | 9 | varying vec2 textureCoordinate; 10 | 11 | uniform sampler2D inputImageTexture; 12 | 13 | uniform lowp float intensity; 14 | 15 | const highp vec3 W = vec3(0.2125, 0.7154, 0.0721); 16 | 17 | void main() 18 | { 19 | float luminance = dot(texture2D(inputImageTexture, textureCoordinate).rgb, W); 20 | 21 | lowp vec4 desat = vec4(vec3(luminance), 1.0); 22 | 23 | // scale pixel value away from 0.5 by a factor of intensity 24 | lowp vec4 outputColor = vec4( 25 | (desat.r < 0.5 ? (0.5 - intensity * (0.5 - desat.r)) : (0.5 + intensity * (desat.r - 0.5))), 26 | (desat.g < 0.5 ? (0.5 - intensity * (0.5 - desat.g)) : (0.5 + intensity * (desat.g - 0.5))), 27 | (desat.b < 0.5 ? (0.5 - intensity * (0.5 - desat.b)) : (0.5 + intensity * (desat.b - 0.5))), 28 | 1.0 29 | ); 30 | 31 | gl_FragColor = outputColor; 32 | } 33 | ); 34 | 35 | #pragma mark - 36 | #pragma mark Initialization and teardown 37 | 38 | @synthesize intensity = _intensity; 39 | 40 | - (id)init; 41 | { 42 | if (!(self = [super initWithFragmentShaderFromString:kGrayscaleContrastFragmentShaderString])) 43 | { 44 | return nil; 45 | } 46 | 47 | intensityUniform = [filterProgram uniformIndex:@"intensity"]; 48 | 49 | self.intensity = 1.5; 50 | return self; 51 | } 52 | 53 | #pragma mark - 54 | #pragma mark Accessors 55 | 56 | - (void)setIntensity:(CGFloat)newValue; 57 | { 58 | _intensity = newValue; 59 | 60 | [self setFloat:_intensity forUniform:intensityUniform program:filterProgram]; 61 | } 62 | 63 | @end -------------------------------------------------------------------------------- /Classes/DLCImagePickerController.h: -------------------------------------------------------------------------------- 1 | // 2 | // DLCImagePickerController.h 3 | // DLCImagePickerController 4 | // 5 | // Created by Dmitri Cherniak on 8/14/12. 6 | // Copyright (c) 2012 Dmitri Cherniak. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "GPUImage.h" 11 | #import "DLCBlurOverlayView.h" 12 | 13 | @class DLCImagePickerController; 14 | 15 | @protocol DLCImagePickerDelegate 16 | @optional 17 | - (void)imagePickerController:(DLCImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info; 18 | - (void)imagePickerControllerDidCancel:(DLCImagePickerController *)picker; 19 | @end 20 | 21 | @interface DLCImagePickerController : UIViewController 22 | 23 | @property (nonatomic, weak) IBOutlet GPUImageView *imageView; 24 | @property (nonatomic, weak) id delegate; 25 | @property (nonatomic, weak) IBOutlet UIButton *photoCaptureButton; 26 | @property (nonatomic, weak) IBOutlet UIButton *cancelButton; 27 | 28 | @property (nonatomic, weak) IBOutlet UIButton *cameraToggleButton; 29 | @property (nonatomic, weak) IBOutlet UIButton *blurToggleButton; 30 | @property (nonatomic, weak) IBOutlet UIButton *filtersToggleButton; 31 | @property (nonatomic, weak) IBOutlet UIButton *libraryToggleButton; 32 | @property (nonatomic, weak) IBOutlet UIButton *flashToggleButton; 33 | @property (nonatomic, weak) IBOutlet UIButton *retakeButton; 34 | 35 | @property (nonatomic, weak) IBOutlet UIScrollView *filterScrollView; 36 | @property (nonatomic, weak) IBOutlet UIImageView *filtersBackgroundImageView; 37 | @property (nonatomic, weak) IBOutlet UIView *photoBar; 38 | @property (nonatomic, weak) IBOutlet UIView *topBar; 39 | @property (nonatomic, strong) DLCBlurOverlayView *blurOverlayView; 40 | @property (nonatomic, strong) UIImageView *focusView; 41 | 42 | @property (nonatomic, assign) CGFloat outputJPEGQuality; 43 | @property (nonatomic, assign) CGSize requestedImageSize; 44 | 45 | @end 46 | -------------------------------------------------------------------------------- /Classes/DLCImagePickerController.m: -------------------------------------------------------------------------------- 1 | // 2 | // DLCImagePickerController.m 3 | // DLCImagePickerController 4 | // 5 | // Created by Dmitri Cherniak on 8/14/12. 6 | // Copyright (c) 2012 Dmitri Cherniak. All rights reserved. 7 | // 8 | 9 | #import "DLCImagePickerController.h" 10 | #import "DLCGrayscaleContrastFilter.h" 11 | 12 | #define kStaticBlurSize 2.0f 13 | 14 | @implementation DLCImagePickerController { 15 | GPUImageStillCamera *stillCamera; 16 | GPUImageOutput *filter; 17 | GPUImageOutput *blurFilter; 18 | GPUImageCropFilter *cropFilter; 19 | GPUImagePicture *staticPicture; 20 | UIImageOrientation staticPictureOriginalOrientation; 21 | BOOL isStatic; 22 | BOOL hasBlur; 23 | int selectedFilter; 24 | dispatch_once_t showLibraryOnceToken; 25 | } 26 | 27 | @synthesize delegate, 28 | imageView, 29 | cameraToggleButton, 30 | photoCaptureButton, 31 | blurToggleButton, 32 | flashToggleButton, 33 | cancelButton, 34 | retakeButton, 35 | filtersToggleButton, 36 | libraryToggleButton, 37 | filterScrollView, 38 | filtersBackgroundImageView, 39 | photoBar, 40 | topBar, 41 | blurOverlayView, 42 | outputJPEGQuality, 43 | requestedImageSize; 44 | 45 | -(void) sharedInit { 46 | outputJPEGQuality = 1.0; 47 | requestedImageSize = CGSizeZero; 48 | } 49 | 50 | -(id) initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { 51 | self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 52 | if (self) { 53 | [self sharedInit]; 54 | } 55 | return self; 56 | } 57 | 58 | -(id) initWithCoder:(NSCoder *)aDecoder { 59 | self = [super initWithCoder:aDecoder]; 60 | if (self) { 61 | [self sharedInit]; 62 | } 63 | return self; 64 | } 65 | 66 | -(id) init { 67 | return [self initWithNibName:@"DLCImagePicker" bundle:nil]; 68 | } 69 | 70 | -(void)viewDidLoad { 71 | 72 | [super viewDidLoad]; 73 | self.wantsFullScreenLayout = YES; 74 | //set background color 75 | self.view.backgroundColor = [UIColor colorWithPatternImage: 76 | [UIImage imageNamed:@"micro_carbon"]]; 77 | 78 | self.photoBar.backgroundColor = [UIColor colorWithPatternImage: 79 | [UIImage imageNamed:@"photo_bar"]]; 80 | 81 | self.topBar.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"photo_bar"]]; 82 | //button states 83 | [self.blurToggleButton setSelected:NO]; 84 | [self.filtersToggleButton setSelected:NO]; 85 | 86 | staticPictureOriginalOrientation = UIImageOrientationUp; 87 | 88 | self.focusView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"focus-crosshair"]]; 89 | [self.view addSubview:self.focusView]; 90 | self.focusView.alpha = 0; 91 | 92 | 93 | self.blurOverlayView = [[DLCBlurOverlayView alloc] initWithFrame:CGRectMake(0, 0, 94 | self.imageView.frame.size.width, 95 | self.imageView.frame.size.height)]; 96 | self.blurOverlayView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; 97 | self.blurOverlayView.alpha = 0; 98 | [self.imageView addSubview:self.blurOverlayView]; 99 | 100 | hasBlur = NO; 101 | 102 | [self loadFilters]; 103 | 104 | //we need a crop filter for the live video 105 | cropFilter = [[GPUImageCropFilter alloc] initWithCropRegion:CGRectMake(0.0f, 0.0f, 1.0f, 0.75f)]; 106 | 107 | filter = [[GPUImageFilter alloc] init]; 108 | 109 | dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ 110 | [self setUpCamera]; 111 | }); 112 | } 113 | 114 | -(void) viewWillAppear:(BOOL)animated { 115 | [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationSlide]; 116 | [super viewWillAppear:animated]; 117 | } 118 | 119 | -(void) viewDidAppear:(BOOL)animated { 120 | [super viewDidAppear:animated]; 121 | if (![UIImagePickerController isSourceTypeAvailable: UIImagePickerControllerSourceTypeCamera]) { 122 | dispatch_once(&showLibraryOnceToken, ^{ 123 | [self switchToLibrary:nil]; 124 | }); 125 | } 126 | } 127 | 128 | -(void) loadFilters { 129 | for(int i = 0; i < 10; i++) { 130 | UIButton * button = [UIButton buttonWithType:UIButtonTypeCustom]; 131 | [button setBackgroundImage:[UIImage imageNamed:[NSString stringWithFormat:@"%d.jpg", i + 1]] forState:UIControlStateNormal]; 132 | button.frame = CGRectMake(10+i*(60+10), 5.0f, 60.0f, 60.0f); 133 | button.layer.cornerRadius = 7.0f; 134 | 135 | //use bezier path instead of maskToBounds on button.layer 136 | UIBezierPath *bi = [UIBezierPath bezierPathWithRoundedRect:button.bounds 137 | byRoundingCorners:UIRectCornerAllCorners 138 | cornerRadii:CGSizeMake(7.0,7.0)]; 139 | 140 | CAShapeLayer *maskLayer = [CAShapeLayer layer]; 141 | maskLayer.frame = button.bounds; 142 | maskLayer.path = bi.CGPath; 143 | button.layer.mask = maskLayer; 144 | 145 | button.layer.borderWidth = 1; 146 | button.layer.borderColor = [[UIColor blackColor] CGColor]; 147 | 148 | [button addTarget:self 149 | action:@selector(filterClicked:) 150 | forControlEvents:UIControlEventTouchUpInside]; 151 | button.tag = i; 152 | [button setTitle:@"*" forState:UIControlStateSelected]; 153 | if(i == 0){ 154 | [button setSelected:YES]; 155 | } 156 | [self.filterScrollView addSubview:button]; 157 | } 158 | [self.filterScrollView setContentSize:CGSizeMake(10 + 10*(60+10), 75.0)]; 159 | } 160 | 161 | 162 | -(void) setUpCamera { 163 | 164 | if ([UIImagePickerController isSourceTypeAvailable: UIImagePickerControllerSourceTypeCamera]) { 165 | // Has camera 166 | 167 | stillCamera = [[GPUImageStillCamera alloc] initWithSessionPreset:AVCaptureSessionPresetPhoto cameraPosition:AVCaptureDevicePositionBack]; 168 | 169 | stillCamera.outputImageOrientation = UIInterfaceOrientationPortrait; 170 | runOnMainQueueWithoutDeadlocking(^{ 171 | [stillCamera startCameraCapture]; 172 | if([stillCamera.inputCamera hasTorch]){ 173 | [self.flashToggleButton setEnabled:YES]; 174 | }else{ 175 | [self.flashToggleButton setEnabled:NO]; 176 | } 177 | [self prepareFilter]; 178 | }); 179 | } else { 180 | runOnMainQueueWithoutDeadlocking(^{ 181 | // No camera awailable, hide camera related buttons and show the image picker 182 | self.cameraToggleButton.hidden = YES; 183 | self.photoCaptureButton.hidden = YES; 184 | self.flashToggleButton.hidden = YES; 185 | // Show the library picker 186 | // [self switchToLibrary:nil]; 187 | // [self performSelector:@selector(switchToLibrary:) withObject:nil afterDelay:0.5]; 188 | [self prepareFilter]; 189 | }); 190 | } 191 | 192 | } 193 | 194 | -(void) filterClicked:(UIButton *) sender { 195 | for(UIView *view in self.filterScrollView.subviews){ 196 | if([view isKindOfClass:[UIButton class]]){ 197 | [(UIButton *)view setSelected:NO]; 198 | } 199 | } 200 | 201 | [sender setSelected:YES]; 202 | [self removeAllTargets]; 203 | 204 | selectedFilter = sender.tag; 205 | [self setFilter:sender.tag]; 206 | [self prepareFilter]; 207 | } 208 | 209 | 210 | -(void) setFilter:(int) index { 211 | switch (index) { 212 | case 1:{ 213 | filter = [[GPUImageContrastFilter alloc] init]; 214 | [(GPUImageContrastFilter *) filter setContrast:1.75]; 215 | } break; 216 | case 2: { 217 | filter = [[GPUImageToneCurveFilter alloc] initWithACV:@"crossprocess"]; 218 | } break; 219 | case 3: { 220 | filter = [[GPUImageToneCurveFilter alloc] initWithACV:@"02"]; 221 | } break; 222 | case 4: { 223 | filter = [[DLCGrayscaleContrastFilter alloc] init]; 224 | } break; 225 | case 5: { 226 | filter = [[GPUImageToneCurveFilter alloc] initWithACV:@"17"]; 227 | } break; 228 | case 6: { 229 | filter = [[GPUImageToneCurveFilter alloc] initWithACV:@"aqua"]; 230 | } break; 231 | case 7: { 232 | filter = [[GPUImageToneCurveFilter alloc] initWithACV:@"yellow-red"]; 233 | } break; 234 | case 8: { 235 | filter = [[GPUImageToneCurveFilter alloc] initWithACV:@"06"]; 236 | } break; 237 | case 9: { 238 | filter = [[GPUImageToneCurveFilter alloc] initWithACV:@"purple-green"]; 239 | } break; 240 | default: 241 | filter = [[GPUImageFilter alloc] init]; 242 | break; 243 | } 244 | } 245 | 246 | -(void) prepareFilter { 247 | if (![UIImagePickerController isSourceTypeAvailable: UIImagePickerControllerSourceTypeCamera]) { 248 | isStatic = YES; 249 | } 250 | 251 | if (!isStatic) { 252 | [self prepareLiveFilter]; 253 | } else { 254 | [self prepareStaticFilter]; 255 | } 256 | } 257 | 258 | -(void) prepareLiveFilter { 259 | 260 | [stillCamera addTarget:cropFilter]; 261 | [cropFilter addTarget:filter]; 262 | //blur is terminal filter 263 | if (hasBlur) { 264 | [filter addTarget:blurFilter]; 265 | [blurFilter addTarget:self.imageView]; 266 | //regular filter is terminal 267 | } else { 268 | [filter addTarget:self.imageView]; 269 | } 270 | 271 | [filter prepareForImageCapture]; 272 | 273 | } 274 | 275 | -(void) prepareStaticFilter { 276 | 277 | [staticPicture addTarget:filter]; 278 | 279 | // blur is terminal filter 280 | if (hasBlur) { 281 | [filter addTarget:blurFilter]; 282 | [blurFilter addTarget:self.imageView]; 283 | //regular filter is terminal 284 | } else { 285 | [filter addTarget:self.imageView]; 286 | } 287 | 288 | GPUImageRotationMode imageViewRotationMode = kGPUImageNoRotation; 289 | switch (staticPictureOriginalOrientation) { 290 | case UIImageOrientationLeft: 291 | imageViewRotationMode = kGPUImageRotateLeft; 292 | break; 293 | case UIImageOrientationRight: 294 | imageViewRotationMode = kGPUImageRotateRight; 295 | break; 296 | case UIImageOrientationDown: 297 | imageViewRotationMode = kGPUImageRotate180; 298 | break; 299 | default: 300 | imageViewRotationMode = kGPUImageNoRotation; 301 | break; 302 | } 303 | 304 | // seems like atIndex is ignored by GPUImageView... 305 | [self.imageView setInputRotation:imageViewRotationMode atIndex:0]; 306 | 307 | 308 | [staticPicture processImage]; 309 | } 310 | 311 | -(void) removeAllTargets { 312 | [stillCamera removeAllTargets]; 313 | [staticPicture removeAllTargets]; 314 | [cropFilter removeAllTargets]; 315 | 316 | //regular filter 317 | [filter removeAllTargets]; 318 | 319 | //blur 320 | [blurFilter removeAllTargets]; 321 | } 322 | 323 | -(IBAction)switchToLibrary:(id)sender { 324 | 325 | if (!isStatic) { 326 | // shut down camera 327 | [stillCamera stopCameraCapture]; 328 | [self removeAllTargets]; 329 | } 330 | 331 | UIImagePickerController* imagePickerController = [[UIImagePickerController alloc] init]; 332 | imagePickerController.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; 333 | imagePickerController.delegate = self; 334 | imagePickerController.allowsEditing = YES; 335 | [self presentViewController:imagePickerController animated:YES completion:NULL]; 336 | } 337 | 338 | -(IBAction)toggleFlash:(UIButton *)button{ 339 | [button setSelected:!button.selected]; 340 | } 341 | 342 | -(IBAction) toggleBlur:(UIButton*)blurButton { 343 | 344 | [self.blurToggleButton setEnabled:NO]; 345 | [self removeAllTargets]; 346 | 347 | if (hasBlur) { 348 | hasBlur = NO; 349 | [self showBlurOverlay:NO]; 350 | [self.blurToggleButton setSelected:NO]; 351 | } else { 352 | if (!blurFilter) { 353 | blurFilter = [[GPUImageGaussianSelectiveBlurFilter alloc] init]; 354 | [(GPUImageGaussianSelectiveBlurFilter*)blurFilter setExcludeCircleRadius:80.0/320.0]; 355 | [(GPUImageGaussianSelectiveBlurFilter*)blurFilter setExcludeCirclePoint:CGPointMake(0.5f, 0.5f)]; 356 | [(GPUImageGaussianSelectiveBlurFilter*)blurFilter setBlurRadiusInPixels:kStaticBlurSize]; 357 | [(GPUImageGaussianSelectiveBlurFilter*)blurFilter setAspectRatio:1.0f]; 358 | } 359 | hasBlur = YES; 360 | CGPoint excludePoint = [(GPUImageGaussianSelectiveBlurFilter*)blurFilter excludeCirclePoint]; 361 | CGSize frameSize = self.blurOverlayView.frame.size; 362 | self.blurOverlayView.circleCenter = CGPointMake(excludePoint.x * frameSize.width, excludePoint.y * frameSize.height); 363 | [self.blurToggleButton setSelected:YES]; 364 | [self flashBlurOverlay]; 365 | } 366 | 367 | [self prepareFilter]; 368 | [self.blurToggleButton setEnabled:YES]; 369 | } 370 | 371 | -(IBAction) switchCamera { 372 | 373 | [self.cameraToggleButton setEnabled:NO]; 374 | [stillCamera rotateCamera]; 375 | [self.cameraToggleButton setEnabled:YES]; 376 | 377 | if ([UIImagePickerController isSourceTypeAvailable: UIImagePickerControllerSourceTypeCamera] && stillCamera) { 378 | if ([stillCamera.inputCamera hasFlash] && [stillCamera.inputCamera hasTorch]) { 379 | [self.flashToggleButton setEnabled:YES]; 380 | } else { 381 | [self.flashToggleButton setEnabled:NO]; 382 | } 383 | } 384 | } 385 | 386 | -(void) prepareForCapture { 387 | [stillCamera.inputCamera lockForConfiguration:nil]; 388 | if(self.flashToggleButton.selected && 389 | [stillCamera.inputCamera hasTorch]){ 390 | [stillCamera.inputCamera setTorchMode:AVCaptureTorchModeOn]; 391 | [self performSelector:@selector(captureImage) 392 | withObject:nil 393 | afterDelay:0.25]; 394 | }else{ 395 | [self captureImage]; 396 | } 397 | } 398 | 399 | 400 | -(void)captureImage { 401 | 402 | void (^completion)(UIImage *, NSError *) = ^(UIImage *img, NSError *error) { 403 | 404 | [stillCamera.inputCamera unlockForConfiguration]; 405 | [stillCamera stopCameraCapture]; 406 | [self removeAllTargets]; 407 | 408 | staticPicture = [[GPUImagePicture alloc] initWithImage:img smoothlyScaleOutput:NO]; 409 | staticPictureOriginalOrientation = img.imageOrientation; 410 | 411 | [self prepareFilter]; 412 | [self.retakeButton setHidden:NO]; 413 | [self.photoCaptureButton setTitle:@"Done" forState:UIControlStateNormal]; 414 | [self.photoCaptureButton setImage:nil forState:UIControlStateNormal]; 415 | [self.photoCaptureButton setEnabled:YES]; 416 | if(![self.filtersToggleButton isSelected]){ 417 | [self showFilters]; 418 | } 419 | }; 420 | 421 | 422 | AVCaptureDevicePosition currentCameraPosition = stillCamera.inputCamera.position; 423 | Class contextClass = NSClassFromString(@"GPUImageContext") ?: NSClassFromString(@"GPUImageOpenGLESContext"); 424 | if ((currentCameraPosition != AVCaptureDevicePositionFront) || (![contextClass supportsFastTextureUpload])) { 425 | // Image full-resolution capture is currently possible just on the final (destination filter), so 426 | // create a new paralel chain, that crops and resizes our image 427 | [self removeAllTargets]; 428 | 429 | GPUImageCropFilter *captureCrop = [[GPUImageCropFilter alloc] initWithCropRegion:cropFilter.cropRegion]; 430 | [stillCamera addTarget:captureCrop]; 431 | GPUImageFilter *finalFilter = captureCrop; 432 | 433 | if (!CGSizeEqualToSize(requestedImageSize, CGSizeZero)) { 434 | GPUImageFilter *captureResize = [[GPUImageFilter alloc] init]; 435 | [captureResize forceProcessingAtSize:requestedImageSize]; 436 | [captureCrop addTarget:captureResize]; 437 | finalFilter = captureResize; 438 | } 439 | 440 | [finalFilter prepareForImageCapture]; 441 | 442 | [stillCamera capturePhotoAsImageProcessedUpToFilter:finalFilter withCompletionHandler:completion]; 443 | } else { 444 | // A workaround inside capturePhotoProcessedUpToFilter:withImageOnGPUHandler: would cause the above method to fail, 445 | // so we just grap the current crop filter output as an aproximation (the size won't match trough) 446 | UIImage *img = [cropFilter imageFromCurrentlyProcessedOutput]; 447 | completion(img, nil); 448 | } 449 | } 450 | 451 | -(IBAction) takePhoto:(id)sender{ 452 | [self.photoCaptureButton setEnabled:NO]; 453 | 454 | if (!isStatic) { 455 | isStatic = YES; 456 | 457 | [self.libraryToggleButton setHidden:YES]; 458 | [self.cameraToggleButton setEnabled:NO]; 459 | [self.flashToggleButton setEnabled:NO]; 460 | [self prepareForCapture]; 461 | 462 | } else { 463 | 464 | GPUImageOutput *processUpTo; 465 | 466 | if (hasBlur) { 467 | processUpTo = blurFilter; 468 | } else { 469 | processUpTo = filter; 470 | } 471 | 472 | [staticPicture processImage]; 473 | 474 | UIImage *currentFilteredVideoFrame = [processUpTo imageFromCurrentlyProcessedOutputWithOrientation:staticPictureOriginalOrientation]; 475 | 476 | NSDictionary *info = [[NSDictionary alloc] initWithObjectsAndKeys: 477 | UIImageJPEGRepresentation(currentFilteredVideoFrame, self.outputJPEGQuality), @"data", nil]; 478 | [self.delegate imagePickerController:self didFinishPickingMediaWithInfo:info]; 479 | } 480 | } 481 | 482 | -(IBAction) retakePhoto:(UIButton *)button { 483 | [self.retakeButton setHidden:YES]; 484 | [self.libraryToggleButton setHidden:NO]; 485 | staticPicture = nil; 486 | staticPictureOriginalOrientation = UIImageOrientationUp; 487 | isStatic = NO; 488 | [self removeAllTargets]; 489 | [stillCamera startCameraCapture]; 490 | [self.cameraToggleButton setEnabled:YES]; 491 | 492 | if([UIImagePickerController isSourceTypeAvailable: UIImagePickerControllerSourceTypeCamera] 493 | && stillCamera 494 | && [stillCamera.inputCamera hasTorch]) { 495 | [self.flashToggleButton setEnabled:YES]; 496 | } 497 | 498 | [self.photoCaptureButton setImage:[UIImage imageNamed:@"camera-icon"] forState:UIControlStateNormal]; 499 | [self.photoCaptureButton setTitle:nil forState:UIControlStateNormal]; 500 | 501 | if ([self.filtersToggleButton isSelected]) { 502 | [self hideFilters]; 503 | } 504 | 505 | [self setFilter:selectedFilter]; 506 | [self prepareFilter]; 507 | } 508 | 509 | -(IBAction) cancel:(id)sender { 510 | [self.delegate imagePickerControllerDidCancel:self]; 511 | } 512 | 513 | -(IBAction) handlePan:(UIGestureRecognizer *) sender { 514 | if (hasBlur) { 515 | CGPoint tapPoint = [sender locationInView:imageView]; 516 | GPUImageGaussianSelectiveBlurFilter* gpu = 517 | (GPUImageGaussianSelectiveBlurFilter*)blurFilter; 518 | 519 | if ([sender state] == UIGestureRecognizerStateBegan) { 520 | [self showBlurOverlay:YES]; 521 | [gpu setBlurRadiusInPixels:0.0f]; 522 | if (isStatic) { 523 | [staticPicture processImage]; 524 | } 525 | } 526 | 527 | if ([sender state] == UIGestureRecognizerStateBegan || [sender state] == UIGestureRecognizerStateChanged) { 528 | [gpu setBlurRadiusInPixels:0.0f]; 529 | [self.blurOverlayView setCircleCenter:tapPoint]; 530 | [gpu setExcludeCirclePoint:CGPointMake(tapPoint.x/320.0f, tapPoint.y/320.0f)]; 531 | } 532 | 533 | if([sender state] == UIGestureRecognizerStateEnded){ 534 | [gpu setBlurRadiusInPixels:kStaticBlurSize]; 535 | [self showBlurOverlay:NO]; 536 | if (isStatic) { 537 | [staticPicture processImage]; 538 | } 539 | } 540 | } 541 | } 542 | 543 | - (IBAction) handleTapToFocus:(UITapGestureRecognizer *)tgr{ 544 | if (!isStatic && tgr.state == UIGestureRecognizerStateRecognized) { 545 | CGPoint location = [tgr locationInView:self.imageView]; 546 | AVCaptureDevice *device = stillCamera.inputCamera; 547 | CGPoint pointOfInterest = CGPointMake(.5f, .5f); 548 | CGSize frameSize = [[self imageView] frame].size; 549 | if ([stillCamera cameraPosition] == AVCaptureDevicePositionFront) { 550 | location.x = frameSize.width - location.x; 551 | } 552 | pointOfInterest = CGPointMake(location.y / frameSize.height, 1.f - (location.x / frameSize.width)); 553 | if ([device isFocusPointOfInterestSupported] && [device isFocusModeSupported:AVCaptureFocusModeAutoFocus]) { 554 | NSError *error; 555 | if ([device lockForConfiguration:&error]) { 556 | [device setFocusPointOfInterest:pointOfInterest]; 557 | 558 | [device setFocusMode:AVCaptureFocusModeAutoFocus]; 559 | 560 | if([device isExposurePointOfInterestSupported] && [device isExposureModeSupported:AVCaptureExposureModeContinuousAutoExposure]) { 561 | [device setExposurePointOfInterest:pointOfInterest]; 562 | [device setExposureMode:AVCaptureExposureModeContinuousAutoExposure]; 563 | } 564 | 565 | self.focusView.center = [tgr locationInView:self.view]; 566 | self.focusView.alpha = 1; 567 | 568 | [UIView animateWithDuration:0.5 delay:0.5 options:0 animations:^{ 569 | self.focusView.alpha = 0; 570 | } completion:nil]; 571 | 572 | [device unlockForConfiguration]; 573 | } else { 574 | NSLog(@"ERROR = %@", error); 575 | } 576 | } 577 | } 578 | } 579 | 580 | -(IBAction) handlePinch:(UIPinchGestureRecognizer *) sender { 581 | if (hasBlur) { 582 | CGPoint midpoint = [sender locationInView:imageView]; 583 | GPUImageGaussianSelectiveBlurFilter* gpu = 584 | (GPUImageGaussianSelectiveBlurFilter*)blurFilter; 585 | 586 | if ([sender state] == UIGestureRecognizerStateBegan) { 587 | [self showBlurOverlay:YES]; 588 | [gpu setBlurRadiusInPixels:0.0f]; 589 | if (isStatic) { 590 | [staticPicture processImage]; 591 | } 592 | } 593 | 594 | if ([sender state] == UIGestureRecognizerStateBegan || [sender state] == UIGestureRecognizerStateChanged) { 595 | [gpu setBlurRadiusInPixels:0.0f]; 596 | [gpu setExcludeCirclePoint:CGPointMake(midpoint.x/320.0f, midpoint.y/320.0f)]; 597 | self.blurOverlayView.circleCenter = CGPointMake(midpoint.x, midpoint.y); 598 | CGFloat radius = MAX(MIN(sender.scale*[gpu excludeCircleRadius], 0.6f), 0.15f); 599 | self.blurOverlayView.radius = radius*320.f; 600 | [gpu setExcludeCircleRadius:radius]; 601 | sender.scale = 1.0f; 602 | } 603 | 604 | if ([sender state] == UIGestureRecognizerStateEnded) { 605 | [gpu setBlurRadiusInPixels:kStaticBlurSize]; 606 | [self showBlurOverlay:NO]; 607 | if (isStatic) { 608 | [staticPicture processImage]; 609 | } 610 | } 611 | } 612 | } 613 | 614 | -(void) showFilters { 615 | [self.filtersToggleButton setSelected:YES]; 616 | self.filtersToggleButton.enabled = NO; 617 | CGRect imageRect = self.imageView.frame; 618 | imageRect.origin.y -= 34; 619 | CGRect sliderScrollFrame = self.filterScrollView.frame; 620 | sliderScrollFrame.origin.y -= self.filterScrollView.frame.size.height; 621 | CGRect sliderScrollFrameBackground = self.filtersBackgroundImageView.frame; 622 | sliderScrollFrameBackground.origin.y -= 623 | self.filtersBackgroundImageView.frame.size.height-3; 624 | 625 | self.filterScrollView.hidden = NO; 626 | self.filtersBackgroundImageView.hidden = NO; 627 | [UIView animateWithDuration:0.10 628 | delay:0.05 629 | options: UIViewAnimationOptionCurveEaseOut 630 | animations:^{ 631 | self.imageView.frame = imageRect; 632 | self.filterScrollView.frame = sliderScrollFrame; 633 | self.filtersBackgroundImageView.frame = sliderScrollFrameBackground; 634 | } 635 | completion:^(BOOL finished){ 636 | self.filtersToggleButton.enabled = YES; 637 | }]; 638 | } 639 | 640 | -(void) hideFilters { 641 | [self.filtersToggleButton setSelected:NO]; 642 | CGRect imageRect = self.imageView.frame; 643 | imageRect.origin.y += 34; 644 | CGRect sliderScrollFrame = self.filterScrollView.frame; 645 | sliderScrollFrame.origin.y += self.filterScrollView.frame.size.height; 646 | 647 | CGRect sliderScrollFrameBackground = self.filtersBackgroundImageView.frame; 648 | sliderScrollFrameBackground.origin.y += self.filtersBackgroundImageView.frame.size.height-3; 649 | 650 | [UIView animateWithDuration:0.10 651 | delay:0.05 652 | options: UIViewAnimationOptionCurveEaseOut 653 | animations:^{ 654 | self.imageView.frame = imageRect; 655 | self.filterScrollView.frame = sliderScrollFrame; 656 | self.filtersBackgroundImageView.frame = sliderScrollFrameBackground; 657 | } 658 | completion:^(BOOL finished){ 659 | 660 | self.filtersToggleButton.enabled = YES; 661 | self.filterScrollView.hidden = YES; 662 | self.filtersBackgroundImageView.hidden = YES; 663 | }]; 664 | } 665 | 666 | -(IBAction) toggleFilters:(UIButton *)sender { 667 | sender.enabled = NO; 668 | if (sender.selected){ 669 | [self hideFilters]; 670 | } else { 671 | [self showFilters]; 672 | } 673 | 674 | } 675 | 676 | -(void) showBlurOverlay:(BOOL)show{ 677 | if(show){ 678 | [UIView animateWithDuration:0.2 delay:0 options:0 animations:^{ 679 | self.blurOverlayView.alpha = 0.6; 680 | } completion:^(BOOL finished) { 681 | 682 | }]; 683 | }else{ 684 | [UIView animateWithDuration:0.35 delay:0.2 options:0 animations:^{ 685 | self.blurOverlayView.alpha = 0; 686 | } completion:^(BOOL finished) { 687 | 688 | }]; 689 | } 690 | } 691 | 692 | 693 | -(void) flashBlurOverlay { 694 | [UIView animateWithDuration:0.2 delay:0 options:0 animations:^{ 695 | self.blurOverlayView.alpha = 0.6; 696 | } completion:^(BOOL finished) { 697 | [UIView animateWithDuration:0.35 delay:0.2 options:0 animations:^{ 698 | self.blurOverlayView.alpha = 0; 699 | } completion:^(BOOL finished) { 700 | 701 | }]; 702 | }]; 703 | } 704 | 705 | -(void) dealloc { 706 | [self removeAllTargets]; 707 | stillCamera = nil; 708 | cropFilter = nil; 709 | filter = nil; 710 | blurFilter = nil; 711 | staticPicture = nil; 712 | self.blurOverlayView = nil; 713 | self.focusView = nil; 714 | } 715 | 716 | - (void)viewWillDisappear:(BOOL)animated { 717 | [stillCamera stopCameraCapture]; 718 | [super viewWillDisappear:animated]; 719 | [[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:NO]; 720 | } 721 | 722 | #pragma mark - UIImagePickerDelegate 723 | 724 | - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { 725 | 726 | UIImage* outputImage = [info objectForKey:UIImagePickerControllerEditedImage]; 727 | if (outputImage == nil) { 728 | outputImage = [info objectForKey:UIImagePickerControllerOriginalImage]; 729 | } 730 | 731 | if (outputImage) { 732 | staticPicture = [[GPUImagePicture alloc] initWithImage:outputImage smoothlyScaleOutput:YES]; 733 | staticPictureOriginalOrientation = outputImage.imageOrientation; 734 | isStatic = YES; 735 | [self dismissViewControllerAnimated:YES completion:nil]; 736 | [self.cameraToggleButton setEnabled:NO]; 737 | [self.flashToggleButton setEnabled:NO]; 738 | [self prepareStaticFilter]; 739 | [self.photoCaptureButton setHidden:NO]; 740 | [self.photoCaptureButton setTitle:@"Done" forState:UIControlStateNormal]; 741 | [self.photoCaptureButton setImage:nil forState:UIControlStateNormal]; 742 | [self.photoCaptureButton setEnabled:YES]; 743 | if(![self.filtersToggleButton isSelected]){ 744 | [self showFilters]; 745 | } 746 | 747 | } 748 | } 749 | 750 | - (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker { 751 | [self dismissViewControllerAnimated:YES completion:nil]; 752 | if (!isStatic) { 753 | [self retakePhoto:nil]; 754 | } 755 | } 756 | 757 | #if __IPHONE_OS_VERSION_MAX_ALLOWED >= 60000 758 | 759 | - (NSUInteger)supportedInterfaceOrientations { 760 | return UIInterfaceOrientationMaskPortrait; 761 | } 762 | 763 | #endif 764 | 765 | @end 766 | -------------------------------------------------------------------------------- /Classes/PhotoViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // PhotoViewController.h 3 | // DLCImagePickerController 4 | // 5 | // Created by Dmitri Cherniak on 8/18/12. 6 | // Copyright (c) 2012 Backspaces Inc. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "DLCImagePickerController.h" 11 | 12 | @interface PhotoViewController : UIViewController 13 | 14 | @property (nonatomic, strong) UIButton *showPickerButton; 15 | 16 | @end 17 | -------------------------------------------------------------------------------- /Classes/PhotoViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // PhotoViewController.m 3 | // DLCImagePickerController 4 | // 5 | // Created by Dmitri Cherniak on 8/18/12. 6 | // Copyright (c) 2012 Backspaces Inc. All rights reserved. 7 | // 8 | 9 | #import "PhotoViewController.h" 10 | #import 11 | 12 | @interface PhotoViewController () 13 | 14 | @end 15 | 16 | @implementation PhotoViewController 17 | 18 | @synthesize showPickerButton; 19 | 20 | - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 21 | { 22 | self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 23 | if (self) { 24 | // Custom initialization 25 | } 26 | return self; 27 | } 28 | 29 | - (void)loadView 30 | { 31 | CGRect mainScreenFrame = [[UIScreen mainScreen] bounds]; 32 | UIView *primaryView = [[GPUImageView alloc] initWithFrame:mainScreenFrame]; 33 | 34 | showPickerButton = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 35 | showPickerButton.frame = CGRectMake(round(mainScreenFrame.size.width / 2.0 - 150.0 / 2.0), mainScreenFrame.size.height - 90.0, 150.0, 40.0); 36 | [showPickerButton setTitle:@"Show picker" forState:UIControlStateNormal]; 37 | showPickerButton.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleTopMargin; 38 | [showPickerButton addTarget:self action:@selector(takePhoto:) forControlEvents:UIControlEventTouchUpInside]; 39 | [showPickerButton setTitleColor:[UIColor grayColor] forState:UIControlStateDisabled]; 40 | 41 | [primaryView addSubview:showPickerButton]; 42 | 43 | self.view = primaryView; 44 | } 45 | 46 | -(void) takePhoto:(id)sender{ 47 | DLCImagePickerController *picker = [[DLCImagePickerController alloc] init]; 48 | picker.delegate = self; 49 | [self presentModalViewController:picker animated:YES]; 50 | } 51 | 52 | 53 | -(void) imagePickerControllerDidCancel:(DLCImagePickerController *)picker{ 54 | [self dismissModalViewControllerAnimated:YES]; 55 | } 56 | 57 | -(void) imagePickerController:(DLCImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { 58 | [[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:NO]; 59 | [self dismissModalViewControllerAnimated:YES]; 60 | 61 | if (info) { 62 | ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init]; 63 | [library writeImageDataToSavedPhotosAlbum:[info objectForKey:@"data"] metadata:nil completionBlock:^(NSURL *assetURL, NSError *error) 64 | { 65 | if (error) { 66 | NSLog(@"ERROR: the image failed to be written"); 67 | } 68 | else { 69 | NSLog(@"PHOTO SAVED - assetURL: %@", assetURL); 70 | } 71 | }]; 72 | } 73 | } 74 | 75 | -(void) viewDidUnload { 76 | [super viewDidUnload]; 77 | showPickerButton = nil; 78 | } 79 | @end 80 | -------------------------------------------------------------------------------- /DLCImagePickerController.podspec: -------------------------------------------------------------------------------- 1 | Pod::Spec.new do |s| 2 | s.name = "DLCImagePickerController" 3 | s.version = "0.0.1" 4 | s.summary = "ImagePickerController with live filters, radial blur and more. Brought to you by the fine ladies and gents at Backspaces." 5 | s.description = <<-DESC 6 | DLCImagePickerController is a fast, beautiful and fun way to filter and capture your photos with OpenGL and your iPhone. 7 | The majority of the praise should be directed towards BradLarson for his GPUImage library. 8 | DESC 9 | s.homepage = "www.backspac.es" 10 | s.license = 'BSD' 11 | s.author = { "Dmitri Cherniak" => "dmitric@gmail.com" } 12 | s.source = { :git => "https://github.com/gobackspaces/DLCImagePickerController.git", :tag => "0.0.1" } 13 | s.platform = :ios, '5.0' 14 | s.requires_arc = true 15 | s.framework = 'AssetsLibrary' 16 | 17 | s.subspec 'Core' do |sp| 18 | sp.source_files = 'Classes' 19 | sp.resources = "Images/{UI,Overlays}/*.png" 20 | sp.dependency 'GPUImage' 21 | end 22 | 23 | s.subspec 'Filters' do |sp| 24 | sp.resources = "Resources/Filters/*.acv" 25 | end 26 | 27 | s.subspec 'UI' do |sp| 28 | sp.resources = "Resources/*.xib" 29 | end 30 | 31 | s.subspec 'FilterSamples' do |sp| 32 | sp.resources = "Images/FilterSamples/*.jpg" 33 | end 34 | end -------------------------------------------------------------------------------- /DLCImagePickerController.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 6A0D0A01165A1CBE0028E1B6 /* DLCBlurOverlayView.m in Sources */ = {isa = PBXBuildFile; fileRef = 6A0D0A00165A1CBE0028E1B6 /* DLCBlurOverlayView.m */; }; 11 | 6A0D0A0F165A1FFC0028E1B6 /* focus-crosshair.png in Resources */ = {isa = PBXBuildFile; fileRef = 6A0D0A0D165A1FFC0028E1B6 /* focus-crosshair.png */; }; 12 | 6A0D0A10165A1FFC0028E1B6 /* focus-crosshair@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 6A0D0A0E165A1FFC0028E1B6 /* focus-crosshair@2x.png */; }; 13 | 6A0D0A28165A218F0028E1B6 /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 6A0D0A27165A218F0028E1B6 /* Default-568h@2x.png */; }; 14 | 6A23390E15E6C17000CC6CB2 /* library@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 6A23390C15E6C17000CC6CB2 /* library@2x.png */; }; 15 | 6A23390F15E6C17000CC6CB2 /* library.png in Resources */ = {isa = PBXBuildFile; fileRef = 6A23390D15E6C17000CC6CB2 /* library.png */; }; 16 | 6A42CF7615E46F0E0062D3E7 /* blur-on.png in Resources */ = {isa = PBXBuildFile; fileRef = 6A42CF7415E46F0E0062D3E7 /* blur-on.png */; }; 17 | 6A42CF7715E46F0E0062D3E7 /* blur-on@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 6A42CF7515E46F0E0062D3E7 /* blur-on@2x.png */; }; 18 | 6A49CEA715E345070098304F /* blackframe.png in Resources */ = {isa = PBXBuildFile; fileRef = 6A49CEA615E345070098304F /* blackframe.png */; }; 19 | 6A49CED815E459B00098304F /* filter-close.png in Resources */ = {isa = PBXBuildFile; fileRef = 6A49CED415E459B00098304F /* filter-close.png */; }; 20 | 6A49CED915E459B00098304F /* filter-close@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 6A49CED515E459B00098304F /* filter-close@2x.png */; }; 21 | 6A49CEDA15E459B00098304F /* filter-open.png in Resources */ = {isa = PBXBuildFile; fileRef = 6A49CED615E459B00098304F /* filter-open.png */; }; 22 | 6A49CEDB15E459B00098304F /* filter-open@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 6A49CED715E459B00098304F /* filter-open@2x.png */; }; 23 | 6A49CEEC15E45A5F0098304F /* camera-button.png in Resources */ = {isa = PBXBuildFile; fileRef = 6A49CEE815E45A5F0098304F /* camera-button.png */; }; 24 | 6A49CEED15E45A5F0098304F /* camera-button@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 6A49CEE915E45A5F0098304F /* camera-button@2x.png */; }; 25 | 6A49CEEE15E45A5F0098304F /* camera-icon.png in Resources */ = {isa = PBXBuildFile; fileRef = 6A49CEEA15E45A5F0098304F /* camera-icon.png */; }; 26 | 6A49CEEF15E45A5F0098304F /* camera-icon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 6A49CEEB15E45A5F0098304F /* camera-icon@2x.png */; }; 27 | 6A49CEF215E460540098304F /* filter.png in Resources */ = {isa = PBXBuildFile; fileRef = 6A49CEF015E460540098304F /* filter.png */; }; 28 | 6A49CEF315E460540098304F /* filter@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 6A49CEF115E460540098304F /* filter@2x.png */; }; 29 | 6A49CEFA15E461670098304F /* flash-auto.png in Resources */ = {isa = PBXBuildFile; fileRef = 6A49CEF415E461670098304F /* flash-auto.png */; }; 30 | 6A49CEFB15E461670098304F /* flash-auto@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 6A49CEF515E461670098304F /* flash-auto@2x.png */; }; 31 | 6A49CEFC15E461670098304F /* flash-off.png in Resources */ = {isa = PBXBuildFile; fileRef = 6A49CEF615E461670098304F /* flash-off.png */; }; 32 | 6A49CEFD15E461670098304F /* flash-off@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 6A49CEF715E461670098304F /* flash-off@2x.png */; }; 33 | 6A49CEFE15E461670098304F /* flash.png in Resources */ = {isa = PBXBuildFile; fileRef = 6A49CEF815E461670098304F /* flash.png */; }; 34 | 6A49CEFF15E461670098304F /* flash@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 6A49CEF915E461670098304F /* flash@2x.png */; }; 35 | 6A49CF0215E4617A0098304F /* front-camera.png in Resources */ = {isa = PBXBuildFile; fileRef = 6A49CF0015E4617A0098304F /* front-camera.png */; }; 36 | 6A49CF0315E4617A0098304F /* front-camera@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 6A49CF0115E4617A0098304F /* front-camera@2x.png */; }; 37 | 6A49CF0615E461B30098304F /* blur.png in Resources */ = {isa = PBXBuildFile; fileRef = 6A49CF0415E461B30098304F /* blur.png */; }; 38 | 6A49CF0715E461B30098304F /* blur@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 6A49CF0515E461B30098304F /* blur@2x.png */; }; 39 | 6A49CF0A15E461D10098304F /* close.png in Resources */ = {isa = PBXBuildFile; fileRef = 6A49CF0815E461D10098304F /* close.png */; }; 40 | 6A49CF0B15E461D10098304F /* close@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 6A49CF0915E461D10098304F /* close@2x.png */; }; 41 | 6A55309515E4869600019CC9 /* 1.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 6A55309315E4869600019CC9 /* 1.jpg */; }; 42 | 6A55309615E4869600019CC9 /* 1@2x.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 6A55309415E4869600019CC9 /* 1@2x.jpg */; }; 43 | 6A55309915E486A600019CC9 /* 2.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 6A55309715E486A600019CC9 /* 2.jpg */; }; 44 | 6A55309A15E486A600019CC9 /* 2@2x.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 6A55309815E486A600019CC9 /* 2@2x.jpg */; }; 45 | 6A55309D15E486B300019CC9 /* 3.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 6A55309B15E486B300019CC9 /* 3.jpg */; }; 46 | 6A55309E15E486B300019CC9 /* 3@2x.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 6A55309C15E486B300019CC9 /* 3@2x.jpg */; }; 47 | 6A5530A115E486BB00019CC9 /* 4.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 6A55309F15E486BB00019CC9 /* 4.jpg */; }; 48 | 6A5530A215E486BB00019CC9 /* 4@2x.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 6A5530A015E486BB00019CC9 /* 4@2x.jpg */; }; 49 | 6A5530A515E486C300019CC9 /* 5.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 6A5530A315E486C300019CC9 /* 5.jpg */; }; 50 | 6A5530A615E486C300019CC9 /* 5@2x.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 6A5530A415E486C300019CC9 /* 5@2x.jpg */; }; 51 | 6A5530A915E486CB00019CC9 /* 6.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 6A5530A715E486CB00019CC9 /* 6.jpg */; }; 52 | 6A5530AA15E486CB00019CC9 /* 6@2x.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 6A5530A815E486CB00019CC9 /* 6@2x.jpg */; }; 53 | 6A5530AD15E486D500019CC9 /* 7.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 6A5530AB15E486D500019CC9 /* 7.jpg */; }; 54 | 6A5530AE15E486D500019CC9 /* 7@2x.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 6A5530AC15E486D500019CC9 /* 7@2x.jpg */; }; 55 | 6A5530B115E486DD00019CC9 /* 8.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 6A5530AF15E486DD00019CC9 /* 8.jpg */; }; 56 | 6A5530B215E486DD00019CC9 /* 8@2x.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 6A5530B015E486DD00019CC9 /* 8@2x.jpg */; }; 57 | 6A5530B515E486E300019CC9 /* 9.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 6A5530B315E486E300019CC9 /* 9.jpg */; }; 58 | 6A5530B615E486E300019CC9 /* 9@2x.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 6A5530B415E486E300019CC9 /* 9@2x.jpg */; }; 59 | 6A5530B915E486E900019CC9 /* 10.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 6A5530B715E486E900019CC9 /* 10.jpg */; }; 60 | 6A5530BA15E486E900019CC9 /* 10@2x.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 6A5530B815E486E900019CC9 /* 10@2x.jpg */; }; 61 | 6A5BBDA815E2214B00B1B485 /* 02.acv in Resources */ = {isa = PBXBuildFile; fileRef = 6A5BBDA515E2214B00B1B485 /* 02.acv */; }; 62 | 6A5BBDA915E2214B00B1B485 /* 06.acv in Resources */ = {isa = PBXBuildFile; fileRef = 6A5BBDA615E2214B00B1B485 /* 06.acv */; }; 63 | 6A5BBDAA15E2214B00B1B485 /* 17.acv in Resources */ = {isa = PBXBuildFile; fileRef = 6A5BBDA715E2214B00B1B485 /* 17.acv */; }; 64 | 6A5D9A1515E0152D001FAD14 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6A5D9A1415E0152D001FAD14 /* UIKit.framework */; }; 65 | 6A5D9A1715E0152D001FAD14 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6A5D9A1615E0152D001FAD14 /* Foundation.framework */; }; 66 | 6A5D9A1915E0152D001FAD14 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6A5D9A1815E0152D001FAD14 /* CoreGraphics.framework */; }; 67 | 6A5D9A1F15E0152D001FAD14 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 6A5D9A1D15E0152D001FAD14 /* InfoPlist.strings */; }; 68 | 6A5D9A2115E0152D001FAD14 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 6A5D9A2015E0152D001FAD14 /* main.m */; }; 69 | 6A5D9A2515E0152E001FAD14 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 6A5D9A2415E0152D001FAD14 /* AppDelegate.m */; }; 70 | 6A5D9A2C15E01587001FAD14 /* CoreMedia.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6A5D9A2B15E01587001FAD14 /* CoreMedia.framework */; }; 71 | 6A5D9A2E15E01590001FAD14 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6A5D9A2D15E01590001FAD14 /* CoreVideo.framework */; }; 72 | 6A5D9A3015E01598001FAD14 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6A5D9A2F15E01598001FAD14 /* QuartzCore.framework */; }; 73 | 6A5D9A3215E015A1001FAD14 /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6A5D9A3115E015A1001FAD14 /* OpenGLES.framework */; }; 74 | 6A5D9A3415E015B3001FAD14 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6A5D9A3315E015B3001FAD14 /* AVFoundation.framework */; }; 75 | 6A5D9A5715E01BD7001FAD14 /* libGPUImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 6A5D9A5215E01B72001FAD14 /* libGPUImage.a */; }; 76 | 6A5D9A5915E01DA4001FAD14 /* AssetsLibrary.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6A5D9A5815E01DA4001FAD14 /* AssetsLibrary.framework */; }; 77 | 6A5D9A8815E02429001FAD14 /* DLCImagePickerController.m in Sources */ = {isa = PBXBuildFile; fileRef = 6A5D9A8715E02429001FAD14 /* DLCImagePickerController.m */; }; 78 | 6A5D9A8B15E02504001FAD14 /* PhotoViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 6A5D9A8A15E02504001FAD14 /* PhotoViewController.m */; }; 79 | 6A5D9AA115E02527001FAD14 /* mask.png in Resources */ = {isa = PBXBuildFile; fileRef = 6A5D9A9415E02527001FAD14 /* mask.png */; }; 80 | 6A5D9AA215E02527001FAD14 /* dock_bg.png in Resources */ = {isa = PBXBuildFile; fileRef = 6A5D9A9615E02527001FAD14 /* dock_bg.png */; }; 81 | 6A5D9AA315E02527001FAD14 /* dock_bg@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 6A5D9A9715E02527001FAD14 /* dock_bg@2x.png */; }; 82 | 6A5D9AA415E02527001FAD14 /* micro_carbon.png in Resources */ = {isa = PBXBuildFile; fileRef = 6A5D9A9815E02527001FAD14 /* micro_carbon.png */; }; 83 | 6A5D9AA515E02527001FAD14 /* micro_carbon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 6A5D9A9915E02527001FAD14 /* micro_carbon@2x.png */; }; 84 | 6A5D9AA615E02527001FAD14 /* photo_bar.png in Resources */ = {isa = PBXBuildFile; fileRef = 6A5D9A9A15E02527001FAD14 /* photo_bar.png */; }; 85 | 6A5D9AA715E02527001FAD14 /* photo_bar@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 6A5D9A9B15E02527001FAD14 /* photo_bar@2x.png */; }; 86 | 6A5D9AAA15E0259A001FAD14 /* DLCImagePicker.xib in Resources */ = {isa = PBXBuildFile; fileRef = 6A5D9AA915E0259A001FAD14 /* DLCImagePicker.xib */; }; 87 | 7D0E5AB315E203FA009D19C9 /* purple-green.acv in Resources */ = {isa = PBXBuildFile; fileRef = 7D0E5AB115E203FA009D19C9 /* purple-green.acv */; }; 88 | 7D0E5AB415E203FA009D19C9 /* yellow-red.acv in Resources */ = {isa = PBXBuildFile; fileRef = 7D0E5AB215E203FA009D19C9 /* yellow-red.acv */; }; 89 | 7D0E5AB815E209AD009D19C9 /* DLCGrayscaleContrastFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D0E5AB715E209AD009D19C9 /* DLCGrayscaleContrastFilter.m */; }; 90 | 7D1E64B915E1FA2F005A9E09 /* crossprocess.acv in Resources */ = {isa = PBXBuildFile; fileRef = 7D1E64B715E1FA2F005A9E09 /* crossprocess.acv */; }; 91 | 7DEB4DC615E063420078BFAD /* sample1.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 7DEB4DC515E063420078BFAD /* sample1.jpg */; }; 92 | 7DFAE1BA15E22A9F00C8236F /* aqua.acv in Resources */ = {isa = PBXBuildFile; fileRef = 7DFAE1B915E22A9F00C8236F /* aqua.acv */; }; 93 | /* End PBXBuildFile section */ 94 | 95 | /* Begin PBXContainerItemProxy section */ 96 | 6A5D9A5115E01B72001FAD14 /* PBXContainerItemProxy */ = { 97 | isa = PBXContainerItemProxy; 98 | containerPortal = 6A5D9A4815E01B72001FAD14 /* GPUImage.xcodeproj */; 99 | proxyType = 2; 100 | remoteGlobalIDString = BCF1A33414DDB1EC00852800; 101 | remoteInfo = GPUImage; 102 | }; 103 | 6A5D9A5315E01B72001FAD14 /* PBXContainerItemProxy */ = { 104 | isa = PBXContainerItemProxy; 105 | containerPortal = 6A5D9A4815E01B72001FAD14 /* GPUImage.xcodeproj */; 106 | proxyType = 2; 107 | remoteGlobalIDString = BCF1A34414DDB1EC00852800; 108 | remoteInfo = GPUImageTests; 109 | }; 110 | 6A5D9A5515E01BC2001FAD14 /* PBXContainerItemProxy */ = { 111 | isa = PBXContainerItemProxy; 112 | containerPortal = 6A5D9A4815E01B72001FAD14 /* GPUImage.xcodeproj */; 113 | proxyType = 1; 114 | remoteGlobalIDString = BCF1A33314DDB1EC00852800; 115 | remoteInfo = GPUImage; 116 | }; 117 | /* End PBXContainerItemProxy section */ 118 | 119 | /* Begin PBXFileReference section */ 120 | 6A0D09FF165A1CBE0028E1B6 /* DLCBlurOverlayView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DLCBlurOverlayView.h; sourceTree = ""; }; 121 | 6A0D0A00165A1CBE0028E1B6 /* DLCBlurOverlayView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DLCBlurOverlayView.m; sourceTree = ""; }; 122 | 6A0D0A0D165A1FFC0028E1B6 /* focus-crosshair.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "focus-crosshair.png"; sourceTree = ""; }; 123 | 6A0D0A0E165A1FFC0028E1B6 /* focus-crosshair@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "focus-crosshair@2x.png"; sourceTree = ""; }; 124 | 6A0D0A27165A218F0028E1B6 /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Default-568h@2x.png"; path = "../Default-568h@2x.png"; sourceTree = ""; }; 125 | 6A23390C15E6C17000CC6CB2 /* library@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "library@2x.png"; sourceTree = ""; }; 126 | 6A23390D15E6C17000CC6CB2 /* library.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = library.png; sourceTree = ""; }; 127 | 6A42CF7415E46F0E0062D3E7 /* blur-on.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "blur-on.png"; sourceTree = ""; }; 128 | 6A42CF7515E46F0E0062D3E7 /* blur-on@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "blur-on@2x.png"; sourceTree = ""; }; 129 | 6A49CEA615E345070098304F /* blackframe.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = blackframe.png; sourceTree = ""; }; 130 | 6A49CED415E459B00098304F /* filter-close.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "filter-close.png"; sourceTree = ""; }; 131 | 6A49CED515E459B00098304F /* filter-close@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "filter-close@2x.png"; sourceTree = ""; }; 132 | 6A49CED615E459B00098304F /* filter-open.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "filter-open.png"; sourceTree = ""; }; 133 | 6A49CED715E459B00098304F /* filter-open@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "filter-open@2x.png"; sourceTree = ""; }; 134 | 6A49CEE815E45A5F0098304F /* camera-button.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "camera-button.png"; sourceTree = ""; }; 135 | 6A49CEE915E45A5F0098304F /* camera-button@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "camera-button@2x.png"; sourceTree = ""; }; 136 | 6A49CEEA15E45A5F0098304F /* camera-icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "camera-icon.png"; sourceTree = ""; }; 137 | 6A49CEEB15E45A5F0098304F /* camera-icon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "camera-icon@2x.png"; sourceTree = ""; }; 138 | 6A49CEF015E460540098304F /* filter.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = filter.png; sourceTree = ""; }; 139 | 6A49CEF115E460540098304F /* filter@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "filter@2x.png"; sourceTree = ""; }; 140 | 6A49CEF415E461670098304F /* flash-auto.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "flash-auto.png"; sourceTree = ""; }; 141 | 6A49CEF515E461670098304F /* flash-auto@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "flash-auto@2x.png"; sourceTree = ""; }; 142 | 6A49CEF615E461670098304F /* flash-off.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "flash-off.png"; sourceTree = ""; }; 143 | 6A49CEF715E461670098304F /* flash-off@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "flash-off@2x.png"; sourceTree = ""; }; 144 | 6A49CEF815E461670098304F /* flash.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = flash.png; sourceTree = ""; }; 145 | 6A49CEF915E461670098304F /* flash@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "flash@2x.png"; sourceTree = ""; }; 146 | 6A49CF0015E4617A0098304F /* front-camera.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "front-camera.png"; sourceTree = ""; }; 147 | 6A49CF0115E4617A0098304F /* front-camera@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "front-camera@2x.png"; sourceTree = ""; }; 148 | 6A49CF0415E461B30098304F /* blur.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = blur.png; sourceTree = ""; }; 149 | 6A49CF0515E461B30098304F /* blur@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "blur@2x.png"; sourceTree = ""; }; 150 | 6A49CF0815E461D10098304F /* close.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = close.png; sourceTree = ""; }; 151 | 6A49CF0915E461D10098304F /* close@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "close@2x.png"; sourceTree = ""; }; 152 | 6A55309315E4869600019CC9 /* 1.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = 1.jpg; sourceTree = ""; }; 153 | 6A55309415E4869600019CC9 /* 1@2x.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "1@2x.jpg"; sourceTree = ""; }; 154 | 6A55309715E486A600019CC9 /* 2.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = 2.jpg; sourceTree = ""; }; 155 | 6A55309815E486A600019CC9 /* 2@2x.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "2@2x.jpg"; sourceTree = ""; }; 156 | 6A55309B15E486B300019CC9 /* 3.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = 3.jpg; sourceTree = ""; }; 157 | 6A55309C15E486B300019CC9 /* 3@2x.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "3@2x.jpg"; sourceTree = ""; }; 158 | 6A55309F15E486BB00019CC9 /* 4.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = 4.jpg; sourceTree = ""; }; 159 | 6A5530A015E486BB00019CC9 /* 4@2x.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "4@2x.jpg"; sourceTree = ""; }; 160 | 6A5530A315E486C300019CC9 /* 5.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = 5.jpg; sourceTree = ""; }; 161 | 6A5530A415E486C300019CC9 /* 5@2x.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "5@2x.jpg"; sourceTree = ""; }; 162 | 6A5530A715E486CB00019CC9 /* 6.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = 6.jpg; sourceTree = ""; }; 163 | 6A5530A815E486CB00019CC9 /* 6@2x.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "6@2x.jpg"; sourceTree = ""; }; 164 | 6A5530AB15E486D500019CC9 /* 7.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = 7.jpg; sourceTree = ""; }; 165 | 6A5530AC15E486D500019CC9 /* 7@2x.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "7@2x.jpg"; sourceTree = ""; }; 166 | 6A5530AF15E486DD00019CC9 /* 8.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = 8.jpg; sourceTree = ""; }; 167 | 6A5530B015E486DD00019CC9 /* 8@2x.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "8@2x.jpg"; sourceTree = ""; }; 168 | 6A5530B315E486E300019CC9 /* 9.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = 9.jpg; sourceTree = ""; }; 169 | 6A5530B415E486E300019CC9 /* 9@2x.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "9@2x.jpg"; sourceTree = ""; }; 170 | 6A5530B715E486E900019CC9 /* 10.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = 10.jpg; sourceTree = ""; }; 171 | 6A5530B815E486E900019CC9 /* 10@2x.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "10@2x.jpg"; sourceTree = ""; }; 172 | 6A5BBDA515E2214B00B1B485 /* 02.acv */ = {isa = PBXFileReference; lastKnownFileType = file; name = 02.acv; path = Filters/02.acv; sourceTree = ""; }; 173 | 6A5BBDA615E2214B00B1B485 /* 06.acv */ = {isa = PBXFileReference; lastKnownFileType = file; name = 06.acv; path = Filters/06.acv; sourceTree = ""; }; 174 | 6A5BBDA715E2214B00B1B485 /* 17.acv */ = {isa = PBXFileReference; lastKnownFileType = file; name = 17.acv; path = Filters/17.acv; sourceTree = ""; }; 175 | 6A5D9A1015E0152D001FAD14 /* DLCImagePickerController.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = DLCImagePickerController.app; sourceTree = BUILT_PRODUCTS_DIR; }; 176 | 6A5D9A1415E0152D001FAD14 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; 177 | 6A5D9A1615E0152D001FAD14 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 178 | 6A5D9A1815E0152D001FAD14 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; 179 | 6A5D9A1C15E0152D001FAD14 /* DLCImagePickerController-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "DLCImagePickerController-Info.plist"; sourceTree = ""; }; 180 | 6A5D9A1E15E0152D001FAD14 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; 181 | 6A5D9A2015E0152D001FAD14 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 182 | 6A5D9A2215E0152D001FAD14 /* DLCImagePickerController-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "DLCImagePickerController-Prefix.pch"; sourceTree = ""; }; 183 | 6A5D9A2315E0152D001FAD14 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 184 | 6A5D9A2415E0152D001FAD14 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; 185 | 6A5D9A2B15E01587001FAD14 /* CoreMedia.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMedia.framework; path = System/Library/Frameworks/CoreMedia.framework; sourceTree = SDKROOT; }; 186 | 6A5D9A2D15E01590001FAD14 /* CoreVideo.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreVideo.framework; path = System/Library/Frameworks/CoreVideo.framework; sourceTree = SDKROOT; }; 187 | 6A5D9A2F15E01598001FAD14 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; 188 | 6A5D9A3115E015A1001FAD14 /* OpenGLES.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = System/Library/Frameworks/OpenGLES.framework; sourceTree = SDKROOT; }; 189 | 6A5D9A3315E015B3001FAD14 /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; }; 190 | 6A5D9A4815E01B72001FAD14 /* GPUImage.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = GPUImage.xcodeproj; path = GPUImage/framework/GPUImage.xcodeproj; sourceTree = ""; }; 191 | 6A5D9A5815E01DA4001FAD14 /* AssetsLibrary.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AssetsLibrary.framework; path = System/Library/Frameworks/AssetsLibrary.framework; sourceTree = SDKROOT; }; 192 | 6A5D9A8615E02429001FAD14 /* DLCImagePickerController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DLCImagePickerController.h; sourceTree = ""; }; 193 | 6A5D9A8715E02429001FAD14 /* DLCImagePickerController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DLCImagePickerController.m; sourceTree = ""; }; 194 | 6A5D9A8915E02504001FAD14 /* PhotoViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PhotoViewController.h; sourceTree = ""; }; 195 | 6A5D9A8A15E02504001FAD14 /* PhotoViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PhotoViewController.m; sourceTree = ""; }; 196 | 6A5D9A9415E02527001FAD14 /* mask.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = mask.png; sourceTree = ""; }; 197 | 6A5D9A9615E02527001FAD14 /* dock_bg.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = dock_bg.png; sourceTree = ""; }; 198 | 6A5D9A9715E02527001FAD14 /* dock_bg@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "dock_bg@2x.png"; sourceTree = ""; }; 199 | 6A5D9A9815E02527001FAD14 /* micro_carbon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = micro_carbon.png; sourceTree = ""; }; 200 | 6A5D9A9915E02527001FAD14 /* micro_carbon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "micro_carbon@2x.png"; sourceTree = ""; }; 201 | 6A5D9A9A15E02527001FAD14 /* photo_bar.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = photo_bar.png; sourceTree = ""; }; 202 | 6A5D9A9B15E02527001FAD14 /* photo_bar@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "photo_bar@2x.png"; sourceTree = ""; }; 203 | 6A5D9AA915E0259A001FAD14 /* DLCImagePicker.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = DLCImagePicker.xib; sourceTree = ""; }; 204 | 7D0E5AB115E203FA009D19C9 /* purple-green.acv */ = {isa = PBXFileReference; lastKnownFileType = file; name = "purple-green.acv"; path = "Filters/purple-green.acv"; sourceTree = ""; }; 205 | 7D0E5AB215E203FA009D19C9 /* yellow-red.acv */ = {isa = PBXFileReference; lastKnownFileType = file; name = "yellow-red.acv"; path = "Filters/yellow-red.acv"; sourceTree = ""; }; 206 | 7D0E5AB615E2099C009D19C9 /* DLCGrayscaleContrastFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DLCGrayscaleContrastFilter.h; sourceTree = ""; }; 207 | 7D0E5AB715E209AD009D19C9 /* DLCGrayscaleContrastFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DLCGrayscaleContrastFilter.m; sourceTree = ""; }; 208 | 7D1E64B715E1FA2F005A9E09 /* crossprocess.acv */ = {isa = PBXFileReference; lastKnownFileType = file; name = crossprocess.acv; path = Filters/crossprocess.acv; sourceTree = ""; }; 209 | 7DEB4DC515E063420078BFAD /* sample1.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; name = sample1.jpg; path = Samples/sample1.jpg; sourceTree = ""; }; 210 | 7DFAE1B915E22A9F00C8236F /* aqua.acv */ = {isa = PBXFileReference; lastKnownFileType = file; name = aqua.acv; path = Filters/aqua.acv; sourceTree = ""; }; 211 | /* End PBXFileReference section */ 212 | 213 | /* Begin PBXFrameworksBuildPhase section */ 214 | 6A5D9A0D15E0152D001FAD14 /* Frameworks */ = { 215 | isa = PBXFrameworksBuildPhase; 216 | buildActionMask = 2147483647; 217 | files = ( 218 | 6A5D9A5915E01DA4001FAD14 /* AssetsLibrary.framework in Frameworks */, 219 | 6A5D9A5715E01BD7001FAD14 /* libGPUImage.a in Frameworks */, 220 | 6A5D9A3415E015B3001FAD14 /* AVFoundation.framework in Frameworks */, 221 | 6A5D9A3215E015A1001FAD14 /* OpenGLES.framework in Frameworks */, 222 | 6A5D9A3015E01598001FAD14 /* QuartzCore.framework in Frameworks */, 223 | 6A5D9A2E15E01590001FAD14 /* CoreVideo.framework in Frameworks */, 224 | 6A5D9A2C15E01587001FAD14 /* CoreMedia.framework in Frameworks */, 225 | 6A5D9A1515E0152D001FAD14 /* UIKit.framework in Frameworks */, 226 | 6A5D9A1715E0152D001FAD14 /* Foundation.framework in Frameworks */, 227 | 6A5D9A1915E0152D001FAD14 /* CoreGraphics.framework in Frameworks */, 228 | ); 229 | runOnlyForDeploymentPostprocessing = 0; 230 | }; 231 | /* End PBXFrameworksBuildPhase section */ 232 | 233 | /* Begin PBXGroup section */ 234 | 6A55309215E4868000019CC9 /* FilterSamples */ = { 235 | isa = PBXGroup; 236 | children = ( 237 | 6A5530B715E486E900019CC9 /* 10.jpg */, 238 | 6A5530B815E486E900019CC9 /* 10@2x.jpg */, 239 | 6A5530B315E486E300019CC9 /* 9.jpg */, 240 | 6A5530B415E486E300019CC9 /* 9@2x.jpg */, 241 | 6A5530AF15E486DD00019CC9 /* 8.jpg */, 242 | 6A5530B015E486DD00019CC9 /* 8@2x.jpg */, 243 | 6A5530AB15E486D500019CC9 /* 7.jpg */, 244 | 6A5530AC15E486D500019CC9 /* 7@2x.jpg */, 245 | 6A5530A715E486CB00019CC9 /* 6.jpg */, 246 | 6A5530A815E486CB00019CC9 /* 6@2x.jpg */, 247 | 6A5530A315E486C300019CC9 /* 5.jpg */, 248 | 6A5530A415E486C300019CC9 /* 5@2x.jpg */, 249 | 6A55309F15E486BB00019CC9 /* 4.jpg */, 250 | 6A5530A015E486BB00019CC9 /* 4@2x.jpg */, 251 | 6A55309B15E486B300019CC9 /* 3.jpg */, 252 | 6A55309C15E486B300019CC9 /* 3@2x.jpg */, 253 | 6A55309715E486A600019CC9 /* 2.jpg */, 254 | 6A55309815E486A600019CC9 /* 2@2x.jpg */, 255 | 6A55309315E4869600019CC9 /* 1.jpg */, 256 | 6A55309415E4869600019CC9 /* 1@2x.jpg */, 257 | ); 258 | path = FilterSamples; 259 | sourceTree = ""; 260 | }; 261 | 6A5D9A0515E0152D001FAD14 = { 262 | isa = PBXGroup; 263 | children = ( 264 | 6A5D9A8515E02429001FAD14 /* Classes */, 265 | 6A5D9AA815E0259A001FAD14 /* Resources */, 266 | 6A5D9A8C15E02527001FAD14 /* Images */, 267 | 6A5D9A1A15E0152D001FAD14 /* DLCImagePickerController */, 268 | 6A5D9A1315E0152D001FAD14 /* Frameworks */, 269 | 6A5D9A1115E0152D001FAD14 /* Products */, 270 | ); 271 | sourceTree = ""; 272 | usesTabs = 0; 273 | }; 274 | 6A5D9A1115E0152D001FAD14 /* Products */ = { 275 | isa = PBXGroup; 276 | children = ( 277 | 6A5D9A1015E0152D001FAD14 /* DLCImagePickerController.app */, 278 | ); 279 | name = Products; 280 | sourceTree = ""; 281 | }; 282 | 6A5D9A1315E0152D001FAD14 /* Frameworks */ = { 283 | isa = PBXGroup; 284 | children = ( 285 | 6A5D9A5815E01DA4001FAD14 /* AssetsLibrary.framework */, 286 | 6A5D9A4815E01B72001FAD14 /* GPUImage.xcodeproj */, 287 | 6A5D9A3315E015B3001FAD14 /* AVFoundation.framework */, 288 | 6A5D9A3115E015A1001FAD14 /* OpenGLES.framework */, 289 | 6A5D9A2F15E01598001FAD14 /* QuartzCore.framework */, 290 | 6A5D9A2D15E01590001FAD14 /* CoreVideo.framework */, 291 | 6A5D9A2B15E01587001FAD14 /* CoreMedia.framework */, 292 | 6A5D9A1415E0152D001FAD14 /* UIKit.framework */, 293 | 6A5D9A1615E0152D001FAD14 /* Foundation.framework */, 294 | 6A5D9A1815E0152D001FAD14 /* CoreGraphics.framework */, 295 | ); 296 | name = Frameworks; 297 | sourceTree = ""; 298 | }; 299 | 6A5D9A1A15E0152D001FAD14 /* DLCImagePickerController */ = { 300 | isa = PBXGroup; 301 | children = ( 302 | 6A0D0A27165A218F0028E1B6 /* Default-568h@2x.png */, 303 | 6A5D9A2315E0152D001FAD14 /* AppDelegate.h */, 304 | 6A5D9A2415E0152D001FAD14 /* AppDelegate.m */, 305 | 6A5D9A1B15E0152D001FAD14 /* Supporting Files */, 306 | ); 307 | path = DLCImagePickerController; 308 | sourceTree = ""; 309 | }; 310 | 6A5D9A1B15E0152D001FAD14 /* Supporting Files */ = { 311 | isa = PBXGroup; 312 | children = ( 313 | 6A5D9A1C15E0152D001FAD14 /* DLCImagePickerController-Info.plist */, 314 | 6A5D9A1D15E0152D001FAD14 /* InfoPlist.strings */, 315 | 6A5D9A2015E0152D001FAD14 /* main.m */, 316 | 6A5D9A2215E0152D001FAD14 /* DLCImagePickerController-Prefix.pch */, 317 | ); 318 | name = "Supporting Files"; 319 | sourceTree = ""; 320 | }; 321 | 6A5D9A4915E01B72001FAD14 /* Products */ = { 322 | isa = PBXGroup; 323 | children = ( 324 | 6A5D9A5215E01B72001FAD14 /* libGPUImage.a */, 325 | 6A5D9A5415E01B72001FAD14 /* GPUImageTests.octest */, 326 | ); 327 | name = Products; 328 | sourceTree = ""; 329 | }; 330 | 6A5D9A8515E02429001FAD14 /* Classes */ = { 331 | isa = PBXGroup; 332 | children = ( 333 | D2506222176226B4009DAE39 /* DLCImagePickerViewController */, 334 | 6A5D9A8915E02504001FAD14 /* PhotoViewController.h */, 335 | 6A5D9A8A15E02504001FAD14 /* PhotoViewController.m */, 336 | ); 337 | path = Classes; 338 | sourceTree = ""; 339 | }; 340 | 6A5D9A8C15E02527001FAD14 /* Images */ = { 341 | isa = PBXGroup; 342 | children = ( 343 | 6A55309215E4868000019CC9 /* FilterSamples */, 344 | 7D643C2E15E05FBF0035A22D /* Samples */, 345 | 6A5D9A9215E02527001FAD14 /* Overlays */, 346 | 6A5D9A9515E02527001FAD14 /* UI */, 347 | ); 348 | path = Images; 349 | sourceTree = ""; 350 | }; 351 | 6A5D9A9215E02527001FAD14 /* Overlays */ = { 352 | isa = PBXGroup; 353 | children = ( 354 | 6A49CEA615E345070098304F /* blackframe.png */, 355 | 6A5D9A9415E02527001FAD14 /* mask.png */, 356 | ); 357 | path = Overlays; 358 | sourceTree = ""; 359 | }; 360 | 6A5D9A9515E02527001FAD14 /* UI */ = { 361 | isa = PBXGroup; 362 | children = ( 363 | 6A0D0A0D165A1FFC0028E1B6 /* focus-crosshair.png */, 364 | 6A0D0A0E165A1FFC0028E1B6 /* focus-crosshair@2x.png */, 365 | 6A23390C15E6C17000CC6CB2 /* library@2x.png */, 366 | 6A23390D15E6C17000CC6CB2 /* library.png */, 367 | 6A42CF7415E46F0E0062D3E7 /* blur-on.png */, 368 | 6A42CF7515E46F0E0062D3E7 /* blur-on@2x.png */, 369 | 6A49CF0815E461D10098304F /* close.png */, 370 | 6A49CF0915E461D10098304F /* close@2x.png */, 371 | 6A49CF0415E461B30098304F /* blur.png */, 372 | 6A49CF0515E461B30098304F /* blur@2x.png */, 373 | 6A49CF0015E4617A0098304F /* front-camera.png */, 374 | 6A49CF0115E4617A0098304F /* front-camera@2x.png */, 375 | 6A49CEF415E461670098304F /* flash-auto.png */, 376 | 6A49CEF515E461670098304F /* flash-auto@2x.png */, 377 | 6A49CEF615E461670098304F /* flash-off.png */, 378 | 6A49CEF715E461670098304F /* flash-off@2x.png */, 379 | 6A49CEF815E461670098304F /* flash.png */, 380 | 6A49CEF915E461670098304F /* flash@2x.png */, 381 | 6A49CEF015E460540098304F /* filter.png */, 382 | 6A49CEF115E460540098304F /* filter@2x.png */, 383 | 6A49CEE815E45A5F0098304F /* camera-button.png */, 384 | 6A49CEE915E45A5F0098304F /* camera-button@2x.png */, 385 | 6A49CEEA15E45A5F0098304F /* camera-icon.png */, 386 | 6A49CEEB15E45A5F0098304F /* camera-icon@2x.png */, 387 | 6A49CED415E459B00098304F /* filter-close.png */, 388 | 6A49CED515E459B00098304F /* filter-close@2x.png */, 389 | 6A49CED615E459B00098304F /* filter-open.png */, 390 | 6A49CED715E459B00098304F /* filter-open@2x.png */, 391 | 6A5D9A9615E02527001FAD14 /* dock_bg.png */, 392 | 6A5D9A9715E02527001FAD14 /* dock_bg@2x.png */, 393 | 6A5D9A9815E02527001FAD14 /* micro_carbon.png */, 394 | 6A5D9A9915E02527001FAD14 /* micro_carbon@2x.png */, 395 | 6A5D9A9A15E02527001FAD14 /* photo_bar.png */, 396 | 6A5D9A9B15E02527001FAD14 /* photo_bar@2x.png */, 397 | ); 398 | path = UI; 399 | sourceTree = ""; 400 | }; 401 | 6A5D9AA815E0259A001FAD14 /* Resources */ = { 402 | isa = PBXGroup; 403 | children = ( 404 | 7D1E64B615E1F8D9005A9E09 /* Curves */, 405 | 6A5D9AA915E0259A001FAD14 /* DLCImagePicker.xib */, 406 | ); 407 | path = Resources; 408 | sourceTree = ""; 409 | }; 410 | 7D0E5AB515E20987009D19C9 /* Filters */ = { 411 | isa = PBXGroup; 412 | children = ( 413 | 7D0E5AB615E2099C009D19C9 /* DLCGrayscaleContrastFilter.h */, 414 | 7D0E5AB715E209AD009D19C9 /* DLCGrayscaleContrastFilter.m */, 415 | ); 416 | name = Filters; 417 | sourceTree = ""; 418 | }; 419 | 7D1E64B615E1F8D9005A9E09 /* Curves */ = { 420 | isa = PBXGroup; 421 | children = ( 422 | 7DFAE1B915E22A9F00C8236F /* aqua.acv */, 423 | 6A5BBDA515E2214B00B1B485 /* 02.acv */, 424 | 6A5BBDA615E2214B00B1B485 /* 06.acv */, 425 | 6A5BBDA715E2214B00B1B485 /* 17.acv */, 426 | 7D0E5AB115E203FA009D19C9 /* purple-green.acv */, 427 | 7D0E5AB215E203FA009D19C9 /* yellow-red.acv */, 428 | 7D1E64B715E1FA2F005A9E09 /* crossprocess.acv */, 429 | ); 430 | name = Curves; 431 | sourceTree = ""; 432 | }; 433 | 7D643C2E15E05FBF0035A22D /* Samples */ = { 434 | isa = PBXGroup; 435 | children = ( 436 | 7DEB4DC515E063420078BFAD /* sample1.jpg */, 437 | ); 438 | name = Samples; 439 | sourceTree = ""; 440 | }; 441 | D2506222176226B4009DAE39 /* DLCImagePickerViewController */ = { 442 | isa = PBXGroup; 443 | children = ( 444 | 6A5D9A8615E02429001FAD14 /* DLCImagePickerController.h */, 445 | 6A5D9A8715E02429001FAD14 /* DLCImagePickerController.m */, 446 | 6A0D09FF165A1CBE0028E1B6 /* DLCBlurOverlayView.h */, 447 | 6A0D0A00165A1CBE0028E1B6 /* DLCBlurOverlayView.m */, 448 | 7D0E5AB515E20987009D19C9 /* Filters */, 449 | ); 450 | name = DLCImagePickerViewController; 451 | sourceTree = ""; 452 | }; 453 | /* End PBXGroup section */ 454 | 455 | /* Begin PBXNativeTarget section */ 456 | 6A5D9A0F15E0152D001FAD14 /* DLCImagePickerController */ = { 457 | isa = PBXNativeTarget; 458 | buildConfigurationList = 6A5D9A2815E0152E001FAD14 /* Build configuration list for PBXNativeTarget "DLCImagePickerController" */; 459 | buildPhases = ( 460 | 6A5D9A0C15E0152D001FAD14 /* Sources */, 461 | 6A5D9A0D15E0152D001FAD14 /* Frameworks */, 462 | 6A5D9A0E15E0152D001FAD14 /* Resources */, 463 | ); 464 | buildRules = ( 465 | ); 466 | dependencies = ( 467 | 6A5D9A5615E01BC2001FAD14 /* PBXTargetDependency */, 468 | ); 469 | name = DLCImagePickerController; 470 | productName = DLCImagePickerController; 471 | productReference = 6A5D9A1015E0152D001FAD14 /* DLCImagePickerController.app */; 472 | productType = "com.apple.product-type.application"; 473 | }; 474 | /* End PBXNativeTarget section */ 475 | 476 | /* Begin PBXProject section */ 477 | 6A5D9A0715E0152D001FAD14 /* Project object */ = { 478 | isa = PBXProject; 479 | attributes = { 480 | LastUpgradeCheck = 0460; 481 | ORGANIZATIONNAME = "Backspaces Inc"; 482 | }; 483 | buildConfigurationList = 6A5D9A0A15E0152D001FAD14 /* Build configuration list for PBXProject "DLCImagePickerController" */; 484 | compatibilityVersion = "Xcode 3.2"; 485 | developmentRegion = English; 486 | hasScannedForEncodings = 0; 487 | knownRegions = ( 488 | en, 489 | ); 490 | mainGroup = 6A5D9A0515E0152D001FAD14; 491 | productRefGroup = 6A5D9A1115E0152D001FAD14 /* Products */; 492 | projectDirPath = ""; 493 | projectReferences = ( 494 | { 495 | ProductGroup = 6A5D9A4915E01B72001FAD14 /* Products */; 496 | ProjectRef = 6A5D9A4815E01B72001FAD14 /* GPUImage.xcodeproj */; 497 | }, 498 | ); 499 | projectRoot = ""; 500 | targets = ( 501 | 6A5D9A0F15E0152D001FAD14 /* DLCImagePickerController */, 502 | ); 503 | }; 504 | /* End PBXProject section */ 505 | 506 | /* Begin PBXReferenceProxy section */ 507 | 6A5D9A5215E01B72001FAD14 /* libGPUImage.a */ = { 508 | isa = PBXReferenceProxy; 509 | fileType = archive.ar; 510 | path = libGPUImage.a; 511 | remoteRef = 6A5D9A5115E01B72001FAD14 /* PBXContainerItemProxy */; 512 | sourceTree = BUILT_PRODUCTS_DIR; 513 | }; 514 | 6A5D9A5415E01B72001FAD14 /* GPUImageTests.octest */ = { 515 | isa = PBXReferenceProxy; 516 | fileType = wrapper.cfbundle; 517 | path = GPUImageTests.octest; 518 | remoteRef = 6A5D9A5315E01B72001FAD14 /* PBXContainerItemProxy */; 519 | sourceTree = BUILT_PRODUCTS_DIR; 520 | }; 521 | /* End PBXReferenceProxy section */ 522 | 523 | /* Begin PBXResourcesBuildPhase section */ 524 | 6A5D9A0E15E0152D001FAD14 /* Resources */ = { 525 | isa = PBXResourcesBuildPhase; 526 | buildActionMask = 2147483647; 527 | files = ( 528 | 6A5D9A1F15E0152D001FAD14 /* InfoPlist.strings in Resources */, 529 | 6A5D9AA115E02527001FAD14 /* mask.png in Resources */, 530 | 6A5D9AA215E02527001FAD14 /* dock_bg.png in Resources */, 531 | 6A5D9AA315E02527001FAD14 /* dock_bg@2x.png in Resources */, 532 | 6A5D9AA415E02527001FAD14 /* micro_carbon.png in Resources */, 533 | 6A5D9AA515E02527001FAD14 /* micro_carbon@2x.png in Resources */, 534 | 6A5D9AA615E02527001FAD14 /* photo_bar.png in Resources */, 535 | 6A5D9AA715E02527001FAD14 /* photo_bar@2x.png in Resources */, 536 | 6A5D9AAA15E0259A001FAD14 /* DLCImagePicker.xib in Resources */, 537 | 7DEB4DC615E063420078BFAD /* sample1.jpg in Resources */, 538 | 7D1E64B915E1FA2F005A9E09 /* crossprocess.acv in Resources */, 539 | 7D0E5AB315E203FA009D19C9 /* purple-green.acv in Resources */, 540 | 7D0E5AB415E203FA009D19C9 /* yellow-red.acv in Resources */, 541 | 6A5BBDA815E2214B00B1B485 /* 02.acv in Resources */, 542 | 6A5BBDA915E2214B00B1B485 /* 06.acv in Resources */, 543 | 6A5BBDAA15E2214B00B1B485 /* 17.acv in Resources */, 544 | 7DFAE1BA15E22A9F00C8236F /* aqua.acv in Resources */, 545 | 6A49CEA715E345070098304F /* blackframe.png in Resources */, 546 | 6A49CED815E459B00098304F /* filter-close.png in Resources */, 547 | 6A49CED915E459B00098304F /* filter-close@2x.png in Resources */, 548 | 6A49CEDA15E459B00098304F /* filter-open.png in Resources */, 549 | 6A49CEDB15E459B00098304F /* filter-open@2x.png in Resources */, 550 | 6A49CEEC15E45A5F0098304F /* camera-button.png in Resources */, 551 | 6A49CEED15E45A5F0098304F /* camera-button@2x.png in Resources */, 552 | 6A49CEEE15E45A5F0098304F /* camera-icon.png in Resources */, 553 | 6A49CEEF15E45A5F0098304F /* camera-icon@2x.png in Resources */, 554 | 6A49CEF215E460540098304F /* filter.png in Resources */, 555 | 6A49CEF315E460540098304F /* filter@2x.png in Resources */, 556 | 6A49CEFA15E461670098304F /* flash-auto.png in Resources */, 557 | 6A49CEFB15E461670098304F /* flash-auto@2x.png in Resources */, 558 | 6A49CEFC15E461670098304F /* flash-off.png in Resources */, 559 | 6A49CEFD15E461670098304F /* flash-off@2x.png in Resources */, 560 | 6A49CEFE15E461670098304F /* flash.png in Resources */, 561 | 6A49CEFF15E461670098304F /* flash@2x.png in Resources */, 562 | 6A49CF0215E4617A0098304F /* front-camera.png in Resources */, 563 | 6A49CF0315E4617A0098304F /* front-camera@2x.png in Resources */, 564 | 6A49CF0615E461B30098304F /* blur.png in Resources */, 565 | 6A49CF0715E461B30098304F /* blur@2x.png in Resources */, 566 | 6A49CF0A15E461D10098304F /* close.png in Resources */, 567 | 6A49CF0B15E461D10098304F /* close@2x.png in Resources */, 568 | 6A42CF7615E46F0E0062D3E7 /* blur-on.png in Resources */, 569 | 6A42CF7715E46F0E0062D3E7 /* blur-on@2x.png in Resources */, 570 | 6A55309515E4869600019CC9 /* 1.jpg in Resources */, 571 | 6A55309615E4869600019CC9 /* 1@2x.jpg in Resources */, 572 | 6A55309915E486A600019CC9 /* 2.jpg in Resources */, 573 | 6A55309A15E486A600019CC9 /* 2@2x.jpg in Resources */, 574 | 6A55309D15E486B300019CC9 /* 3.jpg in Resources */, 575 | 6A55309E15E486B300019CC9 /* 3@2x.jpg in Resources */, 576 | 6A5530A115E486BB00019CC9 /* 4.jpg in Resources */, 577 | 6A5530A215E486BB00019CC9 /* 4@2x.jpg in Resources */, 578 | 6A5530A515E486C300019CC9 /* 5.jpg in Resources */, 579 | 6A5530A615E486C300019CC9 /* 5@2x.jpg in Resources */, 580 | 6A5530A915E486CB00019CC9 /* 6.jpg in Resources */, 581 | 6A5530AA15E486CB00019CC9 /* 6@2x.jpg in Resources */, 582 | 6A5530AD15E486D500019CC9 /* 7.jpg in Resources */, 583 | 6A5530AE15E486D500019CC9 /* 7@2x.jpg in Resources */, 584 | 6A5530B115E486DD00019CC9 /* 8.jpg in Resources */, 585 | 6A5530B215E486DD00019CC9 /* 8@2x.jpg in Resources */, 586 | 6A5530B515E486E300019CC9 /* 9.jpg in Resources */, 587 | 6A5530B615E486E300019CC9 /* 9@2x.jpg in Resources */, 588 | 6A5530B915E486E900019CC9 /* 10.jpg in Resources */, 589 | 6A5530BA15E486E900019CC9 /* 10@2x.jpg in Resources */, 590 | 6A23390E15E6C17000CC6CB2 /* library@2x.png in Resources */, 591 | 6A23390F15E6C17000CC6CB2 /* library.png in Resources */, 592 | 6A0D0A0F165A1FFC0028E1B6 /* focus-crosshair.png in Resources */, 593 | 6A0D0A10165A1FFC0028E1B6 /* focus-crosshair@2x.png in Resources */, 594 | 6A0D0A28165A218F0028E1B6 /* Default-568h@2x.png in Resources */, 595 | ); 596 | runOnlyForDeploymentPostprocessing = 0; 597 | }; 598 | /* End PBXResourcesBuildPhase section */ 599 | 600 | /* Begin PBXSourcesBuildPhase section */ 601 | 6A5D9A0C15E0152D001FAD14 /* Sources */ = { 602 | isa = PBXSourcesBuildPhase; 603 | buildActionMask = 2147483647; 604 | files = ( 605 | 6A5D9A2115E0152D001FAD14 /* main.m in Sources */, 606 | 6A5D9A2515E0152E001FAD14 /* AppDelegate.m in Sources */, 607 | 6A5D9A8815E02429001FAD14 /* DLCImagePickerController.m in Sources */, 608 | 6A5D9A8B15E02504001FAD14 /* PhotoViewController.m in Sources */, 609 | 7D0E5AB815E209AD009D19C9 /* DLCGrayscaleContrastFilter.m in Sources */, 610 | 6A0D0A01165A1CBE0028E1B6 /* DLCBlurOverlayView.m in Sources */, 611 | ); 612 | runOnlyForDeploymentPostprocessing = 0; 613 | }; 614 | /* End PBXSourcesBuildPhase section */ 615 | 616 | /* Begin PBXTargetDependency section */ 617 | 6A5D9A5615E01BC2001FAD14 /* PBXTargetDependency */ = { 618 | isa = PBXTargetDependency; 619 | name = GPUImage; 620 | targetProxy = 6A5D9A5515E01BC2001FAD14 /* PBXContainerItemProxy */; 621 | }; 622 | /* End PBXTargetDependency section */ 623 | 624 | /* Begin PBXVariantGroup section */ 625 | 6A5D9A1D15E0152D001FAD14 /* InfoPlist.strings */ = { 626 | isa = PBXVariantGroup; 627 | children = ( 628 | 6A5D9A1E15E0152D001FAD14 /* en */, 629 | ); 630 | name = InfoPlist.strings; 631 | sourceTree = ""; 632 | }; 633 | /* End PBXVariantGroup section */ 634 | 635 | /* Begin XCBuildConfiguration section */ 636 | 6A5D9A2615E0152E001FAD14 /* Debug */ = { 637 | isa = XCBuildConfiguration; 638 | buildSettings = { 639 | ALWAYS_SEARCH_USER_PATHS = NO; 640 | ARCHS = "$(ARCHS_STANDARD_32_BIT)"; 641 | CLANG_ENABLE_OBJC_ARC = YES; 642 | CLANG_WARN_CONSTANT_CONVERSION = YES; 643 | CLANG_WARN_ENUM_CONVERSION = YES; 644 | CLANG_WARN_INT_CONVERSION = YES; 645 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 646 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 647 | COPY_PHASE_STRIP = NO; 648 | GCC_C_LANGUAGE_STANDARD = gnu99; 649 | GCC_DYNAMIC_NO_PIC = NO; 650 | GCC_OPTIMIZATION_LEVEL = 0; 651 | GCC_PREPROCESSOR_DEFINITIONS = ( 652 | "DEBUG=1", 653 | "$(inherited)", 654 | ); 655 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 656 | GCC_VERSION = com.apple.compilers.llvm.clang.1_0; 657 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 658 | GCC_WARN_UNINITIALIZED_AUTOS = YES; 659 | GCC_WARN_UNUSED_VARIABLE = YES; 660 | HEADER_SEARCH_PATHS = "GPUImage/framework/**"; 661 | IPHONEOS_DEPLOYMENT_TARGET = 4.3; 662 | SDKROOT = iphoneos; 663 | }; 664 | name = Debug; 665 | }; 666 | 6A5D9A2715E0152E001FAD14 /* Release */ = { 667 | isa = XCBuildConfiguration; 668 | buildSettings = { 669 | ALWAYS_SEARCH_USER_PATHS = NO; 670 | ARCHS = "$(ARCHS_STANDARD_32_BIT)"; 671 | CLANG_ENABLE_OBJC_ARC = YES; 672 | CLANG_WARN_CONSTANT_CONVERSION = YES; 673 | CLANG_WARN_ENUM_CONVERSION = YES; 674 | CLANG_WARN_INT_CONVERSION = YES; 675 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 676 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 677 | COPY_PHASE_STRIP = YES; 678 | GCC_C_LANGUAGE_STANDARD = gnu99; 679 | GCC_VERSION = com.apple.compilers.llvm.clang.1_0; 680 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 681 | GCC_WARN_UNINITIALIZED_AUTOS = YES; 682 | GCC_WARN_UNUSED_VARIABLE = YES; 683 | HEADER_SEARCH_PATHS = "GPUImage/framework/**"; 684 | IPHONEOS_DEPLOYMENT_TARGET = 4.3; 685 | OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; 686 | SDKROOT = iphoneos; 687 | VALIDATE_PRODUCT = YES; 688 | }; 689 | name = Release; 690 | }; 691 | 6A5D9A2915E0152E001FAD14 /* Debug */ = { 692 | isa = XCBuildConfiguration; 693 | buildSettings = { 694 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 695 | GCC_PREFIX_HEADER = "DLCImagePickerController/DLCImagePickerController-Prefix.pch"; 696 | INFOPLIST_FILE = "DLCImagePickerController/DLCImagePickerController-Info.plist"; 697 | IPHONEOS_DEPLOYMENT_TARGET = 5.0; 698 | PRODUCT_NAME = "$(TARGET_NAME)"; 699 | WRAPPER_EXTENSION = app; 700 | }; 701 | name = Debug; 702 | }; 703 | 6A5D9A2A15E0152E001FAD14 /* Release */ = { 704 | isa = XCBuildConfiguration; 705 | buildSettings = { 706 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 707 | GCC_PREFIX_HEADER = "DLCImagePickerController/DLCImagePickerController-Prefix.pch"; 708 | INFOPLIST_FILE = "DLCImagePickerController/DLCImagePickerController-Info.plist"; 709 | IPHONEOS_DEPLOYMENT_TARGET = 5.0; 710 | PRODUCT_NAME = "$(TARGET_NAME)"; 711 | WRAPPER_EXTENSION = app; 712 | }; 713 | name = Release; 714 | }; 715 | /* End XCBuildConfiguration section */ 716 | 717 | /* Begin XCConfigurationList section */ 718 | 6A5D9A0A15E0152D001FAD14 /* Build configuration list for PBXProject "DLCImagePickerController" */ = { 719 | isa = XCConfigurationList; 720 | buildConfigurations = ( 721 | 6A5D9A2615E0152E001FAD14 /* Debug */, 722 | 6A5D9A2715E0152E001FAD14 /* Release */, 723 | ); 724 | defaultConfigurationIsVisible = 0; 725 | defaultConfigurationName = Release; 726 | }; 727 | 6A5D9A2815E0152E001FAD14 /* Build configuration list for PBXNativeTarget "DLCImagePickerController" */ = { 728 | isa = XCConfigurationList; 729 | buildConfigurations = ( 730 | 6A5D9A2915E0152E001FAD14 /* Debug */, 731 | 6A5D9A2A15E0152E001FAD14 /* Release */, 732 | ); 733 | defaultConfigurationIsVisible = 0; 734 | defaultConfigurationName = Release; 735 | }; 736 | /* End XCConfigurationList section */ 737 | }; 738 | rootObject = 6A5D9A0715E0152D001FAD14 /* Project object */; 739 | } 740 | -------------------------------------------------------------------------------- /DLCImagePickerController/AppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.h 3 | // DLCImagePickerController 4 | // 5 | // Created by Dmitri Cherniak on 8/18/12. 6 | // Copyright (c) 2012 DLC Inc. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface AppDelegate : UIResponder 12 | 13 | @property (strong, nonatomic) UIWindow *window; 14 | @property (retain, nonatomic) UIViewController *rootViewController; 15 | 16 | @end 17 | -------------------------------------------------------------------------------- /DLCImagePickerController/AppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.m 3 | // DLCImagePickerController 4 | // 5 | // Created by Dmitri Cherniak on 8/18/12. 6 | // Copyright (c) 2012 DLC Inc. All rights reserved. 7 | // 8 | 9 | #import "AppDelegate.h" 10 | #import "PhotoViewController.h" 11 | 12 | @implementation AppDelegate 13 | 14 | @synthesize window = _window; 15 | @synthesize rootViewController = _rootViewController; 16 | 17 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 18 | { 19 | self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 20 | // Override point for customization after application launch. 21 | self.window.backgroundColor = [UIColor whiteColor]; 22 | self.rootViewController = [[PhotoViewController alloc] init]; 23 | self.rootViewController.view.frame = [[UIScreen mainScreen] bounds]; 24 | [self.window addSubview:self.rootViewController.view]; 25 | self.window.rootViewController = self.rootViewController; 26 | [self.window makeKeyAndVisible]; 27 | return YES; 28 | } 29 | 30 | - (void)applicationWillResignActive:(UIApplication *)application 31 | { 32 | // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. 33 | // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. 34 | } 35 | 36 | - (void)applicationDidEnterBackground:(UIApplication *)application 37 | { 38 | // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 39 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 40 | } 41 | 42 | - (void)applicationWillEnterForeground:(UIApplication *)application 43 | { 44 | // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. 45 | } 46 | 47 | - (void)applicationDidBecomeActive:(UIApplication *)application 48 | { 49 | // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. 50 | } 51 | 52 | - (void)applicationWillTerminate:(UIApplication *)application 53 | { 54 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 55 | } 56 | 57 | @end 58 | -------------------------------------------------------------------------------- /DLCImagePickerController/DLCImagePickerController-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleDisplayName 8 | ${PRODUCT_NAME} 9 | CFBundleExecutable 10 | ${EXECUTABLE_NAME} 11 | CFBundleIdentifier 12 | com.backspaces.${PRODUCT_NAME:rfc1034identifier} 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | ${PRODUCT_NAME} 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | 1.0 21 | CFBundleSignature 22 | ???? 23 | CFBundleVersion 24 | 1.0 25 | LSRequiresIPhoneOS 26 | 27 | UIRequiredDeviceCapabilities 28 | 29 | armv7 30 | 31 | UISupportedInterfaceOrientations 32 | 33 | UIInterfaceOrientationPortrait 34 | UIInterfaceOrientationLandscapeLeft 35 | UIInterfaceOrientationLandscapeRight 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /DLCImagePickerController/DLCImagePickerController-Prefix.pch: -------------------------------------------------------------------------------- 1 | // 2 | // Prefix header for all source files of the 'DLCImagePickerController' target in the 'DLCImagePickerController' project 3 | // 4 | 5 | #import 6 | 7 | #ifndef __IPHONE_3_0 8 | #warning "This project uses features only available in iOS SDK 3.0 and later." 9 | #endif 10 | 11 | #ifdef __OBJC__ 12 | #import 13 | #import 14 | #endif 15 | -------------------------------------------------------------------------------- /DLCImagePickerController/en.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Localized versions of Info.plist keys */ 2 | 3 | -------------------------------------------------------------------------------- /DLCImagePickerController/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // DLCImagePickerController 4 | // 5 | // Created by Dmitri Cherniak on 8/18/12. 6 | // Copyright (c) 2012 DLC Inc. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | #import "AppDelegate.h" 12 | 13 | int main(int argc, char *argv[]) 14 | { 15 | @autoreleasepool { 16 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /Default-568h@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmitric/DLCImagePickerController/e8ecbb1d9c937ee4bba111d99c7b9648d8430e72/Default-568h@2x.png -------------------------------------------------------------------------------- /Images/FilterSamples/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmitric/DLCImagePickerController/e8ecbb1d9c937ee4bba111d99c7b9648d8430e72/Images/FilterSamples/1.jpg -------------------------------------------------------------------------------- /Images/FilterSamples/10.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmitric/DLCImagePickerController/e8ecbb1d9c937ee4bba111d99c7b9648d8430e72/Images/FilterSamples/10.jpg -------------------------------------------------------------------------------- /Images/FilterSamples/10@2x.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmitric/DLCImagePickerController/e8ecbb1d9c937ee4bba111d99c7b9648d8430e72/Images/FilterSamples/10@2x.jpg -------------------------------------------------------------------------------- /Images/FilterSamples/1@2x.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmitric/DLCImagePickerController/e8ecbb1d9c937ee4bba111d99c7b9648d8430e72/Images/FilterSamples/1@2x.jpg -------------------------------------------------------------------------------- /Images/FilterSamples/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmitric/DLCImagePickerController/e8ecbb1d9c937ee4bba111d99c7b9648d8430e72/Images/FilterSamples/2.jpg -------------------------------------------------------------------------------- /Images/FilterSamples/2@2x.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmitric/DLCImagePickerController/e8ecbb1d9c937ee4bba111d99c7b9648d8430e72/Images/FilterSamples/2@2x.jpg -------------------------------------------------------------------------------- /Images/FilterSamples/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmitric/DLCImagePickerController/e8ecbb1d9c937ee4bba111d99c7b9648d8430e72/Images/FilterSamples/3.jpg -------------------------------------------------------------------------------- /Images/FilterSamples/3@2x.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmitric/DLCImagePickerController/e8ecbb1d9c937ee4bba111d99c7b9648d8430e72/Images/FilterSamples/3@2x.jpg -------------------------------------------------------------------------------- /Images/FilterSamples/4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmitric/DLCImagePickerController/e8ecbb1d9c937ee4bba111d99c7b9648d8430e72/Images/FilterSamples/4.jpg -------------------------------------------------------------------------------- /Images/FilterSamples/4@2x.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmitric/DLCImagePickerController/e8ecbb1d9c937ee4bba111d99c7b9648d8430e72/Images/FilterSamples/4@2x.jpg -------------------------------------------------------------------------------- /Images/FilterSamples/5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmitric/DLCImagePickerController/e8ecbb1d9c937ee4bba111d99c7b9648d8430e72/Images/FilterSamples/5.jpg -------------------------------------------------------------------------------- /Images/FilterSamples/5@2x.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmitric/DLCImagePickerController/e8ecbb1d9c937ee4bba111d99c7b9648d8430e72/Images/FilterSamples/5@2x.jpg -------------------------------------------------------------------------------- /Images/FilterSamples/6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmitric/DLCImagePickerController/e8ecbb1d9c937ee4bba111d99c7b9648d8430e72/Images/FilterSamples/6.jpg -------------------------------------------------------------------------------- /Images/FilterSamples/6@2x.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmitric/DLCImagePickerController/e8ecbb1d9c937ee4bba111d99c7b9648d8430e72/Images/FilterSamples/6@2x.jpg -------------------------------------------------------------------------------- /Images/FilterSamples/7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmitric/DLCImagePickerController/e8ecbb1d9c937ee4bba111d99c7b9648d8430e72/Images/FilterSamples/7.jpg -------------------------------------------------------------------------------- /Images/FilterSamples/7@2x.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmitric/DLCImagePickerController/e8ecbb1d9c937ee4bba111d99c7b9648d8430e72/Images/FilterSamples/7@2x.jpg -------------------------------------------------------------------------------- /Images/FilterSamples/8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmitric/DLCImagePickerController/e8ecbb1d9c937ee4bba111d99c7b9648d8430e72/Images/FilterSamples/8.jpg -------------------------------------------------------------------------------- /Images/FilterSamples/8@2x.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmitric/DLCImagePickerController/e8ecbb1d9c937ee4bba111d99c7b9648d8430e72/Images/FilterSamples/8@2x.jpg -------------------------------------------------------------------------------- /Images/FilterSamples/9.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmitric/DLCImagePickerController/e8ecbb1d9c937ee4bba111d99c7b9648d8430e72/Images/FilterSamples/9.jpg -------------------------------------------------------------------------------- /Images/FilterSamples/9@2x.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmitric/DLCImagePickerController/e8ecbb1d9c937ee4bba111d99c7b9648d8430e72/Images/FilterSamples/9@2x.jpg -------------------------------------------------------------------------------- /Images/Overlays/blackframe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmitric/DLCImagePickerController/e8ecbb1d9c937ee4bba111d99c7b9648d8430e72/Images/Overlays/blackframe.png -------------------------------------------------------------------------------- /Images/Overlays/mask.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmitric/DLCImagePickerController/e8ecbb1d9c937ee4bba111d99c7b9648d8430e72/Images/Overlays/mask.png -------------------------------------------------------------------------------- /Images/Samples/sample1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmitric/DLCImagePickerController/e8ecbb1d9c937ee4bba111d99c7b9648d8430e72/Images/Samples/sample1.jpg -------------------------------------------------------------------------------- /Images/UI/blur-on.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmitric/DLCImagePickerController/e8ecbb1d9c937ee4bba111d99c7b9648d8430e72/Images/UI/blur-on.png -------------------------------------------------------------------------------- /Images/UI/blur-on@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmitric/DLCImagePickerController/e8ecbb1d9c937ee4bba111d99c7b9648d8430e72/Images/UI/blur-on@2x.png -------------------------------------------------------------------------------- /Images/UI/blur.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmitric/DLCImagePickerController/e8ecbb1d9c937ee4bba111d99c7b9648d8430e72/Images/UI/blur.png -------------------------------------------------------------------------------- /Images/UI/blur@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmitric/DLCImagePickerController/e8ecbb1d9c937ee4bba111d99c7b9648d8430e72/Images/UI/blur@2x.png -------------------------------------------------------------------------------- /Images/UI/camera-button.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmitric/DLCImagePickerController/e8ecbb1d9c937ee4bba111d99c7b9648d8430e72/Images/UI/camera-button.png -------------------------------------------------------------------------------- /Images/UI/camera-button@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmitric/DLCImagePickerController/e8ecbb1d9c937ee4bba111d99c7b9648d8430e72/Images/UI/camera-button@2x.png -------------------------------------------------------------------------------- /Images/UI/camera-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmitric/DLCImagePickerController/e8ecbb1d9c937ee4bba111d99c7b9648d8430e72/Images/UI/camera-icon.png -------------------------------------------------------------------------------- /Images/UI/camera-icon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmitric/DLCImagePickerController/e8ecbb1d9c937ee4bba111d99c7b9648d8430e72/Images/UI/camera-icon@2x.png -------------------------------------------------------------------------------- /Images/UI/close.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmitric/DLCImagePickerController/e8ecbb1d9c937ee4bba111d99c7b9648d8430e72/Images/UI/close.png -------------------------------------------------------------------------------- /Images/UI/close@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmitric/DLCImagePickerController/e8ecbb1d9c937ee4bba111d99c7b9648d8430e72/Images/UI/close@2x.png -------------------------------------------------------------------------------- /Images/UI/dock_bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmitric/DLCImagePickerController/e8ecbb1d9c937ee4bba111d99c7b9648d8430e72/Images/UI/dock_bg.png -------------------------------------------------------------------------------- /Images/UI/dock_bg@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmitric/DLCImagePickerController/e8ecbb1d9c937ee4bba111d99c7b9648d8430e72/Images/UI/dock_bg@2x.png -------------------------------------------------------------------------------- /Images/UI/filter-close.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmitric/DLCImagePickerController/e8ecbb1d9c937ee4bba111d99c7b9648d8430e72/Images/UI/filter-close.png -------------------------------------------------------------------------------- /Images/UI/filter-close@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmitric/DLCImagePickerController/e8ecbb1d9c937ee4bba111d99c7b9648d8430e72/Images/UI/filter-close@2x.png -------------------------------------------------------------------------------- /Images/UI/filter-open.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmitric/DLCImagePickerController/e8ecbb1d9c937ee4bba111d99c7b9648d8430e72/Images/UI/filter-open.png -------------------------------------------------------------------------------- /Images/UI/filter-open@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmitric/DLCImagePickerController/e8ecbb1d9c937ee4bba111d99c7b9648d8430e72/Images/UI/filter-open@2x.png -------------------------------------------------------------------------------- /Images/UI/filter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmitric/DLCImagePickerController/e8ecbb1d9c937ee4bba111d99c7b9648d8430e72/Images/UI/filter.png -------------------------------------------------------------------------------- /Images/UI/filter@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmitric/DLCImagePickerController/e8ecbb1d9c937ee4bba111d99c7b9648d8430e72/Images/UI/filter@2x.png -------------------------------------------------------------------------------- /Images/UI/flash-auto.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmitric/DLCImagePickerController/e8ecbb1d9c937ee4bba111d99c7b9648d8430e72/Images/UI/flash-auto.png -------------------------------------------------------------------------------- /Images/UI/flash-auto@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmitric/DLCImagePickerController/e8ecbb1d9c937ee4bba111d99c7b9648d8430e72/Images/UI/flash-auto@2x.png -------------------------------------------------------------------------------- /Images/UI/flash-off.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmitric/DLCImagePickerController/e8ecbb1d9c937ee4bba111d99c7b9648d8430e72/Images/UI/flash-off.png -------------------------------------------------------------------------------- /Images/UI/flash-off@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmitric/DLCImagePickerController/e8ecbb1d9c937ee4bba111d99c7b9648d8430e72/Images/UI/flash-off@2x.png -------------------------------------------------------------------------------- /Images/UI/flash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmitric/DLCImagePickerController/e8ecbb1d9c937ee4bba111d99c7b9648d8430e72/Images/UI/flash.png -------------------------------------------------------------------------------- /Images/UI/flash@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmitric/DLCImagePickerController/e8ecbb1d9c937ee4bba111d99c7b9648d8430e72/Images/UI/flash@2x.png -------------------------------------------------------------------------------- /Images/UI/focus-crosshair.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmitric/DLCImagePickerController/e8ecbb1d9c937ee4bba111d99c7b9648d8430e72/Images/UI/focus-crosshair.png -------------------------------------------------------------------------------- /Images/UI/focus-crosshair@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmitric/DLCImagePickerController/e8ecbb1d9c937ee4bba111d99c7b9648d8430e72/Images/UI/focus-crosshair@2x.png -------------------------------------------------------------------------------- /Images/UI/front-camera.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmitric/DLCImagePickerController/e8ecbb1d9c937ee4bba111d99c7b9648d8430e72/Images/UI/front-camera.png -------------------------------------------------------------------------------- /Images/UI/front-camera@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmitric/DLCImagePickerController/e8ecbb1d9c937ee4bba111d99c7b9648d8430e72/Images/UI/front-camera@2x.png -------------------------------------------------------------------------------- /Images/UI/library.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmitric/DLCImagePickerController/e8ecbb1d9c937ee4bba111d99c7b9648d8430e72/Images/UI/library.png -------------------------------------------------------------------------------- /Images/UI/library@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmitric/DLCImagePickerController/e8ecbb1d9c937ee4bba111d99c7b9648d8430e72/Images/UI/library@2x.png -------------------------------------------------------------------------------- /Images/UI/micro_carbon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmitric/DLCImagePickerController/e8ecbb1d9c937ee4bba111d99c7b9648d8430e72/Images/UI/micro_carbon.png -------------------------------------------------------------------------------- /Images/UI/micro_carbon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmitric/DLCImagePickerController/e8ecbb1d9c937ee4bba111d99c7b9648d8430e72/Images/UI/micro_carbon@2x.png -------------------------------------------------------------------------------- /Images/UI/photo_bar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmitric/DLCImagePickerController/e8ecbb1d9c937ee4bba111d99c7b9648d8430e72/Images/UI/photo_bar.png -------------------------------------------------------------------------------- /Images/UI/photo_bar@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmitric/DLCImagePickerController/e8ecbb1d9c937ee4bba111d99c7b9648d8430e72/Images/UI/photo_bar@2x.png -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2012, Dmitri Cherniak. 2 | All rights reserved. 3 | 4 | Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 5 | 6 | Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 7 | Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 8 | Neither the name of this framework nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. 9 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 10 | 11 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | About 2 | ----- 3 | 4 | DLCImagePickerController is a fast, beautiful and fun way to filter and capture your photos with OpenGL and your iPhone. 5 | The majority of the praise should be directed towards BradLarson for his [GPUImage](https://github.com/BradLarson/GPUImage) library. 6 | 7 | To see the camera in action [download Backspaces](http://backspac.es/download). 8 | 9 | Setup 10 | ------ 11 | 12 | When you clone the repo, you'll need to download GPUImage assets: 13 | 14 | ``` 15 | git submodule init 16 | git submodule update 17 | ``` 18 | 19 | Features 20 | --------- 21 | 22 | ### Live Filters 23 | Here are some examples of the filters that are included. These are being applied to the live camera stream. 24 | 25 | ![Filters](http://i.imgur.com/rJx1l.png) 26 | 27 | or check out on outdoor shoot with the old UI [here](http://i.imgur.com/bHNAN.png) 28 | 29 | ### Radial Blur 30 | 31 | It also has a radial blur, that you can move and pinch to your liking on the live view or captured image 32 | 33 | ![Radial blur on and off](http://i.imgur.com/RhCcV.png) 34 | 35 | ### Front Facing Camera 36 | 37 | There is a front facing camera 38 | 39 | ![Front facing camera](http://i.imgur.com/CqOra.png) 40 | 41 | ### Apply filters/blur after capture or retake photo 42 | 43 | After you capture the image, you can apply new filters and toggle/move/resize the blur as you please or decide to retake it 44 | 45 | ![Filters](http://i.imgur.com/TtMMm.png) 46 | 47 | ### Use an image from your camera roll 48 | 49 | Import a picture from your camera roll and apply a filter/blur to it 50 | 51 | ![Loaded from camera roll](http://i.imgur.com/6f2fQ.png) 52 | 53 | Example output 54 | --------------- 55 | 56 | These images were produced using the sample program included in this repo 57 | 58 | [Soft filter in nice daylight](http://i.imgur.com/0OncO.jpg) 59 | 60 | [High contrast black and white with radial blur](http://i.imgur.com/6B4iz.jpg) 61 | 62 | Contact 63 | -------- 64 | **Dmitri Cherniak** 65 | 66 | + http://twitter.com/dmitric 67 | + http://github.com/dmitric 68 | 69 | **Wylie Conlon** 70 | 71 | + http://twitter.com/wylieconlon 72 | + http://github.com/wylieconlon 73 | 74 | 75 | -------------------------------------------------------------------------------- /Resources/DLCImagePicker.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 1552 5 | 12E55 6 | 3084 7 | 1187.39 8 | 626.00 9 | 10 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 11 | 2083 12 | 13 | 14 | IBProxyObject 15 | IBUIButton 16 | IBUIImageView 17 | IBUIPanGestureRecognizer 18 | IBUIPinchGestureRecognizer 19 | IBUIScrollView 20 | IBUITapGestureRecognizer 21 | IBUIView 22 | 23 | 24 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 25 | 26 | 27 | PluginDependencyRecalculationVersion 28 | 29 | 30 | 31 | 32 | IBFilesOwner 33 | IBCocoaTouchFramework 34 | 35 | 36 | IBFirstResponder 37 | IBCocoaTouchFramework 38 | 39 | 40 | 41 | 274 42 | 43 | 44 | 45 | 301 46 | {{0, 78}, {320, 320}} 47 | 48 | 49 | 50 | _NS:9 51 | 52 | 3 53 | MAA 54 | 55 | 2 56 | 57 | IBCocoaTouchFramework 58 | 59 | 60 | 61 | 266 62 | {{-12, 435}, {344, 75}} 63 | 64 | 65 | 66 | _NS:9 67 | NO 68 | IBCocoaTouchFramework 69 | 70 | NSImage 71 | dock_bg.png 72 | 73 | 74 | 75 | 76 | 266 77 | {{0, 437}, {320, 75}} 78 | 79 | 80 | 81 | _NS:9 82 | YES 83 | YES 84 | IBCocoaTouchFramework 85 | NO 86 | NO 87 | NO 88 | 89 | 90 | 91 | 266 92 | 93 | 94 | 95 | 292 96 | {{115, 3}, {90, 37}} 97 | 98 | 99 | 100 | _NS:9 101 | NO 102 | IBCocoaTouchFramework 103 | 0 104 | 0 105 | 106 | 3 107 | MQA 108 | 109 | 110 | 1 111 | MC4xMzc1NzQxMzMyIDAuMTM2ODMyODAxMSAwLjE0MjIyMTcxNTMAA 112 | 113 | 114 | 3 115 | MC41AA 116 | 117 | 118 | NSImage 119 | camera-icon.png 120 | 121 | 122 | NSImage 123 | camera-button.png 124 | 125 | 126 | 2 127 | 2 128 | 129 | 130 | Helvetica-Bold 131 | 18 132 | 16 133 | 134 | 135 | 136 | 137 | 292 138 | {{263, 3}, {65, 37}} 139 | 140 | 141 | 142 | _NS:9 143 | NO 144 | IBCocoaTouchFramework 145 | 0 146 | 0 147 | YES 148 | 149 | 150 | 1 151 | MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA 152 | 153 | 154 | 155 | NSImage 156 | filter-close.png 157 | 158 | 159 | NSImage 160 | filter-open.png 161 | 162 | 163 | 2 164 | 15 165 | 166 | 167 | Helvetica-Bold 168 | 15 169 | 16 170 | 171 | 172 | 173 | 174 | 292 175 | {{-8, 3}, {65, 37}} 176 | 177 | 178 | 179 | _NS:9 180 | NO 181 | IBCocoaTouchFramework 182 | 0 183 | 0 184 | YES 185 | 186 | 187 | 1 188 | MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA 189 | 190 | 191 | 192 | 193 | NSImage 194 | library.png 195 | 196 | 197 | 198 | 199 | 200 | 201 | -2147483356 202 | {{11, 7}, {71, 29}} 203 | 204 | 205 | 206 | _NS:9 207 | NO 208 | IBCocoaTouchFramework 209 | 0 210 | 0 211 | Retake 212 | 213 | 214 | 1 215 | MC4xMzcyNTQ5MDIgMC4xMzcyNTQ5MDIgMC4xNDUwOTgwMzkyAA 216 | 217 | 218 | 219 | 220 | 2 221 | 14 222 | 223 | 224 | Helvetica-Bold 225 | 14 226 | 16 227 | 228 | 229 | 230 | {{0, 437}, {320, 44}} 231 | 232 | 233 | 234 | _NS:9 235 | 236 | 3 237 | MC42NjY2NjY2NjY3AA 238 | 239 | IBCocoaTouchFramework 240 | 241 | 242 | 243 | 290 244 | {320, 44} 245 | 246 | 247 | 248 | _NS:9 249 | 250 | 3 251 | MC4zMzMzMzMzMzMzAA 252 | 253 | IBCocoaTouchFramework 254 | 255 | 256 | 257 | 292 258 | {{277, 3}, {40, 37}} 259 | 260 | 261 | 262 | _NS:9 263 | NO 264 | IBCocoaTouchFramework 265 | 0 266 | 0 267 | YES 268 | 269 | 270 | 1 271 | MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA 272 | 273 | 274 | 275 | NSImage 276 | close.png 277 | 278 | 279 | 280 | 281 | 282 | 283 | 292 284 | {{136, 3}, {50, 41}} 285 | 286 | 287 | 288 | _NS:9 289 | NO 290 | IBCocoaTouchFramework 291 | 0 292 | 0 293 | YES 294 | 295 | 296 | 1 297 | MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA 298 | 299 | 300 | 301 | NSImage 302 | front-camera.png 303 | 304 | 305 | 306 | 307 | 308 | 309 | 292 310 | {{213, 0}, {44, 44}} 311 | 312 | 313 | 314 | _NS:9 315 | NO 316 | IBCocoaTouchFramework 317 | 0 318 | 0 319 | YES 320 | 321 | 322 | 1 323 | MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA 324 | 325 | 326 | 327 | NSImage 328 | blur-on.png 329 | 330 | 331 | NSImage 332 | blur.png 333 | 334 | 335 | 336 | 337 | 338 | 339 | 292 340 | {{57, 0}, {44, 44}} 341 | 342 | 343 | 344 | _NS:9 345 | NO 346 | IBCocoaTouchFramework 347 | 0 348 | 0 349 | YES 350 | 351 | 352 | 1 353 | MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA 354 | 355 | 356 | 357 | NSImage 358 | flash.png 359 | 360 | 361 | NSImage 362 | flash-off.png 363 | 364 | 365 | 366 | 367 | 368 | {320, 480} 369 | 370 | 371 | 372 | _NS:9 373 | 374 | IBCocoaTouchFramework 375 | 376 | 377 | 378 | 379 | 380 | 381 | 382 | 383 | 384 | filtersToggleButton 385 | 386 | 387 | 388 | 64 389 | 390 | 391 | 392 | blurToggleButton 393 | 394 | 395 | 396 | 61 397 | 398 | 399 | 400 | photoCaptureButton 401 | 402 | 403 | 404 | 45 405 | 406 | 407 | 408 | filtersBackgroundImageView 409 | 410 | 411 | 412 | 72 413 | 414 | 415 | 416 | topBar 417 | 418 | 419 | 420 | 74 421 | 422 | 423 | 424 | flashToggleButton 425 | 426 | 427 | 428 | 78 429 | 430 | 431 | 432 | filterScrollView 433 | 434 | 435 | 436 | 69 437 | 438 | 439 | 440 | cameraToggleButton 441 | 442 | 443 | 444 | 48 445 | 446 | 447 | 448 | photoBar 449 | 450 | 451 | 452 | 73 453 | 454 | 455 | 456 | view 457 | 458 | 459 | 460 | 42 461 | 462 | 463 | 464 | imageView 465 | 466 | 467 | 468 | 43 469 | 470 | 471 | 472 | retakeButton 473 | 474 | 475 | 476 | 81 477 | 478 | 479 | 480 | cancelButton 481 | 482 | 483 | 484 | 44 485 | 486 | 487 | 488 | libraryToggleButton 489 | 490 | 491 | 492 | 88 493 | 494 | 495 | 496 | gestureRecognizers 497 | 498 | 499 | NSArray 500 | YES 501 | 502 | 52 503 | 504 | 505 | 506 | gestureRecognizers 507 | 508 | 509 | NSArray 510 | YES 511 | 512 | 66 513 | 514 | 515 | 516 | gestureRecognizers 517 | 518 | 519 | NSArray 520 | YES 521 | 522 | 90 523 | 524 | 525 | 526 | takePhoto: 527 | 528 | 529 | 7 530 | 531 | 46 532 | 533 | 534 | 535 | toggleFilters: 536 | 537 | 538 | 7 539 | 540 | 68 541 | 542 | 543 | 544 | cancel: 545 | 546 | 547 | 7 548 | 549 | 47 550 | 551 | 552 | 553 | switchCamera 554 | 555 | 556 | 7 557 | 558 | 49 559 | 560 | 561 | 562 | toggleBlur: 563 | 564 | 565 | 7 566 | 567 | 62 568 | 569 | 570 | 571 | handlePinch: 572 | 573 | 574 | 575 | 63 576 | 577 | 578 | 579 | handlePan: 580 | 581 | 582 | 583 | 67 584 | 585 | 586 | 587 | toggleFlash: 588 | 589 | 590 | 7 591 | 592 | 79 593 | 594 | 595 | 596 | retakePhoto: 597 | 598 | 599 | 7 600 | 601 | 82 602 | 603 | 604 | 605 | switchToLibrary: 606 | 607 | 608 | 7 609 | 610 | 87 611 | 612 | 613 | 614 | handleTapToFocus: 615 | 616 | 617 | 618 | 91 619 | 620 | 621 | 622 | 623 | 624 | 0 625 | 626 | 627 | 628 | 629 | 630 | -1 631 | 632 | 633 | File's Owner 634 | 635 | 636 | -2 637 | 638 | 639 | 640 | 641 | 51 642 | 643 | 644 | 645 | 646 | 65 647 | 648 | 649 | 650 | 651 | 4 652 | 653 | 654 | 655 | 656 | 657 | 658 | 659 | 660 | 661 | 662 | 663 | 664 | 665 | 666 | 667 | 37 668 | 669 | 670 | 671 | 672 | 77 673 | 674 | 675 | 676 | 677 | 50 678 | 679 | 680 | 681 | 682 | 34 683 | 684 | 685 | 686 | 687 | 36 688 | 689 | 690 | 691 | 692 | 71 693 | 694 | 695 | 696 | 697 | 7 698 | 699 | 700 | 701 | 702 | 31 703 | 704 | 705 | 706 | 707 | 708 | 709 | 710 | 711 | 712 | 713 | 16 714 | 715 | 716 | 717 | 718 | 83 719 | 720 | 721 | 722 | 723 | 80 724 | 725 | 726 | 727 | 728 | 32 729 | 730 | 731 | 732 | 733 | 35 734 | 735 | 736 | 737 | 738 | 89 739 | 740 | 741 | 742 | 743 | 744 | 745 | DLCImagePickerController 746 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 747 | UIResponder 748 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 749 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 750 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 751 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 752 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 753 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 754 | 755 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 756 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 757 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 758 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 759 | 760 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 761 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 762 | GPUImageView 763 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 764 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 765 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 766 | 767 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 768 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 769 | 770 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 771 | 772 | 773 | 774 | 775 | 776 | 91 777 | 778 | 779 | 780 | 781 | DLCImagePickerController 782 | UIViewController 783 | 784 | id 785 | UIGestureRecognizer 786 | UIPinchGestureRecognizer 787 | UITapGestureRecognizer 788 | UIButton 789 | id 790 | id 791 | UIButton 792 | UIButton 793 | UIButton 794 | 795 | 796 | 797 | cancel: 798 | id 799 | 800 | 801 | handlePan: 802 | UIGestureRecognizer 803 | 804 | 805 | handlePinch: 806 | UIPinchGestureRecognizer 807 | 808 | 809 | handleTapToFocus: 810 | UITapGestureRecognizer 811 | 812 | 813 | retakePhoto: 814 | UIButton 815 | 816 | 817 | switchToLibrary: 818 | id 819 | 820 | 821 | takePhoto: 822 | id 823 | 824 | 825 | toggleBlur: 826 | UIButton 827 | 828 | 829 | toggleFilters: 830 | UIButton 831 | 832 | 833 | toggleFlash: 834 | UIButton 835 | 836 | 837 | 838 | UIButton 839 | UIButton 840 | UIButton 841 | UIScrollView 842 | UIImageView 843 | UIButton 844 | UIButton 845 | GPUImageView 846 | UIButton 847 | UIView 848 | UIButton 849 | UIButton 850 | UIView 851 | 852 | 853 | 854 | blurToggleButton 855 | UIButton 856 | 857 | 858 | cameraToggleButton 859 | UIButton 860 | 861 | 862 | cancelButton 863 | UIButton 864 | 865 | 866 | filterScrollView 867 | UIScrollView 868 | 869 | 870 | filtersBackgroundImageView 871 | UIImageView 872 | 873 | 874 | filtersToggleButton 875 | UIButton 876 | 877 | 878 | flashToggleButton 879 | UIButton 880 | 881 | 882 | imageView 883 | GPUImageView 884 | 885 | 886 | libraryToggleButton 887 | UIButton 888 | 889 | 890 | photoBar 891 | UIView 892 | 893 | 894 | photoCaptureButton 895 | UIButton 896 | 897 | 898 | retakeButton 899 | UIButton 900 | 901 | 902 | topBar 903 | UIView 904 | 905 | 906 | 907 | IBProjectSource 908 | ./Classes/DLCImagePickerController.h 909 | 910 | 911 | 912 | GPUImageView 913 | UIView 914 | 915 | IBProjectSource 916 | ./Classes/GPUImageView.h 917 | 918 | 919 | 920 | 921 | 0 922 | IBCocoaTouchFramework 923 | YES 924 | 3 925 | 926 | {15, 22} 927 | {16, 23} 928 | {101, 41} 929 | {26, 21} 930 | {22, 21} 931 | {320, 75} 932 | {29, 28} 933 | {28, 28} 934 | {22, 26} 935 | {22, 26} 936 | {48, 24} 937 | {28, 28} 938 | 939 | 2083 940 | 941 | 942 | -------------------------------------------------------------------------------- /Resources/Filters/02.acv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmitric/DLCImagePickerController/e8ecbb1d9c937ee4bba111d99c7b9648d8430e72/Resources/Filters/02.acv -------------------------------------------------------------------------------- /Resources/Filters/06.acv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmitric/DLCImagePickerController/e8ecbb1d9c937ee4bba111d99c7b9648d8430e72/Resources/Filters/06.acv -------------------------------------------------------------------------------- /Resources/Filters/17.acv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmitric/DLCImagePickerController/e8ecbb1d9c937ee4bba111d99c7b9648d8430e72/Resources/Filters/17.acv -------------------------------------------------------------------------------- /Resources/Filters/aqua.acv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmitric/DLCImagePickerController/e8ecbb1d9c937ee4bba111d99c7b9648d8430e72/Resources/Filters/aqua.acv -------------------------------------------------------------------------------- /Resources/Filters/crossprocess.acv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmitric/DLCImagePickerController/e8ecbb1d9c937ee4bba111d99c7b9648d8430e72/Resources/Filters/crossprocess.acv -------------------------------------------------------------------------------- /Resources/Filters/purple-green.acv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmitric/DLCImagePickerController/e8ecbb1d9c937ee4bba111d99c7b9648d8430e72/Resources/Filters/purple-green.acv -------------------------------------------------------------------------------- /Resources/Filters/yellow-red.acv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmitric/DLCImagePickerController/e8ecbb1d9c937ee4bba111d99c7b9648d8430e72/Resources/Filters/yellow-red.acv --------------------------------------------------------------------------------